/[MITgcm]/MITgcm_contrib/snarayan/divided_adjoint/model/src/the_main_loop.F
ViewVC logotype

Contents of /MITgcm_contrib/snarayan/divided_adjoint/model/src/the_main_loop.F

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


Revision 1.1 - (show annotations) (download)
Mon Jul 27 03:22:34 2015 UTC (10 years ago) by snarayan
Branch: MAIN
CVS Tags: HEAD
Changes for restarting the adjoint model with OpenAD DIVA.

1 C $Header: /u/gcmpack/MITgcm/model/src/the_main_loop.F,v 1.175 2015/07/22 20:33:58 gforget Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6 #ifdef ALLOW_AUTODIFF
7 # include "AUTODIFF_OPTIONS.h"
8 #endif
9 #ifdef ALLOW_OBCS
10 # include "OBCS_OPTIONS.h"
11 #endif
12 #ifdef ALLOW_SEAICE
13 # include "SEAICE_OPTIONS.h"
14 #endif
15 #ifdef ALLOW_GENERIC_ADVDIFF
16 # include "GAD_OPTIONS.h"
17 #endif
18 #ifdef ALLOW_GMREDI
19 # include "GMREDI_OPTIONS.h"
20 #endif
21 #ifdef ALLOW_STREAMICE
22 # include "STREAMICE_OPTIONS.h"
23 #endif
24 #ifdef ALLOW_GGL90
25 # include "GGL90_OPTIONS.h"
26 #endif
27 #ifdef ALLOW_EXF
28 # include "EXF_OPTIONS.h"
29 #endif
30 #ifdef ALLOW_COST
31 # include "COST_OPTIONS.h"
32 #endif
33 #ifdef ALLOW_CTRL
34 # include "CTRL_OPTIONS.h"
35 #endif
36 #ifdef ALLOW_ECCO
37 # include "ECCO_OPTIONS.h"
38 #endif
39
40 CBOP
41 C !ROUTINE: THE_MAIN_LOOP
42 C !INTERFACE:
43 SUBROUTINE THE_MAIN_LOOP( myTime, myIter, myThid )
44
45 C !DESCRIPTION: \bv
46 C *================================================================*
47 C | SUBROUTINE the_main_loop
48 C | o Run the ocean model and evaluate the specified cost function.
49 C *================================================================*
50 C |
51 C | THE_MAIN_LOOP is the toplevel routine for the Tangent Linear and
52 C | Adjoint Model Compiler (TAMC).
53 C | For this purpose the initialization
54 C | of the model was split into two parts. Those parameters that do
55 C | not depend on a specific model run are set in INITIALISE_FIXED,
56 C | whereas those that do depend on the specific realization are
57 C | initialized in INITIALISE_VARIA.
58 C | This routine is to be used in conjuction with the MITgcmuv
59 C | checkpoint 37.
60 C *================================================================*
61 C \ev
62
63 C !USES:
64 IMPLICIT NONE
65 C == Global variables ==
66 #include "SIZE.h"
67 #include "EEPARAMS.h"
68 #include "PARAMS.h"
69
70 c**************************************
71 #ifdef ALLOW_AUTODIFF
72 # ifndef ALLOW_OPENAD
73
74 c These includes are needed for
75 c AD-checkpointing.
76 c They provide the fields to be stored.
77
78 # include "AUTODIFF_MYFIELDS.h"
79 # include "GRID.h"
80 # include "DYNVARS.h"
81 # include "SURFACE.h"
82 # include "FFIELDS.h"
83 # include "EOS.h"
84 # include "AUTODIFF.h"
85
86 # ifdef ALLOW_GENERIC_ADVDIFF
87 # include "GAD.h"
88 # include "GAD_SOM_VARS.h"
89 # endif
90 # ifdef ALLOW_MOM_FLUXFORM
91 # include "MOM_FLUXFORM.h"
92 # endif
93 # ifdef ALLOW_CD_CODE
94 # include "CD_CODE_VARS.h"
95 # endif
96 # ifdef ALLOW_PTRACERS
97 # include "PTRACERS_SIZE.h"
98 # include "PTRACERS_FIELDS.h"
99 # include "PTRACERS_START.h"
100 # endif
101 # ifdef ALLOW_GCHEM
102 # include "GCHEM_FIELDS.h"
103 # endif
104 # ifdef ALLOW_CFC
105 # include "CFC.h"
106 # endif
107 # ifdef ALLOW_DIC
108 # include "DIC_VARS.h"
109 # include "DIC_LOAD.h"
110 # include "DIC_ATMOS.h"
111 # include "DIC_CTRL.h"
112 # include "DIC_COST.h"
113 # endif
114 # ifdef ALLOW_OBCS
115 # include "OBCS_PARAMS.h"
116 # include "OBCS_FIELDS.h"
117 # include "OBCS_SEAICE.h"
118 # ifdef ALLOW_PTRACERS
119 # include "OBCS_PTRACERS.h"
120 # endif
121 # endif
122 # ifdef ALLOW_EXF
123 # include "EXF_FIELDS.h"
124 # ifdef ALLOW_BULKFORMULAE
125 # include "EXF_CONSTANTS.h"
126 # endif
127 # endif /* ALLOW_EXF */
128 # ifdef ALLOW_SEAICE
129 # include "SEAICE_SIZE.h"
130 # include "SEAICE.h"
131 # include "SEAICE_PARAMS.h"
132 # include "SEAICE_COST.h"
133 # include "SEAICE_TRACER.h"
134 # endif
135 # ifdef ALLOW_SALT_PLUME
136 # include "SALT_PLUME.h"
137 # endif
138 # ifdef ALLOW_THSICE
139 # include "THSICE_SIZE.h"
140 # include "THSICE_VARS.h"
141 # include "THSICE_COST.h"
142 # endif
143 # ifdef ALLOW_SHELFICE
144 # include "SHELFICE.h"
145 # include "SHELFICE_COST.h"
146 # endif
147 # ifdef ALLOW_STREAMICE
148 # include "STREAMICE.h"
149 # include "STREAMICE_ADV.h"
150 # include "STREAMICE_BDRY.h"
151 # include "STREAMICE_CG.h"
152 # endif
153 # ifdef ALLOW_EBM
154 # include "EBM.h"
155 # endif
156 # ifdef ALLOW_RBCS
157 # include "RBCS_SIZE.h"
158 # include "RBCS_FIELDS.h"
159 # endif
160 # ifdef ALLOW_OFFLINE
161 # include "OFFLINE.h"
162 # endif
163 # ifdef ALLOW_CG2D_NSA
164 # include "CG2D.h"
165 # endif
166 # ifdef ALLOW_DIVIDED_ADJOINT
167 # ifdef ALLOW_USE_MPI
168 # include "mpif.h"
169 # endif
170 # endif
171
172 # include "tamc.h"
173
174 # ifdef ALLOW_GGL90
175 # include "GGL90.h"
176 # endif
177 # ifdef ALLOW_PROFILES
178 # include "profiles.h"
179 # endif
180
181 # ifdef ALLOW_ECCO_EVOLUTION
182 # ifdef ALLOW_ECCO
183 # include "ecco_cost.h"
184 # endif
185 # endif
186 #else
187 #include "OPENAD_OPTIONS.h"
188 # endif /* undef ALLOW_OPENAD */
189
190 # ifdef ALLOW_CTRL
191 # include "CTRL_SIZE.h"
192 # include "ctrl.h"
193 # include "ctrl_dummy.h"
194 # include "CTRL_GENARR.h"
195 # include "CTRL_OBCS.h"
196 # endif
197 # ifdef ALLOW_COST
198 # include "cost.h"
199 # endif
200
201 #endif /* ALLOW_AUTODIFF */
202 c**************************************
203
204 C !INPUT/OUTPUT PARAMETERS:
205 C == Routine arguments ==
206 C note: under the multi-threaded model myIter and
207 C myTime are local variables passed around as routine
208 C arguments. Although this is fiddly it saves the need to
209 C impose additional synchronisation points when they are
210 C updated.
211 C myTime :: time counter for this thread
212 C myIter :: iteration counter for this thread
213 C myThid :: thread number for this instance of the routine.
214 _RL myTime
215 INTEGER myIter
216 INTEGER myThid
217
218 C !FUNCTIONS:
219 C == Functions ==
220
221 C !LOCAL VARIABLES:
222 C == Local variables ==
223 INTEGER iloop
224 #ifdef STORE_LOADEDREC_TEST
225 INTEGER bi,bj
226 #endif /* STORE_LOADEDREC_TEST */
227 CEOP
228
229 #ifdef ALLOW_DEBUG
230 IF (debugMode) CALL DEBUG_ENTER('THE_MAIN_LOOP',myThid)
231 #endif
232
233 #ifdef ALLOW_AUTODIFF_TAMC
234 c-- Initialize storage for the cost function evaluation.
235 CADJ INIT dummytape = common, 1
236 c-- Initialize storage for the outermost loop.
237 # ifndef ALLOW_AUTODIFF_WHTAPEIO
238 CADJ INIT tapelev_init = USER
239 CADJ INIT tapelev_ini_bibj_k = USER
240 # else
241 CADJ INIT tapelev_init = common, 1
242 # endif
243 c
244 # ifdef ALLOW_TAMC_CHECKPOINTING
245 # if (defined (AUTODIFF_2_LEVEL_CHECKPOINT))
246 CADJ INIT tapelev2 = USER
247 # elif (defined (AUTODIFF_4_LEVEL_CHECKPOINT))
248 CADJ INIT tapelev4 = USER
249 # else
250 CADJ INIT tapelev3 = USER
251 # endif
252 # endif
253 #endif
254
255 #ifdef ALLOW_AUTODIFF
256 nIter0 = NINT( (startTime-baseTime)/deltaTClock )
257 ikey_dynamics = 1
258 #endif
259
260 #ifdef ALLOW_AUTODIFF_TAMC
261 # ifdef NONLIN_FRSURF
262 CADJ STORE hFacC = tapelev_init, key = 1
263 CADJ STORE recip_hFacC = tapelev_init, key = 1
264 # endif
265 #endif
266
267 #ifdef ALLOW_OPENAD
268 # ifdef ALLOW_THETA0_CONTROL
269 c$openad INDEPENDENT(xx_theta_dummy)
270 # endif
271 # ifdef ALLOW_SALT0_CONTROL
272 c$openad INDEPENDENT(xx_salt_dummy)
273 # endif
274 # ifdef ALLOW_HFLUX0_CONTROL
275 c$openad INDEPENDENT(xx_hflux0)
276 # endif
277 # ifdef ALLOW_SFLUX0_CONTROL
278 c$openad INDEPENDENT(xx_sflux0)
279 # endif
280 # ifdef ALLOW_TAUU0_CONTROL
281 c$openad INDEPENDENT(xx_tauu0)
282 # endif
283 # ifdef ALLOW_TAUV0_CONTROL
284 c$openad INDEPENDENT(xx_tauv0)
285 # endif
286 # ifdef ALLOW_DIFFKR_CONTROL
287 c$openad INDEPENDENT(xx_diffkr_dummy)
288 # endif
289 # ifdef ALLOW_KAPGM_CONTROL
290 c$openad INDEPENDENT(xx_kapgm)
291 # endif
292 # ifdef ALLOW_TR10_CONTROL
293 c$openad INDEPENDENT(xx_tr1)
294 # endif
295 # ifdef ALLOW_HFLUXM_CONTROL
296 c$openad INDEPENDENT(xx_hfluxm)
297 # endif
298 # ifdef ALLOW_GENARR2D_CONTROL
299 cphc$openad INDEPENDENT(xx_genarr2d)
300 c$openad INDEPENDENT(xx_genarr2d_dummy)
301 # endif
302 # ifdef ALLOW_GENARR3D_CONTROL
303 cphc$openad INDEPENDENT(xx_genarr3d)
304 c$openad INDEPENDENT(xx_genarr3d_dummy)
305 # endif
306 # ifdef ALLOW_GENTIM2D_CONTROL
307 cphc$openad INDEPENDENT(xx_gentim2d)
308 c$openad INDEPENDENT(xx_gentim2d_dummy)
309 # endif
310 #endif /* ALLOW_OPENAD */
311
312 #ifdef ALLOW_DEBUG
313 IF (debugMode) CALL DEBUG_CALL('INITIALISE_VARIA',myThid)
314 #endif
315 C#ifndef ALLOW_OPENAD
316 C-- Set initial conditions (variable arrays)
317 #if (defined (ALLOW_OPENAD) && defined (ALLOW_OPENAD_DIVA))
318 if(myIter.eq.nIter0) then
319 print *, 'DIVA calling INITIALISE_VARIA', myIter, nIter0
320 #endif
321 CALL TIMER_START('INITIALISE_VARIA [THE_MAIN_LOOP]', myThid)
322 CALL INITIALISE_VARIA( myThid )
323 CALL TIMER_STOP ('INITIALISE_VARIA [THE_MAIN_LOOP]', myThid)
324 #if (defined (ALLOW_OPENAD) && defined (ALLOW_OPENAD_DIVA))
325 end if
326 #endif
327 C#endif
328 #if (defined (ALLOW_ECCO_EVOLUTION) && defined (ECCO_CTRL_DEPRECATED))
329 #ifdef ALLOW_ECCO
330 cph: avoid renewed call of initialise_varia in recomputation loop
331 cph: in some circumstances
332 CADJ STORE sbar_gen,tbar_gen = onetape
333 #endif
334 #endif
335
336 #ifdef ALLOW_SHOWFLOPS
337 CALL TIMER_START('SHOWFLOPS_INIT [THE_MAIN_LOOP]', myThid)
338 CALL SHOWFLOPS_INIT( myThid )
339 CALL TIMER_STOP ('SHOWFLOPS_INIT [THE_MAIN_LOOP]', myThid)
340 #endif
341
342 c-- Do the model integration.
343 CALL TIMER_START('MAIN LOOP [THE_MAIN_LOOP]', myThid)
344
345 c >>>>>>>>>>>>>>>>>>>>>>>>>>> LOOP <<<<<<<<<<<<<<<<<<<<<<<<<<<<
346 c >>>>>>>>>>>>>>>>>>>>>>>>>>> STARTS <<<<<<<<<<<<<<<<<<<<<<<<<<<<
347
348 c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
349 #ifndef ALLOW_OPENAD
350 # ifdef ALLOW_AUTODIFF
351 # ifdef ALLOW_TAMC_CHECKPOINTING
352 c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
353
354 max_lev4=nTimeSteps/(nchklev_1*nchklev_2*nchklev_3)+1
355 max_lev3=nTimeSteps/(nchklev_1*nchklev_2)+1
356 max_lev2=nTimeSteps/nchklev_1+1
357
358 c**************************************
359 # ifdef ALLOW_DIVIDED_ADJOINT
360 CADJ loop = divided
361 # endif
362 c**************************************
363
364 # ifdef AUTODIFF_4_LEVEL_CHECKPOINT
365 do ilev_4 = 1,nchklev_4
366 if(ilev_4.le.max_lev4) then
367 c**************************************
368 #ifdef ALLOW_AUTODIFF_WHTAPEIO
369 CALL AUTODIFF_WHTAPEIO_SYNC( 4 , 0, myThid )
370 #endif
371 CALL AUTODIFF_STORE( myThid )
372 #include "checkpoint_lev4_directives.h"
373 CALL AUTODIFF_RESTORE( myThid )
374 #ifdef ALLOW_AUTODIFF_WHTAPEIO
375 CALL AUTODIFF_WHTAPEIO_SYNC( 4 , 1, myThid )
376 #endif
377 c**************************************
378 c-- Initialise storage for the middle loop.
379 CADJ INIT tapelev3 = USER
380 # endif /* AUTODIFF_4_LEVEL_CHECKPOINT */
381
382 # ifndef AUTODIFF_2_LEVEL_CHECKPOINT
383 do ilev_3 = 1,nchklev_3
384 if(ilev_3.le.max_lev3) then
385 c**************************************
386 #ifdef ALLOW_AUTODIFF_WHTAPEIO
387 CALL AUTODIFF_WHTAPEIO_SYNC( 3 , 0, myThid )
388 #endif
389 CALL AUTODIFF_STORE( myThid )
390 #include "checkpoint_lev3_directives.h"
391 CALL AUTODIFF_RESTORE( myThid )
392 #ifdef ALLOW_AUTODIFF_WHTAPEIO
393 CALL AUTODIFF_WHTAPEIO_SYNC( 3 , 1, myThid )
394 #endif
395 c**************************************
396 c-- Initialise storage for the middle loop.
397 CADJ INIT tapelev2 = USER
398 # endif /* AUTODIFF_2_LEVEL_CHECKPOINT */
399
400 do ilev_2 = 1,nchklev_2
401 if(ilev_2.le.max_lev2) then
402 c**************************************
403 #ifdef ALLOW_AUTODIFF_WHTAPEIO
404 CALL AUTODIFF_WHTAPEIO_SYNC( 2 , 0, myThid )
405 #endif
406 CALL AUTODIFF_STORE( myThid )
407 #include "checkpoint_lev2_directives.h"
408 CALL AUTODIFF_RESTORE( myThid )
409 #ifdef ALLOW_AUTODIFF_WHTAPEIO
410 CALL AUTODIFF_WHTAPEIO_SYNC( 2 , 1, myThid )
411 #endif
412 c**************************************
413
414 # endif /* ALLOW_TAMC_CHECKPOINTING */
415
416 c**************************************
417 c--
418 c-- Initialize storage for the innermost loop.
419 c-- Always check common block sizes for the checkpointing!
420 c--
421 CADJ INIT comlev1 = COMMON,nchklev_1
422 CADJ INIT comlev1_bibj = COMMON,nchklev_1*nsx*nsy*nthreads_chkpt
423 CADJ INIT comlev1_bibj_k = COMMON,nchklev_1*nsx*nsy*nr*nthreads_chkpt
424 c--
425 #ifdef ALLOW_CTRL
426 CADJ INIT ctrltape = COMMON,1
427 #endif
428 c--
429 # ifdef ALLOW_KPP
430 CADJ INIT comlev1_kpp = COMMON,nchklev_1*nsx*nsy
431 CADJ INIT comlev1_kpp_k = COMMON,nchklev_1*nsx*nsy*nr
432 # endif /* ALLOW_KPP */
433 c--
434 # ifdef ALLOW_GMREDI
435 CADJ INIT comlev1_gmredi_k_gad
436 CADJ & = COMMON,nchklev_1*nsx*nsy*nr*nthreads_chkpt*maxpass
437 # endif /* ALLOW_GMREDI */
438 c--
439 # ifdef ALLOW_PTRACERS
440 CADJ INIT comlev1_bibj_ptracers = COMMON,
441 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*PTRACERS_num
442 CADJ INIT comlev1_bibj_k_ptracers = COMMON,
443 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*PTRACERS_num*nr
444 # endif /* ALLOW_PTRACERS */
445 c--
446 # ifndef DISABLE_MULTIDIM_ADVECTION
447 CADJ INIT comlev1_bibj_gad = COMMON,
448 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*maxpass
449 CADJ INIT comlev1_bibj_k_gad = COMMON,
450 CADJ & nchklev_1*nsx*nsy*nr*nthreads_chkpt*maxpass
451 CADJ INIT comlev1_bibj_k_gad_pass = COMMON,
452 CADJ & nchklev_1*nsx*nsy*nr*nthreads_chkpt*maxpass*maxpass
453 # endif /* DISABLE_MULTIDIM_ADVECTION */
454 c--
455 # ifdef ALLOW_MOM_COMMON
456 # ifndef AUTODIFF_DISABLE_LEITH
457 CADJ INIT comlev1_mom_ijk_loop
458 CADJ & = COMMON,nchklev_1*
459 CADJ & (snx+2*olx)*nsx*(sny+2*oly)*nsy*nr*nthreads_chkpt
460 # endif /* AUTODIFF_DISABLE_LEITH */
461 # endif /* ALLOW_MOM_COMMON */
462 c--
463 # if (defined (ALLOW_EXF) && defined (ALLOW_BULKFORMULAE))
464 CADJ INIT comlev1_exf_1
465 CADJ & = COMMON,nchklev_1*snx*nsx*sny*nsy*nthreads_chkpt
466 CADJ INIT comlev1_exf_2
467 CADJ & = COMMON,niter_bulk*nchklev_1*snx*nsx*sny*nsy*nthreads_chkpt
468 # endif /* ALLOW_BULKFORMULAE */
469 c--
470 # ifdef ALLOW_SEAICE
471 # ifdef SEAICE_ALLOW_DYNAMICS
472 CADJ INIT comlev1_dynsol = COMMON,nchklev_1*MPSEUDOTIMESTEPS
473 # ifdef SEAICE_LSR_ADJOINT_ITER
474 CADJ INIT comlev1_lsr = COMMON,nchklev_1*MPSEUDOTIMESTEPS*SOLV_MAX_FIXED
475 CADJ INIT comlev1_bibj_lsr = COMMON,
476 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*MPSEUDOTIMESTEPS*SOLV_MAX_FIXED
477 # else /* make the common blocks smaller to reduce memory footprint */
478 CADJ INIT comlev1_lsr = COMMON,nchklev_1*MPSEUDOTIMESTEPS
479 CADJ INIT comlev1_bibj_lsr = COMMON,
480 CADJ & nsx*nsy*nthreads_chkpt*nchklev_1*MPSEUDOTIMESTEPS
481 # endif
482 # endif
483 # ifdef SEAICE_ALLOW_EVP
484 CADJ INIT comlev1_evp = COMMON,nEVPstepMax*nchklev_1
485 # endif
486 CML# ifdef SEAICE_MULTICATEGORY
487 CMLCADJ INIT comlev1_multdim
488 CMLCADJ & = COMMON,nchklev_1*nsx*nsy*nthreads_chkpt*nitd
489 CML# endif
490 # ifndef DISABLE_MULTIDIM_ADVECTION
491 CADJ INIT comlev1_bibj_k_gadice = COMMON,
492 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*maxpass
493 CADJ INIT comlev1_bibj_k_gadice_pass = COMMON,
494 CADJ & nchklev_1*nsx*nsy*nthreads_chkpt*maxpass*maxpass
495 # endif /* DISABLE_MULTIDIM_ADVECTION */
496 # endif /* ALLOW_SEAICE */
497 c--
498 # ifdef ALLOW_THSICE
499 CADJ INIT comlev1_thsice_1 = COMMON,
500 CADJ & nchklev_1*snx*nsx*sny*nsy*nthreads_chkpt
501 CADJ INIT comlev1_thsice_2 = COMMON,
502 CADJ & nchklev_1*snx*nsx*sny*nsy*nlyr*nthreads_chkpt
503 CADJ INIT comlev1_thsice_3 = COMMON,
504 CADJ & nchklev_1*snx*nsx*sny*nsy*MaxTsf*nthreads_chkpt
505 CADJ INIT comlev1_thsice_4 = COMMON,
506 CADJ & nchklev_1*nsx*nsy*maxpass*nthreads_chkpt
507 CADJ INIT comlev1_thsice_5 = COMMON,
508 CADJ & nchklev_1*snx*nsx*sny*nsy*MaxTsf*(niter_bulk+1)*nthreads_chkpt
509 CADJ INIT comlev1_thsice_s4t = COMMON,
510 CADJ & nchklev_1*nsx*nsy*maxtsf*nthreads_chkpt
511 # endif /* ALLOW_THSICE */
512 c--
513 # ifdef ALLOW_STREAMICE
514 CADJ INIT comlev1_stream_nl = COMMON,nchklev_1*streamice_max_nl
515 CADJ INIT comlev1_stream_front = COMMON,nchklev_1*4
516 CADJ INIT comlev1_stream_ij
517 CADJ & = COMMON,nchklev_1*4*(snx+2)*nsx*(sny+2)*nsy
518 CADJ INIT comlev1_stream_hybrid
519 CADJ & = COMMON,nchklev_1*snx*nsx*sny*nsy*nr*nthreads_chkpt
520 # endif
521 c--
522 # ifdef ALLOW_CG2D_NSA
523 CADJ INIT comlev1_cg2d
524 CADJ & = COMMON,nchklev_1*nthreads_chkpt
525 CADJ INIT comlev1_cg2d_iter
526 CADJ & = COMMON,nchklev_1*nthreads_chkpt*numItersMax
527 # endif
528 c--
529 c**************************************
530
531 #ifdef STORE_LOADEDREC_TEST
532 DO bj = myByLo(myThid), myByHi(myThid)
533 DO bi = myBxLo(myThid), myBxHi(myThid)
534 loadedRec(bi,bj) = 0
535 ENDDO
536 ENDDO
537 #endif /* STORE_LOADEDREC_TEST */
538
539 #ifdef ALLOW_TAMC_CHECKPOINTING
540
541 do ilev_1 = 1,nchklev_1
542
543 c-- The if-statement below introduces a some flexibility in the
544 c-- choice of the 3-tupel ( nchklev_1, nchklev_2, nchklev_3 ).
545
546 iloop = (ilev_2 - 1)*nchklev_1 + ilev_1
547 # ifndef AUTODIFF_2_LEVEL_CHECKPOINT
548 & + (ilev_3 - 1)*nchklev_2*nchklev_1
549 # endif
550 # ifdef AUTODIFF_4_LEVEL_CHECKPOINT
551 & + (ilev_4 - 1)*nchklev_3*nchklev_2*nchklev_1
552 # endif
553
554 if ( iloop .le. nTimeSteps ) then
555
556 # else /* ALLOW_TAMC_CHECKPOINTING undefined */
557
558 DO iloop = 1, nTimeSteps
559
560 c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
561 # endif /* ALLOW_TAMC_CHECKPOINTING */
562 # endif /* ALLOW_AUTODIFF */
563 #endif /* undef ALLOW_OPENAD */
564 c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
565
566 #ifndef ALLOW_AUTODIFF
567 DO iloop = 1, nTimeSteps
568 #endif /* ALLOW_AUTODIFF */
569
570 c-- >>> Loop body start <<<
571
572 #ifdef ALLOW_AUTODIFF
573 nIter0 = NINT( (startTime-baseTime)/deltaTClock )
574 C-- Reset the model iteration counter and the model time.
575 myIter = nIter0 + (iloop-1)
576 myTime = startTime + float(iloop-1)*deltaTClock
577 # ifndef ALLOW_OPENAD
578 ikey_dynamics = ilev_1
579 # endif
580 #endif
581
582 #if (defined (ALLOW_ECCO) && defined (ALLOW_ECCO_EVOLUTION))
583 IF ( useECCO ) then
584 # ifdef ALLOW_DEBUG
585 IF (debugMode) CALL DEBUG_CALL('cost_averagesfields',myThid)
586 # endif
587 c-- Accumulate time averages of temperature, salinity
588 CALL TIMER_START('COST_AVERAGESFIELDS [MAIN_DO_LOOP]',myThid)
589 CALL COST_AVERAGESFIELDS( myTime, myThid )
590 CALL TIMER_STOP ('COST_AVERAGESFIELDS [MAIN_DO_LOOP]',myThid)
591 ENDIF
592 #endif /* ALLOW_ECCO_EVOLUTION */
593
594 #ifdef ALLOW_PROFILES
595 IF (usePROFILES) THEN
596 #ifdef ALLOW_DEBUG
597 IF (debugMode) CALL DEBUG_CALL('profiles_inloop',myThid)
598 #endif
599 c-- Accumulate in-situ time averages of theta, salt, and SSH.
600 #ifdef ALLOW_AUTODIFF
601 C-- Reset the model iteration counter and the model time.
602 myIter = nIter0 + (iloop-1)
603 myTime = startTime + float(iloop-1)*deltaTClock
604 #endif
605 CALL TIMER_START('PROFILES_INLOOP [MAIN_DO_LOOP]', myThid)
606 CALL PROFILES_INLOOP( myTime, myThid )
607 CALL TIMER_STOP ('PROFILES_INLOOP [MAIN_DO_LOOP]', myThid)
608 ENDIF
609 #endif
610
611 CALL TIMER_START('MAIN_DO_LOOP [THE_MAIN_LOOP]', myThid)
612 CALL MAIN_DO_LOOP( iloop, myTime, myIter, myThid )
613 CALL TIMER_STOP ('MAIN_DO_LOOP [THE_MAIN_LOOP]', myThid)
614
615 c-- >>> Loop body end <<<
616 #ifndef ALLOW_OPENAD
617 # ifdef ALLOW_AUTODIFF
618 # ifdef ALLOW_TAMC_CHECKPOINTING
619 endif
620 enddo
621 endif
622 enddo
623 # ifndef AUTODIFF_2_LEVEL_CHECKPOINT
624 endif
625 enddo
626 # endif
627 # ifdef AUTODIFF_4_LEVEL_CHECKPOINT
628 endif
629 enddo
630 # endif
631 # else /* ndef ALLOW_TAMC_CHECKPOINTING */
632 ENDDO
633 # endif /* ALLOW_TAMC_CHECKPOINTING */
634 # else /* ALLOW_AUTODIFF */
635 ENDDO
636 # endif /* ALLOW_AUTODIFF */
637 #endif /* undef ALLOW_OPENAD */
638
639 c >>>>>>>>>>>>>>>>>>>>>>>>>>> LOOP <<<<<<<<<<<<<<<<<<<<<<<<<<<<
640 c >>>>>>>>>>>>>>>>>>>>>>>>>>> STOPS <<<<<<<<<<<<<<<<<<<<<<<<<<<<
641
642
643 #ifdef ALLOW_ECCO
644 #ifdef ALLOW_ECCO_EVOLUTION
645 c-- Accumulate time averages of temperature, salinity
646 CALL TIMER_START('COST_AVERAGESFIELDS [THE_MAIN_LOOP]',myThid)
647 CALL COST_AVERAGESFIELDS( endtime, myThid )
648 CALL TIMER_STOP ('COST_AVERAGESFIELDS [THE_MAIN_LOOP]',myThid)
649 #endif /* ALLOW_ECCO_EVOLUTION */
650 #endif /* ALLOW_ECCO */
651
652 #ifdef ALLOW_PROFILES
653 IF (usePROFILES) THEN
654 c-- Accumulate in-situ time averages of temperature, salinity, SSH.
655 CALL TIMER_START('PROFILES_INLOOP [THE_MAIN_LOOP]', myThid)
656 CALL PROFILES_INLOOP( endtime, myThid )
657 CALL TIMER_STOP ('PROFILES_INLOOP [THE_MAIN_LOOP]', myThid)
658 c-- Compute all profiles cost function contributions.
659 CALL cost_profiles( myiter, mytime, mythid)
660 ENDIF
661 #endif
662
663 #ifdef ALLOW_ECCO
664 #ifdef ALLOW_ECCO_EVOLUTION
665 IF ( useECCO ) then
666 c-- Compute all ecco cost function contributions.
667 CALL TIMER_START('ECCO_COST_DRIVER [THE_MAIN_LOOP]', myThid)
668 CALL ECCO_COST_DRIVER ( endTime, myIter, myThid )
669 CALL TIMER_STOP ('ECCO_COST_DRIVER [THE_MAIN_LOOP]', myThid)
670 ENDIF
671 #endif /* ALLOW_ECCO_EVOLUTION */
672 #endif /* ALLOW_ECCO */
673
674 #ifdef ALLOW_COST
675 #if (defined (ALLOW_OPENAD) && defined (ALLOW_OPENAD_DIVA))
676 IF(MYITER .eq. NITER0+nTimeSteps_l2*nTimeSteps) THEN
677 #endif
678 c-- Sum all cost function contributions.
679 CALL TIMER_START('COST_FINAL [ADJOINT SPIN-DOWN]', myThid)
680 CALL COST_FINAL ( myThid )
681 CALL TIMER_STOP ('COST_FINAL [ADJOINT SPIN-DOWN]', myThid)
682 #if (defined (ALLOW_OPENAD) && defined (ALLOW_OPENAD_DIVA))
683 end if
684 #endif
685 # ifdef ALLOW_OPENAD
686 c$openad DEPENDENT(fc)
687 # endif /* ALLOW_OPENAD */
688
689 #endif /* ALLOW_COST */
690
691 _BARRIER
692 CALL TIMER_STOP ('MAIN LOOP [THE_MAIN_LOOP]', myThid)
693
694 #ifdef ALLOW_DEBUG
695 IF (debugMode) CALL DEBUG_LEAVE('THE_MAIN_LOOP',myThid)
696 #endif
697
698 RETURN
699 END

  ViewVC Help
Powered by ViewVC 1.1.22