/[MITgcm]/MITgcm/model/src/main_do_loop.F
ViewVC logotype

Contents of /MITgcm/model/src/main_do_loop.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.8 - (show annotations) (download)
Sat Mar 30 13:25:46 2013 UTC (11 years, 2 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint64f
Changes since 1.7: +31 -32 lines
Revert to previous version for the_main_loop.F
Rearrange includes in main_do_loop.F
works with both isomip and tutorial_tracer_adjsens OpenAD test
(likely related to order of ctrl headers vs. other package headers)

1 C $Header: /u/gcmpack/MITgcm/model/src/main_do_loop.F,v 1.7 2013/03/29 23:08:55 heimbach Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6 #ifdef ALLOW_OBCS
7 # include "OBCS_OPTIONS.h"
8 #endif
9 #ifdef ALLOW_SEAICE
10 # include "SEAICE_OPTIONS.h"
11 #endif
12 #ifdef ALLOW_GENERIC_ADVDIFF
13 # include "GAD_OPTIONS.h"
14 #endif
15 #ifdef ALLOW_GMREDI
16 # include "GMREDI_OPTIONS.h"
17 #endif
18 #ifdef ALLOW_STREAMICE
19 # include "STREAMICE_OPTIONS.h"
20 #endif
21 #ifdef ALLOW_GGL90
22 # include "GGL90_OPTIONS.h"
23 #endif
24 #ifdef ALLOW_EXF
25 # include "EXF_OPTIONS.h"
26 #endif
27 #ifdef ALLOW_CTRL
28 # include "CTRL_OPTIONS.h"
29 #endif
30
31 CBOP
32 C !ROUTINE: MAIN_DO_LOOP
33 C !INTERFACE:
34 SUBROUTINE MAIN_DO_LOOP( myTime, myIter, myThid )
35
36 C !DESCRIPTION: \bv
37 C *================================================================*
38 C | SUBROUTINE the_loop_body
39 C | o Run the ocean model and evaluate the specified cost function.
40 C *================================================================*
41 C |
42 C | MAIN_DO_LOOP is the toplevel routine for the Tangent Linear and
43 C | Adjoint Model Compiler (TAMC).
44 C | For this purpose the initialization
45 C | of the model was split into two parts. Those parameters that do
46 C | not depend on a specific model run are set in INITIALISE_FIXED,
47 C | whereas those that do depend on the specific realization are
48 C | initialized in INITIALISE_VARIA.
49 C | This routine is to be used in conjuction with the MITgcmuv
50 C | checkpoint 37.
51 C *================================================================*
52 C \ev
53
54 C !USES:
55 IMPLICIT NONE
56 C == Global variables ==
57 #include "SIZE.h"
58 #include "EEPARAMS.h"
59 #include "PARAMS.h"
60
61 c**************************************
62 #ifdef ALLOW_AUTODIFF
63 # ifndef ALLOW_AUTODIFF_OPENAD
64
65 c These includes are needed for
66 c AD-checkpointing.
67 c They provide the fields to be stored.
68
69 # include "AUTODIFF_MYFIELDS.h"
70 # include "GRID.h"
71 # include "DYNVARS.h"
72 # include "SURFACE.h"
73 # include "FFIELDS.h"
74 # include "EOS.h"
75 # include "AUTODIFF.h"
76
77 # ifdef ALLOW_GENERIC_ADVDIFF
78 # include "GAD.h"
79 # include "GAD_SOM_VARS.h"
80 # endif
81 # ifdef ALLOW_MOM_FLUXFORM
82 # include "MOM_FLUXFORM.h"
83 # endif
84 # ifdef ALLOW_CD_CODE
85 # include "CD_CODE_VARS.h"
86 # endif
87 # ifdef ALLOW_OBCS
88 # include "OBCS_PARAMS.h"
89 # include "OBCS_FIELDS.h"
90 # include "OBCS_SEAICE.h"
91 # ifdef ALLOW_PTRACERS
92 # include "OBCS_PTRACERS.h"
93 # endif
94 # endif
95 # ifdef ALLOW_EXF
96 # include "EXF_FIELDS.h"
97 # ifdef ALLOW_BULKFORMULAE
98 # include "EXF_CONSTANTS.h"
99 # endif
100 # endif /* ALLOW_EXF */
101 # ifdef ALLOW_SEAICE
102 # include "SEAICE_SIZE.h"
103 # include "SEAICE.h"
104 # include "SEAICE_PARAMS.h"
105 # include "SEAICE_COST.h"
106 # include "SEAICE_TRACER.h"
107 # endif
108 # ifdef ALLOW_SALT_PLUME
109 # include "SALT_PLUME.h"
110 # endif
111 # ifdef ALLOW_THSICE
112 # include "THSICE_SIZE.h"
113 # include "THSICE_VARS.h"
114 # endif
115 # ifdef ALLOW_EBM
116 # include "EBM.h"
117 # endif
118 # ifdef ALLOW_RBCS
119 # include "RBCS_SIZE.h"
120 # include "RBCS_FIELDS.h"
121 # endif
122 # ifdef ALLOW_OFFLINE
123 # include "OFFLINE.h"
124 # endif
125 # ifdef ALLOW_CG2D_NSA
126 # include "CG2D.h"
127 # endif
128 # ifdef ALLOW_DIVIDED_ADJOINT_MPI
129 # include "mpif.h"
130 # endif
131
132 # include "tamc.h"
133
134 # ifdef ALLOW_GGL90
135 # include "GGL90.h"
136 # endif
137 # ifdef ALLOW_PROFILES
138 # include "profiles.h"
139 # endif
140
141 # ifdef ALLOW_ECCO_EVOLUTION
142 # ifdef ALLOW_ECCO
143 # include "ecco_cost.h"
144 # endif
145 # endif
146
147 # endif /* undef ALLOW_AUTODIFF_OPENAD */
148
149 # ifdef ALLOW_CTRL
150 # include "CTRL_SIZE.h"
151 # include "ctrl.h"
152 # include "ctrl_dummy.h"
153 # include "CTRL_GENARR.h"
154 # endif
155 # ifdef ALLOW_COST
156 # include "cost.h"
157 # endif
158
159 # ifdef ALLOW_PTRACERS
160 # include "PTRACERS_SIZE.h"
161 # include "PTRACERS_FIELDS.h"
162 # include "PTRACERS_START.h"
163 # endif
164 # ifdef ALLOW_GCHEM
165 # include "GCHEM_FIELDS.h"
166 # endif
167 # ifdef ALLOW_CFC
168 # include "CFC.h"
169 # endif
170 # ifdef ALLOW_DIC
171 # include "DIC_VARS.h"
172 # include "DIC_LOAD.h"
173 # include "DIC_ATMOS.h"
174 # include "DIC_CTRL.h"
175 # include "DIC_COST.h"
176 # endif
177 # ifdef ALLOW_SHELFICE
178 # include "SHELFICE.h"
179 # include "SHELFICE_COST.h"
180 # endif
181 # ifdef ALLOW_STREAMICE
182 # include "STREAMICE.h"
183 # include "STREAMICE_ADV.h"
184 # include "STREAMICE_BDRY.h"
185 # include "STREAMICE_CG.h"
186 # endif
187
188 #endif /* ALLOW_AUTODIFF */
189 c**************************************
190
191 C !INPUT/OUTPUT PARAMETERS:
192 C == Routine arguments ==
193 C note: under the multi-threaded model myiter and
194 C mytime are local variables passed around as routine
195 C arguments. Although this is fiddly it saves the need to
196 C impose additional synchronisation points when they are
197 C updated.
198 C myTime :: time counter for this thread
199 C myIter :: iteration counter for this thread
200 C myThid :: thread number for this instance of the routine.
201 _RL myTime
202 INTEGER myIter
203 INTEGER myThid
204
205 C !FUNCTIONS:
206 C == Functions ==
207
208 C !LOCAL VARIABLES:
209 C == Local variables ==
210 INTEGER iloop
211 #ifdef ALLOW_AUTODIFF_TAMC
212 #ifdef STORE_LOADEDREC_TEST
213 INTEGER bi,bj
214 #endif /* STORE_LOADEDREC_TEST */
215 #endif
216
217 CEOP
218
219 #ifdef ALLOW_DEBUG
220 IF (debugMode) CALL DEBUG_ENTER('MAIN_DO_LOOP',myThid)
221 #endif
222
223 c >>>>>>>>>>>>>>>>>>>>>>>>>>> LOOP <<<<<<<<<<<<<<<<<<<<<<<<<<<<
224 c >>>>>>>>>>>>>>>>>>>>>>>>>>> STARTS <<<<<<<<<<<<<<<<<<<<<<<<<<<<
225
226 c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
227 #ifndef ALLOW_AUTODIFF_OPENAD
228 c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
229 # ifdef ALLOW_AUTODIFF
230 # ifdef ALLOW_TAMC_CHECKPOINTING
231
232 max_lev4=nTimeSteps/(nchklev_1*nchklev_2*nchklev_3)+1
233 max_lev3=nTimeSteps/(nchklev_1*nchklev_2)+1
234 max_lev2=nTimeSteps/nchklev_1+1
235
236 c**************************************
237 # ifdef ALLOW_DIVIDED_ADJOINT
238 CADJ loop = divided
239 # endif
240 c**************************************
241
242 # ifdef AUTODIFF_4_LEVEL_CHECKPOINT
243 do ilev_4 = 1,nchklev_4
244 if(ilev_4.le.max_lev4) then
245 c**************************************
246 #ifdef ALLOW_AUTODIFF_WHTAPEIO
247 CALL AUTODIFF_WHTAPEIO_SYNC( 4 , 0, mythid )
248 #endif
249 CALL AUTODIFF_STORE( myThid )
250 #include "checkpoint_lev4_directives.h"
251 CALL AUTODIFF_RESTORE( myThid )
252 #ifdef ALLOW_AUTODIFF_WHTAPEIO
253 CALL AUTODIFF_WHTAPEIO_SYNC( 4 , 1, mythid )
254 #endif
255 c**************************************
256 c-- Initialise storage for the middle loop.
257 CADJ INIT tapelev3 = USER
258 # endif /* AUTODIFF_4_LEVEL_CHECKPOINT */
259
260 # ifndef AUTODIFF_2_LEVEL_CHECKPOINT
261 do ilev_3 = 1,nchklev_3
262 if(ilev_3.le.max_lev3) then
263 c**************************************
264 #ifdef ALLOW_AUTODIFF_WHTAPEIO
265 CALL AUTODIFF_WHTAPEIO_SYNC( 3 , 0, mythid )
266 #endif
267 CALL AUTODIFF_STORE( myThid )
268 #include "checkpoint_lev3_directives.h"
269 CALL AUTODIFF_RESTORE( myThid )
270 #ifdef ALLOW_AUTODIFF_WHTAPEIO
271 CALL AUTODIFF_WHTAPEIO_SYNC( 3 , 1, mythid )
272 #endif
273 c**************************************
274 c-- Initialise storage for the middle loop.
275 CADJ INIT tapelev2 = USER
276 # endif /* AUTODIFF_2_LEVEL_CHECKPOINT */
277
278 do ilev_2 = 1,nchklev_2
279 if(ilev_2.le.max_lev2) then
280 c**************************************
281 #ifdef ALLOW_AUTODIFF_WHTAPEIO
282 CALL AUTODIFF_WHTAPEIO_SYNC( 2 , 0, mythid )
283 #endif
284 CALL AUTODIFF_STORE( myThid )
285 #include "checkpoint_lev2_directives.h"
286 CALL AUTODIFF_RESTORE( myThid )
287 #ifdef ALLOW_AUTODIFF_WHTAPEIO
288 CALL AUTODIFF_WHTAPEIO_SYNC( 2 , 1, mythid )
289 #endif
290 c**************************************
291
292 # endif /* ALLOW_TAMC_CHECKPOINTING */
293
294 c**************************************
295 c--
296 c-- Initialize storage for the innermost loop.
297 c-- Always check common block sizes for the checkpointing!
298 c--
299 CADJ INIT comlev1 = COMMON,nchklev_1
300 CADJ INIT comlev1_bibj = COMMON,nchklev_1*nsx*nsy*nthreads_chkpt
301 CADJ INIT comlev1_bibj_k = COMMON,nchklev_1*nsx*nsy*nr*nthreads_chkpt
302 c--
303 # ifdef ALLOW_KPP
304 CADJ INIT comlev1_kpp = COMMON,nchklev_1*nsx*nsy
305 CADJ INIT comlev1_kpp_k = COMMON,nchklev_1*nsx*nsy*nr
306 # endif /* ALLOW_KPP */
307 c--
308 # ifdef ALLOW_GMREDI
309 CADJ INIT comlev1_gmredi_k_gad
310 CADJ & = COMMON,nchklev_1*nsx*nsy*nr*nthreads_chkpt*maxpass
311 # endif /* ALLOW_GMREDI */
312 c--
313 # ifdef ALLOW_PTRACERS
314 CADJ INIT comlev1_bibj_ptracers = COMMON,
315 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*PTRACERS_num
316 CADJ INIT comlev1_bibj_k_ptracers = COMMON,
317 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*PTRACERS_num*nr
318 # endif /* ALLOW_PTRACERS */
319 c--
320 # ifndef DISABLE_MULTIDIM_ADVECTION
321 CADJ INIT comlev1_bibj_gad = COMMON,
322 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*maxpass
323 CADJ INIT comlev1_bibj_k_gad = COMMON,
324 CADJ & nchklev_1*nsx*nsy*nr*nthreads_chkpt*maxpass
325 CADJ INIT comlev1_bibj_k_gad_pass = COMMON,
326 CADJ & nchklev_1*nsx*nsy*nr*nthreads_chkpt*maxpass*maxpass
327 # endif /* DISABLE_MULTIDIM_ADVECTION */
328 c--
329 # ifdef ALLOW_MOM_COMMON
330 # ifndef AUTODIFF_DISABLE_LEITH
331 CADJ INIT comlev1_mom_ijk_loop
332 CADJ & = COMMON,nchklev_1*
333 CADJ & (snx+2*olx)*nsx*(sny+2*oly)*nsy*nr*nthreads_chkpt
334 # endif /* AUTODIFF_DISABLE_LEITH */
335 # endif /* ALLOW_MOM_COMMON */
336 c--
337 # if (defined (ALLOW_EXF) && defined (ALLOW_BULKFORMULAE))
338 CADJ INIT comlev1_exf_1
339 CADJ & = COMMON,nchklev_1*snx*nsx*sny*nsy*nthreads_chkpt
340 CADJ INIT comlev1_exf_2
341 CADJ & = COMMON,niter_bulk*nchklev_1*snx*nsx*sny*nsy*nthreads_chkpt
342 # endif /* ALLOW_BULKFORMULAE */
343 c--
344 # ifdef ALLOW_SEAICE
345 # ifdef SEAICE_ALLOW_DYNAMICS
346 CADJ INIT comlev1_dynsol = COMMON,nchklev_1*MPSEUDOTIMESTEPS
347 # ifdef SEAICE_LSR_ADJOINT_ITER
348 CADJ INIT comlev1_dyniter =
349 CADJ & COMMON,nchklev_1*MPSEUDOTIMESTEPS*SOLV_MAX_FIXED
350 # endif
351 # endif
352 # ifdef SEAICE_ALLOW_EVP
353 CADJ INIT comlev1_evp = COMMON,nEVPstepMax*nchklev_1
354 # endif
355 # ifdef SEAICE_MULTICATEGORY
356 CADJ INIT comlev1_multdim
357 CADJ & = COMMON,nchklev_1*nsx*nsy*nthreads_chkpt*multdim
358 # endif
359 # ifndef DISABLE_MULTIDIM_ADVECTION
360 CADJ INIT comlev1_bibj_k_gadice = COMMON,
361 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*maxpass
362 CADJ INIT comlev1_bibj_k_gadice_pass = COMMON,
363 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*maxpass*maxpass
364 # endif /* DISABLE_MULTIDIM_ADVECTION */
365 # endif /* ALLOW_SEAICE */
366 c--
367 # ifdef ALLOW_THSICE
368 CADJ INIT comlev1_thsice_1
369 CADJ & = COMMON,nchklev_1*snx*nsx*sny*nsy*nthreads_chkpt
370 CADJ INIT comlev1_thsice_2
371 CADJ & = COMMON,nchklev_1*snx*nsx*sny*nsy*nlyr*nthreads_chkpt
372 CADJ INIT comlev1_thsice_3
373 CADJ & = COMMON,nchklev_1*snx*nsx*sny*nsy*MaxTsf*nthreads_chkpt
374 CADJ INIT comlev1_thsice_4
375 CADJ & = COMMON,nchklev_1*nsx*nsy*maxpass*nthreads_chkpt
376 # endif /* ALLOW_THSICE */
377 c--
378 # ifdef ALLOW_STREAMICE
379 CADJ INIT comlev1_stream_nl = COMMON,nchklev_1*streamice_max_nl
380 CADJ INIT comlev1_stream_front = COMMON,nchklev_1*4
381 CADJ INIT comlev1_stream_ij
382 CADJ & = COMMON,nchklev_1*4*(snx+2)*nsx*(sny+2)*nsy
383 CADJ INIT comlev1_stream_hybrid
384 CADJ & = COMMON,nchklev_1*snx*nsx*sny*nsy*nr*nthreads_chkpt
385 # endif
386 c--
387 # ifdef ALLOW_CG2D_NSA
388 CADJ INIT comlev1_cg2d
389 CADJ & = COMMON,nchklev_1*nthreads_chkpt
390 CADJ INIT comlev1_cg2d_iter
391 CADJ & = COMMON,nchklev_1*nthreads_chkpt*numItersMax
392 # endif
393 c--
394 c**************************************
395
396 #ifdef STORE_LOADEDREC_TEST
397 DO bj = myByLo(myThid), myByHi(myThid)
398 DO bi = myBxLo(myThid), myBxHi(myThid)
399 loadedRec(bi,bj) = 0
400 ENDDO
401 ENDDO
402 #endif /* STORE_LOADEDREC_TEST */
403
404 #ifdef ALLOW_TAMC_CHECKPOINTING
405
406 do ilev_1 = 1,nchklev_1
407
408 c-- The if-statement below introduces a some flexibility in the
409 c-- choice of the 3-tupel ( nchklev_1, nchklev_2, nchklev_3 ).
410
411 iloop = (ilev_2 - 1)*nchklev_1 + ilev_1
412 # ifndef AUTODIFF_2_LEVEL_CHECKPOINT
413 & + (ilev_3 - 1)*nchklev_2*nchklev_1
414 # endif
415 # ifdef AUTODIFF_4_LEVEL_CHECKPOINT
416 & + (ilev_4 - 1)*nchklev_3*nchklev_2*nchklev_1
417 # endif
418
419 if ( iloop .le. nTimeSteps ) then
420
421 # else /* ALLOW_TAMC_CHECKPOINTING undefined */
422
423 DO iloop = 1, nTimeSteps
424
425 # endif /* ALLOW_TAMC_CHECKPOINTING */
426 # endif /* ALLOW_AUTODIFF */
427
428 #endif /* undef ALLOW_AUTODIFF_OPENAD */
429
430 #ifdef ALLOW_AUTODIFF_OPENAD
431 DO iloop = 1, nTimeSteps
432 #endif
433
434 #ifndef ALLOW_AUTODIFF
435
436 c-- Start the main loop of adjoint_Objfunc. Automatic differentiation
437 c-- NOT enabled.
438 DO iloop = 1, nTimeSteps
439
440 #endif /* ALLOW_AUTODIFF */
441
442 c-- >>> Loop body start <<<
443
444 #ifdef ALLOW_AUTODIFF_TAMC
445 nIter0 = NINT( (startTime-baseTime)/deltaTClock )
446 # ifndef ALLOW_AUTODIFF_OPENAD
447 ikey_dynamics = ilev_1
448 # endif
449 #endif
450
451 #ifdef ALLOW_ECCO
452 #ifdef ALLOW_ECCO_EVOLUTION
453 #ifdef ALLOW_DEBUG
454 IF (debugMode) CALL DEBUG_CALL('cost_averagesfields',myThid)
455 #endif
456 c-- Accumulate time averages of temperature, salinity
457 #ifdef ALLOW_AUTODIFF
458 C-- Reset the model iteration counter and the model time.
459 myIter = nIter0 + (iloop-1)
460 myTime = startTime + float(iloop-1)*deltaTClock
461 #endif
462 CALL TIMER_START('COST_AVERAGESFIELDS [MAIN_DO_LOOP]',mythid)
463 CALL COST_AVERAGESFIELDS( mytime, mythid )
464 CALL TIMER_STOP ('COST_AVERAGESFIELDS [MAIN_DO_LOOP]',mythid)
465 #endif /* ALLOW_ECCO_EVOLUTION */
466 #endif /* ALLOW_ECCO */
467
468 #ifdef ALLOW_PROFILES
469 IF (usePROFILES) THEN
470 #ifdef ALLOW_DEBUG
471 IF (debugMode) CALL DEBUG_CALL('profiles_inloop',myThid)
472 #endif
473 c-- Accumulate in-situ time averages of theta, salt, and SSH.
474 #ifdef ALLOW_AUTODIFF
475 C-- Reset the model iteration counter and the model time.
476 myIter = nIter0 + (iloop-1)
477 myTime = startTime + float(iloop-1)*deltaTClock
478 #endif
479 CALL TIMER_START('PROFILES_INLOOP [MAIN_DO_LOOP]', mythid)
480 CALL PROFILES_INLOOP( mytime, mythid )
481 CALL TIMER_STOP ('PROFILES_INLOOP [MAIN_DO_LOOP]', mythid)
482 ENDIF
483 #endif
484
485 #ifdef ALLOW_DEBUG
486 IF (debugMode) CALL DEBUG_CALL('FORWARD_STEP',myThid)
487 #endif
488
489 #ifdef ALLOW_ATM2D
490 CALL TIMER_START('FORWARD_STEP_ATM2D [MAIN_DO_LOOP]',mythid)
491 CALL FORWARD_STEP_ATM2D( iloop, mytime, myiter, mythid )
492 CALL TIMER_STOP ('FORWARD_STEP_ATM2D [MAIN_DO_LOOP]',mythid)
493 #else
494 CALL TIMER_START('FORWARD_STEP [MAIN_DO_LOOP]',mythid)
495 CALL FORWARD_STEP( iloop, mytime, myiter, mythid )
496 CALL TIMER_STOP ('FORWARD_STEP [MAIN_DO_LOOP]',mythid)
497 #endif
498
499 c-- >>> Loop body end <<<
500 #ifdef ALLOW_AUTODIFF
501 # ifndef ALLOW_AUTODIFF_OPENAD
502
503 # ifdef ALLOW_TAMC_CHECKPOINTING
504 endif
505 enddo
506 endif
507 enddo
508 # ifndef AUTODIFF_2_LEVEL_CHECKPOINT
509 endif
510 enddo
511 # endif
512 # ifdef AUTODIFF_4_LEVEL_CHECKPOINT
513 endif
514 enddo
515 # endif
516 # else /* ndef ALLOW_TAMC_CHECKPOINTING */
517 ENDDO
518 # endif /* ALLOW_TAMC_CHECKPOINTING */
519 # else /* ndef ALLOW_AUTODIFF_OPENAD */
520 ENDDO
521 # endif /* ALLOW_AUTODIFF_OPENAD */
522 #else /* ALLOW_AUTODIFF */
523 ENDDO
524 #endif /* ALLOW_AUTODIFF */
525
526 #ifdef ALLOW_DEBUG
527 IF (debugMode) CALL DEBUG_LEAVE('MAIN_DO_LOOP',myThid)
528 #endif
529
530 RETURN
531 END

  ViewVC Help
Powered by ViewVC 1.1.22