File indexing completed on 2024-09-20 05:11:35 UTC
view on githubraw file Latest commit e6e223b2 on 2024-09-19 22:01:15 UTC
9f3ad1881a Patr*0001 #include "PACKAGES_CONFIG.h"
279dc77b07 Patr*0002 #include "OPENAD_OPTIONS.h"
9f3ad1881a Patr*0003
b6f3d01b24 Jean*0004 subroutine template()
0005 use OAD_cp
0006 use OAD_tape
0007 use OAD_rev
0008 use revolve
0009
0010
0011 use SIZE_mod
0012 use EEPARAMS_mod
0013 use PARAMS_mod
0014 use BAR2_mod
0015 use BARRIER_mod
9f3ad1881a Patr*0016 #ifdef ALLOW_CD_CODE
b6f3d01b24 Jean*0017 use CD_CODE_VARS_mod
9f3ad1881a Patr*0018 #endif
b6f3d01b24 Jean*0019 use CG2D_mod
0020 use CG3D_mod
0021 use DYNVARS_mod
0022 use EESUPPORT_mod
0023 use EOS_mod
0024 use EXCH_mod
0025 use FC_NAMEMANGLE_mod
0026 use FFIELDS_mod
334c9de798 Jean*0027 #ifdef ALLOW_GENERIC_ADVDIFF
b6f3d01b24 Jean*0028 use GAD_mod
334c9de798 Jean*0029 #endif
b6f3d01b24 Jean*0030 use GLOBAL_MAX_mod
0031 use GLOBAL_SUM_mod
e22615ff1f Patr*0032 #ifdef ALLOW_GGL90
0033 use GGL90_mod
0034 #endif
9f3ad1881a Patr*0035 #ifdef ALLOW_GMREDI
b6f3d01b24 Jean*0036 use GMREDI_mod
0037 use GMREDI_TAVE_mod
9f3ad1881a Patr*0038 #endif
b6f3d01b24 Jean*0039 use GRID_mod
71108ddfe4 Patr*0040 #ifdef ALLOW_KPP
0041 use KPP_mod
0042 use KPP_PARAMS_mod
0043 use KPP_TAVE_mod
0044 #endif
334c9de798 Jean*0045 #ifdef ALLOW_MOM_COMMON
9f3ad1881a Patr*0046 use MOM_VISC_mod
334c9de798 Jean*0047 #endif
b6f3d01b24 Jean*0048 use MPI_INFO_mod
9f3ad1881a Patr*0049 #ifdef ALLOW_SHAP_FILT
0050 use SHAP_FILT_mod
0051 #endif
cdf60b9aad Patr*0052 #ifdef ALLOW_STREAMICE
0053 use STREAMICE_mod
0054 use STREAMICE_ADV_mod
0055 use STREAMICE_BDRY_mod
0056 use STREAMICE_CG_mod
0057 #endif
b6f3d01b24 Jean*0058 use SURFACE_mod
0059 use cost_mod
0060 use g_cost_mod
4d72283393 Mart*0061 use CTRL_mod
edcd27be69 Mart*0062 use CTRL_DUMMY_mod
65754df434 Mart*0063 use OPTIMCYCLE_mod
444da61630 Mart*0064 use GRDCHK_mod
7c50f07931 Mart*0065
b6f3d01b24 Jean*0066
0067 LOGICAL :: initialized=.FALSE.
0068 TYPE(rvAction),save :: theAction
9674a72dd0 Jean*0069 CHARACTER(80) :: errorMsg
b6f3d01b24 Jean*0070 integer, save :: jointCPCount
0071 integer, save :: currIter
0072
0073 integer :: cp_loop_variable_1,cp_loop_variable_2,
0074 + cp_loop_variable_3,cp_loop_variable_4,cp_loop_variable_5
0075
0076 type(modeType) :: our_orig_mode
0077
0078 integer iaddr
0079 external iaddr
0080
0081 #ifdef OAD_DEBUG_JOINT
0082 character*(80):: indentation='
0083 + '
0084 our_indent=our_indent+1
0085
7c50f07931 Mart*0086 write(standardmessageunit, '(A,A,A)', ADVANCE='NO')
b6f3d01b24 Jean*0087 +'OAD:',indentation(1:our_indent), 'enter __SRNAME__:'
0088 call oad_dump_revmod(); call oad_dump_tapestats()
7c50f07931 Mart*0089 write(standardmessageunit,*)
b6f3d01b24 Jean*0090 #endif
0091
0092 nIter0 = NINT( (startTime-baseTime)/deltaTClock )
7c50f07931 Mart*0093 if (our_rev_mode%arg_store) then
75c5b64bda Jean*0094 call cp_write_open()
b6f3d01b24 Jean*0095 #ifdef OAD_DEBUG_JOINT
7c50f07931 Mart*0096 write(standardmessageunit,'(A,A,A)')
0097 +'OAD:',indentation(1:our_indent),
b6f3d01b24 Jean*0098 +' __SRNAME__: entering arg store'
0099 #endif
0100
0101 call cp_close()
7c50f07931 Mart*0102 end if
b6f3d01b24 Jean*0103 if (our_rev_mode%arg_restore) then
0104 #ifdef OAD_DEBUG_JOINT
7c50f07931 Mart*0105 write(standardmessageunit,'(A,A,A)')
0106 +'OAD:',indentation(1:our_indent),
b6f3d01b24 Jean*0107 +' __SRNAME__: entering arg restore'
0108 #endif
75c5b64bda Jean*0109 call cp_read_open()
b6f3d01b24 Jean*0110
75c5b64bda Jean*0111 call cp_close()
b6f3d01b24 Jean*0112 end if
0113 if (our_rev_mode%plain) then
0114 #ifdef OAD_DEBUG_JOINT
7c50f07931 Mart*0115 write(standardmessageunit,'(A,A,A)')
0116 +'OAD:',indentation(1:our_indent),
b6f3d01b24 Jean*0117 +' __SRNAME__: run plain, down plain'
0118 #endif
279dc77b07 Patr*0119 #ifdef ALLOW_OPENAD_DIVA
0120 DO iloop1 = 1, nTimeSteps
0121 PROD = (ILOOP1 + NTIMESTEPS_L2 *(ILOOP +(-1)))
0122 print *, 'DIVA Revolve Plain PROD = ', PROD
0123 CALL OpenAD_forward_step( PROD, mytime, myiter, mythid )
0124 enddo
7c50f07931 Mart*0125 #else
b6f3d01b24 Jean*0126 DO iloop = 1, nTimeSteps
0127 CALL OpenAD_forward_step( iloop, mytime, myiter, mythid )
0128 enddo
279dc77b07 Patr*0129 #endif
b6f3d01b24 Jean*0130 end if
0131 if (our_rev_mode%tape) then
0132 #ifdef OAD_DEBUG_JOINT
7c50f07931 Mart*0133 write(standardmessageunit,'(A,A,A)')
0134 +'OAD:',indentation(1:our_indent),
b6f3d01b24 Jean*0135 +' __SRNAME__: run tape, down revolve until first U turn'
0136 #endif
0137 currIter=0
0138 jointCPcount=cp_fNumber()
0139 initialized=rvInit(nTimeSteps,120,
0140 + errorMsg,theAction)
0141 IF (.NOT.initialized) WRITE(*,'(A,A)') 'Error: ', errorMsg
0142 do while (theAction%actionFlag/=rvDone)
0143 theAction=rvNextAction()
7c50f07931 Mart*0144 select case (theAction%actionFlag)
b6f3d01b24 Jean*0145 case (rvStore)
0146 call cp_write_open(theAction%cpNum+jointCPCount)
0147
0148 call cp_close
0149 case (rvForward)
0150 call OAD_revPlain
0151 do currIter=currIter,theAction%iteration-1
7c50f07931 Mart*0152 #ifdef ALLOW_OPENAD_DIVA
279dc77b07 Patr*0153 PROD = (currIter+1 + NTIMESTEPS_L2 *(ILOOP +(-1)))
0154 print *, 'DIVA Revolve Tape rvForward PROD = ', PROD
7c50f07931 Mart*0155 CALL OpenAD_forward_step( PROD, mytime,
b6f3d01b24 Jean*0156 +myiter, mythid )
279dc77b07 Patr*0157 #else
0158 CALL OpenAD_forward_step( currIter+1, mytime,
7c50f07931 Mart*0159 +myiter, mythid )
279dc77b07 Patr*0160 #endif
b6f3d01b24 Jean*0161 end do
0162 call OAD_revTape
0163 case (rvFirstUTurn)
7c50f07931 Mart*0164 #ifdef ALLOW_OPENAD_DIVA
279dc77b07 Patr*0165 PROD = (currIter+1 + NTIMESTEPS_L2 *(ILOOP +(-1)))
0166 print *, 'DIVA Revolve Tape rvFirstUTurn PROD = ', PROD
7c50f07931 Mart*0167 CALL OpenAD_forward_step( PROD, mytime, myiter,
279dc77b07 Patr*0168 +mythid )
0169 #else
0170 CALL OpenAD_forward_step( currIter+1, mytime, myiter,
b6f3d01b24 Jean*0171 +mythid )
279dc77b07 Patr*0172 #endif
b6f3d01b24 Jean*0173
7c50f07931 Mart*0174 exit
0175 end select
b6f3d01b24 Jean*0176 end do
7c50f07931 Mart*0177 end if
b6f3d01b24 Jean*0178 if (our_rev_mode%adjoint) then
0179 IF (.NOT.initialized) WRITE(*,'(A)') 'Error: not initialized'
0180 do while (theAction%actionFlag/=rvDone)
7c50f07931 Mart*0181 select case (theAction%actionFlag)
b6f3d01b24 Jean*0182 case (rvFirstUTurn)
0183
7c50f07931 Mart*0184 #ifdef ALLOW_OPENAD_DIVA
0185 PROD = (currIter+1 + NTIMESTEPS_L2 *(ILOOP +(-1)))
279dc77b07 Patr*0186 print *, 'DIVA Revolve Adjoint rvFirstUTurn PROD = ', PROD
7c50f07931 Mart*0187 CALL OpenAD_forward_step( PROD, mytime, myiter,
279dc77b07 Patr*0188 +mythid )
0189 #else
7c50f07931 Mart*0190 CALL OpenAD_forward_step( currIter+1, mytime, myiter,
b6f3d01b24 Jean*0191 +mythid )
279dc77b07 Patr*0192 #endif
b6f3d01b24 Jean*0193 case (rvStore)
0194 call cp_write_open(theAction%cpNum+jointCPCount)
0195
0196 call cp_close
0197 case (rvRestore)
0198 call cp_read_open(theAction%cpNum+jointCPCount)
0199
0200 currIter=theAction%iteration
0201 call cp_close
0202 case (rvForward)
0203 call OAD_revPlain
0204 do currIter=currIter,theAction%iteration-1
279dc77b07 Patr*0205 #ifdef ALLOW_OPENAD_DIVA
0206 PROD = (currIter+1 + NTIMESTEPS_L2 *(ILOOP +(-1)))
75c5b64bda Jean*0207 print *, 'DIVA Revolve Adjoint rvForward PROD = ', PROD
279dc77b07 Patr*0208 CALL OpenAD_forward_step( PROD, mytime, myiter,
0209 + mythid )
0210 #else
b6f3d01b24 Jean*0211 CALL OpenAD_forward_step( currIter+1, mytime, myiter,
0212 + mythid )
279dc77b07 Patr*0213 #endif
b6f3d01b24 Jean*0214 end do
0215 call OAD_revAdjoint
0216 case (rvUTurn)
279dc77b07 Patr*0217 #ifdef ALLOW_OPENAD_DIVA
7c50f07931 Mart*0218 PROD = (currIter+1 + NTIMESTEPS_L2 *(ILOOP +(-1)))
279dc77b07 Patr*0219 #endif
b6f3d01b24 Jean*0220 call OAD_revTape
279dc77b07 Patr*0221 #ifdef ALLOW_OPENAD_DIVA
75c5b64bda Jean*0222 print *, 'DIVA Revolve Adjoint rvUTurn tp PROD = ', PROD
7c50f07931 Mart*0223 CALL OpenAD_forward_step( PROD, mytime, myiter,
279dc77b07 Patr*0224 +mythid )
0225 #else
0226 CALL OpenAD_forward_step( currIter+1, mytime, myiter,
b6f3d01b24 Jean*0227 +mythid )
279dc77b07 Patr*0228 #endif
b6f3d01b24 Jean*0229 call OAD_revAdjoint
279dc77b07 Patr*0230 #ifdef ALLOW_OPENAD_DIVA
75c5b64bda Jean*0231 print *, 'DIVA Revolve Adjoint rvUTurn ad PROD = ', PROD
7c50f07931 Mart*0232 CALL OpenAD_forward_step( PROD, mytime, myiter,
b6f3d01b24 Jean*0233 +mythid )
279dc77b07 Patr*0234 #else
0235 CALL OpenAD_forward_step( currIter+1, mytime, myiter,
0236 +mythid )
0237 #endif
7c50f07931 Mart*0238 end select
b6f3d01b24 Jean*0239 theAction=rvNextAction()
0240 end do
7c50f07931 Mart*0241 end if
b6f3d01b24 Jean*0242
0243 #ifdef OAD_DEBUG_JOINT
7c50f07931 Mart*0244 write(standardmessageunit,'(A,A,A)', ADVANCE='NO')
b6f3d01b24 Jean*0245 +'OAD:',indentation(1:our_indent), 'leave __SRNAME__:'
0246 call oad_dump_revmod(); call oad_dump_tapestats()
7c50f07931 Mart*0247 write(standardmessageunit,*)
b6f3d01b24 Jean*0248
0249 our_indent=our_indent-1
0250 #endif
0251
0252 end subroutine template