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

Diff of /MITgcm/model/src/forward_step.F

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

revision 1.32 by heimbach, Thu May 30 02:32:14 2002 UTC revision 1.156 by gforget, Thu Apr 24 21:39:52 2008 UTC
# Line 1  Line 1 
1  C $Header$  C $Header$
2  C $Name$  C $Name$
3    
4    #include "PACKAGES_CONFIG.h"
5  #include "CPP_OPTIONS.h"  #include "CPP_OPTIONS.h"
6    
7    #ifdef ALLOW_GMREDI
8    # include "GMREDI_OPTIONS.h"
9    #endif
10    #ifdef ALLOW_OBCS
11    # include "OBCS_OPTIONS.h"
12    #endif
13    #ifdef ALLOW_SEAICE
14    # include "SEAICE_OPTIONS.h"
15    #endif
16    
17  CBOP  CBOP
18  C     !ROUTINE: FORWARD_STEP  C     !ROUTINE: FORWARD_STEP
19  C     !INTERFACE:  C     !INTERFACE:
# Line 17  C     | Line 28  C     |
28  C     | THE_MAIN_LOOP is the toplevel routine for the Tangent Linear and  C     | THE_MAIN_LOOP is the toplevel routine for the Tangent Linear and
29  C     | Adjoint Model Compiler (TAMC). For this purpose the initialization  C     | Adjoint Model Compiler (TAMC). For this purpose the initialization
30  C     | of the model was split into two parts. Those parameters that do  C     | of the model was split into two parts. Those parameters that do
31  C     | not depend on a specific model run are set in INITIALISE_FIXED,    C     | not depend on a specific model run are set in INITIALISE_FIXED,
32  C     | whereas those that do depend on the specific realization are  C     | whereas those that do depend on the specific realization are
33  C     | initialized in INITIALISE_VARIA.    C     | initialized in INITIALISE_VARIA.
34  C     |  C     |
35  C     *==================================================================  C     *==================================================================
36  C     \ev  C     \ev
# Line 31  C     == Global variables == Line 42  C     == Global variables ==
42  #include "EEPARAMS.h"  #include "EEPARAMS.h"
43  #include "PARAMS.h"  #include "PARAMS.h"
44  #include "DYNVARS.h"  #include "DYNVARS.h"
 #include "FFIELDS.h"  
45    
46  #ifdef ALLOW_NONHYDROSTATIC  #ifdef ALLOW_MNC
47  #include "CG3D.h"  #include "MNC_PARAMS.h"
48          EXTERNAL DIFFERENT_MULTIPLE
49          LOGICAL  DIFFERENT_MULTIPLE
50    #endif
51    
52    #ifdef HAVE_SIGREG
53    #include "SIGREG.h"
54  #endif  #endif
55    
56  #ifdef ALLOW_SHAP_FILT  #ifdef ALLOW_SHAP_FILT
57  #include "SHAP_FILT.h"  # include "SHAP_FILT.h"
58  #endif  #endif
59  #ifdef ALLOW_ZONAL_FILT  #ifdef ALLOW_ZONAL_FILT
60  #include "ZONAL_FILT.h"  # include "ZONAL_FILT.h"
61    #endif
62    #ifdef COMPONENT_MODULE
63    # include "CPL_PARAMS.h"
64  #endif  #endif
65    
66  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
67    # include "FFIELDS.h"
68    # include "SURFACE.h"
69    
70  # include "tamc.h"  # include "tamc.h"
71  # include "ctrl.h"  # include "ctrl.h"
72  # include "ctrl_dummy.h"  # include "ctrl_dummy.h"
73  # include "cost.h"  # include "cost.h"
74  # ifdef INCLUDE_EXTERNAL_FORCING_PACKAGE  # include "EOS.h"
75  #  include "exf_fields.h"  # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
76    #  include "GRID.h"
77    # endif
78    # ifdef ALLOW_EXF
79    #  include "EXF_FIELDS.h"
80  #  ifdef ALLOW_BULKFORMULAE  #  ifdef ALLOW_BULKFORMULAE
81  #   include "exf_constants.h"  #   include "EXF_CONSTANTS.h"
82  #  endif  #  endif
83  # endif  # endif
84    # ifdef ALLOW_PTRACERS
85    #  include "PTRACERS_SIZE.h"
86    #  include "PTRACERS_FIELDS.h"
87    # endif
88    # ifdef ALLOW_GCHEM
89    #  include "GCHEM_FIELDS.h"
90    # endif
91    # ifdef ALLOW_CFC
92    #  include "CFC.h"
93    # endif
94    # ifdef ALLOW_DIC
95    #  include "DIC_VARS.h"
96    #  include "DIC_LOAD.h"
97    #  include "DIC_ATMOS.h"
98    # endif
99  # ifdef ALLOW_OBCS  # ifdef ALLOW_OBCS
100  #  include "OBCS.h"  #  include "OBCS.h"
101    #  ifdef ALLOW_PTRACERS
102    #   include "OBCS_PTRACERS.h"
103    #  endif
104  # endif  # endif
105  #endif  # ifdef ALLOW_CD_CODE
106    #  include "CD_CODE_VARS.h"
107    # endif
108    # ifdef ALLOW_THSICE
109    #  include "THSICE_VARS.h"
110    # endif
111    # ifdef ALLOW_SEAICE
112    #  include "SEAICE.h"
113    # endif
114    # ifdef ALLOW_EBM
115    #  include "EBM.h"
116    # endif
117    # ifdef ALLOW_KPP
118    #  include "KPP.h"
119    # endif
120    # ifdef ALLOW_GMREDI
121    #  include "GMREDI.h"
122    # endif
123    # ifdef ALLOW_RBCS
124    #  include "RBCS.h"
125    # endif
126    #endif /* ALLOW_AUTODIFF_TAMC */
127    
128  C     !LOCAL VARIABLES:  C     !INPUT/OUTPUT PARAMETERS:
129  C     == Routine arguments ==  C     == Routine arguments ==
130  C     note: under the multi-threaded model myiter and  C     note: under the multi-threaded model myIter and
131  C           mytime are local variables passed around as routine  C           myTime are local variables passed around as routine
132  C           arguments. Although this is fiddly it saves the need to  C           arguments. Although this is fiddly it saves the need to
133  C           impose additional synchronisation points when they are  C           impose additional synchronisation points when they are
134  C           updated.  C           updated.
135  C     myiter - iteration counter for this thread  C     myTime :: time counter for this thread
136  C     mytime - time counter for this thread  C     myIter :: iteration counter for this thread
137  C     mythid - thread number for this instance of the routine.  C     myThid :: thread number for this instance of the routine.
138        integer iloop        INTEGER iloop
139        integer mythid        _RL     myTime
140        integer myiter        INTEGER myIter
141        _RL     mytime        INTEGER myThid
       INTEGER bi,bj  
142    
143    C     !LOCAL VARIABLES:
144    C     == Local variables ==
145    C     modelEnd  :: true if reaching the end of the run
146          LOGICAL modelEnd
147    #ifdef COMPONENT_MODULE
148          INTEGER myItP1
149    #endif
150  CEOP  CEOP
151    
152    #ifdef ALLOW_DEBUG
153          IF ( debugLevel .GE. debLevB )
154         &    CALL DEBUG_ENTER('FORWARD_STEP',myThid)
155    #endif
156    
157    #ifdef ALLOW_AUTODIFF_TAMC
158          CALL AUTODIFF_INADMODE_UNSET( myThid )
159    #endif
160    
161    #ifdef ALLOW_AUTODIFF_TAMC
162    C--   Reset the model iteration counter and the model time.
163          myIter = nIter0 + (iloop-1)
164          myTime = startTime + float(iloop-1)*deltaTclock
165    #endif
166    
167  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
168  C--     Reset the model iteration counter and the model time.  c**************************************
169          myiter = nIter0 + (iloop-1)  #include "checkpoint_lev1_directives.h"
170          mytime = startTime + float(iloop-1)*deltaTclock  #include "checkpoint_lev1_template.h"
171    c**************************************
172    #endif
173    
174    C--   Switch on/off diagnostics for snap-shot output:
175    #ifdef ALLOW_DIAGNOSTICS
176          IF ( useDiagnostics ) THEN
177            CALL DIAGNOSTICS_SWITCH_ONOFF( myTime, myIter, myThid )
178    C--   State-variables diagnostics
179            CALL TIMER_START('DO_STATEVARS_DIAGS  [FORWARD_STEP]',myThid)
180            CALL DO_STATEVARS_DIAGS( myTime, 0, myIter, myThid )
181            CALL TIMER_STOP ('DO_STATEVARS_DIAGS  [FORWARD_STEP]',myThid)
182          ENDIF
183    #endif
184    
185    #ifdef ALLOW_PROFILES
186    #ifdef ALLOW_DEBUG
187          IF (debugMode) CALL DEBUG_CALL('',myThid)
188    #endif
189    c--     Accumulate in-situ time averages of theta, salt, and SSH.
190            CALL TIMER_START('PROFILES_INLOOP    [THE_MAIN_LOOP]', mythid)
191            CALL PROFILES_INLOOP( mytime, mythid )
192            CALL TIMER_STOP ('PROFILES_INLOOP    [THE_MAIN_LOOP]', mythid)
193    #endif
194    
195    C--   Call driver to load external forcing fields from file
196    #ifdef ALLOW_DEBUG
197          IF ( debugLevel .GE. debLevB )
198         & CALL DEBUG_CALL('LOAD_FIELDS_DRIVER',myThid)
199    #endif
200          CALL TIMER_START('LOAD_FIELDS_DRIVER  [FORWARD_STEP]',myThid)
201          CALL LOAD_FIELDS_DRIVER( myTime, myIter, myThid )
202          CALL TIMER_STOP ('LOAD_FIELDS_DRIVER  [FORWARD_STEP]',myThid)
203    
204    C--   Call Bulk-Formulae forcing package
205    #ifdef ALLOW_BULK_FORCE
206          IF ( useBulkForce ) THEN
207    #ifdef ALLOW_DEBUG
208            IF ( debugLevel .GE. debLevB )
209         &   CALL DEBUG_CALL('BULKF_FORCING',myThid)
210    #endif
211            CALL TIMER_START('BULKF_FORCING       [FORWARD_STEP]',myThid)
212    C-    calculate qnet and empmr (and wind stress)
213            CALL BULKF_FORCING( myTime, myIter, myThid )
214            CALL TIMER_STOP ('BULKF_FORCING       [FORWARD_STEP]',myThid)
215          ENDIF
216    #endif /* ALLOW_BULK_FORCE */
217    
218    #ifdef ALLOW_AUTODIFF
219    c--   Add control vector for forcing and parameter fields
220          IF ( myIter .EQ. nIter0 )
221         &     CALL CTRL_MAP_FORCING (myThid)
222  #endif  #endif
223    
224  #if (defined (ALLOW_AUTODIFF_TAMC) && defined (ALLOW_AUTODIFF_MONITOR))  #if (defined (ALLOW_AUTODIFF_TAMC) && defined (ALLOW_AUTODIFF_MONITOR))
225  C       Include call to a dummy routine. Its adjoint will be        CALL DUMMY_IN_STEPPING( myTime, myIter, myThid )
 C       called at the proper place in the adjoint code.  
 C       The adjoint routine will print out adjoint values  
 C       if requested. The location of the call is important,  
 C       it has to be after the adjoint of the exchanges  
 C       (DO_GTERM_BLOCKING_EXCHANGES).  
         CALL DUMMY_IN_STEPPING( myTime, myIter, myThid )  
         CALL DO_FIELDS_BLOCKING_EXCHANGES( myThid )  
226  #endif  #endif
227    
228  #ifdef EXACT_CONSERV  #ifdef COMPONENT_MODULE
229        IF (exactConserv) THEN        IF ( useCoupler .AND. cpl_earlyExpImpCall ) THEN
230  C--   Update etaH(n+1) :  C      Post coupling data that I export.
231          DO bj=myByLo(myThid),myByHi(myThid)  C      Read in coupling data that I import.
232           DO bi=myBxLo(myThid),myBxHi(myThid)           CALL TIMER_START('CPL_EXPORT-IMPORT  [FORWARD_STEP]',myThid)
233             CALL CALC_EXACT_ETA( .FALSE., bi,bj, uVel,vVel,           CALL CPL_EXPORT_MY_DATA(       myIter, myTime, myThid )
234       I                          myTime, myIter, myThid )           CALL CPL_IMPORT_EXTERNAL_DATA( myIter, myTime, myThid )
235           ENDDO           CALL TIMER_STOP ('CPL_EXPORT-IMPORT  [FORWARD_STEP]',myThid)
         ENDDO  
         IF (implicDiv2Dflow .NE. 1. _d 0 .OR. useOBCS )  
      &     _EXCH_XY_R8(etaH, myThid )  
236        ENDIF        ENDIF
237  #endif /* EXACT_CONSERV */  #endif /* COMPONENT_MODULE */
238    
239  #ifdef NONLIN_FRSURF  #ifdef ALLOW_EBM
240  C--   compute the future surface level thickness        IF ( useEBM ) THEN
241  C      according to etaH(n+1)  # ifdef ALLOW_DEBUG
242          IF ( nonlinFreeSurf.GT.0) THEN           IF ( debugLevel .GE. debLevB )
243            CALL CALC_SURF_DR(etaH, myTime, myIter, myThid )       &    CALL DEBUG_CALL('EBM',myThid)
244          ENDIF  # endif
245  #endif /* NONLIN_FRSURF */           CALL TIMER_START('EBM                [FORWARD_STEP]',myThid)
246             CALL EBM_DRIVER ( myTime, myIter, myThid )
247             CALL TIMER_STOP ('EBM                [FORWARD_STEP]',myThid)
248          ENDIF
249    #endif /* ALLOW_EBM */
250    
251    C--     Step forward fields and calculate time tendency terms.
252    
253    #ifdef ALLOW_DEBUG
254          IF ( debugLevel .GE. debLevB )
255         & CALL DEBUG_CALL('DO_ATMOSPHERIC_PHYS',myThid)
256    #endif
257          CALL TIMER_START('DO_ATMOSPHERIC_PHYS [FORWARD_STEP]',myThid)
258          CALL DO_ATMOSPHERIC_PHYS( myTime, myIter, myThid )
259          CALL TIMER_STOP ('DO_ATMOSPHERIC_PHYS [FORWARD_STEP]',myThid)
260    
 C--     Load forcing/external data fields.  
 #ifdef INCLUDE_EXTERNAL_FORCING_PACKAGE  
 C       NOTE, that although the exf package is part of the  
 C       distribution, it is not currently maintained, i.e.  
 C       exf is disabled by default in genmake.  
261  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
262  c**************************************  CADJ STORE surfaceforcingtice    = comlev1, key = ikey_dynamics
263  #include "checkpoint_lev1_directives.h"  # ifdef ALLOW_KPP
264  c**************************************  CADJ STORE uvel               = comlev1, key = ikey_dynamics
265    CADJ STORE vvel               = comlev1, key = ikey_dynamics
266    # endif
267    # ifdef EXACT_CONSERV
268    cphCADJ STORE empmr              = comlev1, key = ikey_dynamics
269    cphCADJ STORE pmepr              = comlev1, key = ikey_dynamics
270    # endif
271    # ifdef ALLOW_PTRACERS
272    CADJ STORE ptracer               = comlev1, key = ikey_dynamics
273    # endif
274    # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
275    cph-test
276    CADJ STORE hFacC                 = comlev1, key = ikey_dynamics
277    #  ifndef DISABLE_RSTAR_CODE
278    CADJ STORE rstarexpc             = comlev1, key = ikey_dynamics
279    #  endif
280    # endif
281    #endif /* ALLOW_AUTODIFF_TAMC */
282    
283    #ifndef ALLOW_AUTODIFF_TAMC
284          IF ( .NOT. useOffLine ) THEN
285  #endif  #endif
286          CALL EXF_GETFORCING( mytime, myiter, mythid )  #ifdef ALLOW_DEBUG
287           IF ( debugLevel .GE. debLevB )
288         &    CALL DEBUG_CALL('DO_OCEANIC_PHYS',myThid)
289    #endif
290           CALL TIMER_START('DO_OCEANIC_PHYS     [FORWARD_STEP]',myThid)
291           CALL DO_OCEANIC_PHYS( myTime, myIter, myThid )
292           CALL TIMER_STOP ('DO_OCEANIC_PHYS     [FORWARD_STEP]',myThid)
293    #ifdef ALLOW_AUTODIFF_TAMC
294    CADJ STORE EmPmR    = comlev1, key = ikey_dynamics
295    # ifdef EXACT_CONSERV
296    CADJ STORE pmepr    = comlev1, key = ikey_dynamics
297    # endif
298  #else  #else
299          CALL TIMER_START('EXTERNAL_FIELDS_LOAD[THE_MAIN_LOOP]',mythid)        ENDIF
         CALL EXTERNAL_FIELDS_LOAD( mytime, myiter, mythid )  
         CALL TIMER_STOP ('EXTERNAL_FIELDS_LOAD[THE_MAIN_LOOP]',mythid)  
300  #endif  #endif
301    
302  C--     Step forward fields and calculate time tendency terms.  #ifdef ALLOW_AUTODIFF_TAMC
303          CALL TIMER_START('THERMODYNAMICS      [THE_MAIN_LOOP]',mythid)  # ifdef NONLIN_FRSURF
304          CALL THERMODYNAMICS( myTime, myIter, myThid )  cph-test
305          CALL TIMER_STOP ('THERMODYNAMICS      [THE_MAIN_LOOP]',mythid)  CADJ STORE hFac_surfC         = comlev1, key = ikey_dynamics
306    CADJ STORE hfac_surfs         = comlev1, key = ikey_dynamics
307    CADJ STORE hfac_surfw         = comlev1, key = ikey_dynamics
308    # endif
309    # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
310    CADJ STORE hFacC, hFacS, hFacW
311    CADJ &     = comlev1, key = ikey_dynamics
312    CADJ STORE recip_hFacC, recip_hFacS, recip_hFacW
313    CADJ &     = comlev1, key = ikey_dynamics
314    c
315    CADJ STORE surfaceforcingu = comlev1, key = ikey_dynamics
316    CADJ STORE surfaceforcingv = comlev1, key = ikey_dynamics
317    # endif
318    #endif /* ALLOW_AUTODIFF_TAMC */
319    
320  #ifdef ALLOW_SHAP_FILT  #ifdef ALLOW_GCHEM
321         IF (useSHAP_FILT .AND.  C     GCHEM package is an interface for any bio-geochemical or
322       &     staggerTimeStep .AND. shap_filt_TrStagg ) THEN  C     ecosystem model you would like to include.
323          CALL TIMER_START('SHAP_FILT           [THE_MAIN_LOOP]',myThid)  C     If GCHEM_SEPARATE_FORCING is not defined, you are
324          CALL SHAP_FILT_APPLY_TS( gT, gS, myTime, myIter, myThid )  C     responsible for computing tendency terms for passive
325          CALL TIMER_STOP ('SHAP_FILT           [THE_MAIN_LOOP]',myThid)  C     tracers and storing them on a 3DxNumPtracers-array called
326         ENDIF  C     gchemTendency in GCHEM_CALC_TENDENCY. This tendency is then added
327    C     to gPtr in ptracers_forcing later-on.
328    C     If GCHEM_SEPARATE_FORCING is defined, you are reponsible for
329    C     UPDATING ptracers directly in GCHEM_FORCING_SEP. This amounts
330    C     to a completely separate time step that you have to implement
331    C     yourself (Eulerian seems to be fine in most cases).
332    CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
333    C     CAVEAT: Up to now, when GCHEM is turned on the field ptracerForcingSurf,
334    C     which is needed for KPP is not set properly. ptracerForcingSurf must
335    C     be treated differently depending on whether GCHEM_SEPARATE_FORCING
336    C     is define or not. TBD.
337    CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
338    #ifdef ALLOW_AUTODIFF_TAMC
339    CADJ STORE ptracer  = comlev1, key = ikey_dynamics
340    CADJ STORE theta  = comlev1, key = ikey_dynamics
341    CADJ STORE salt  = comlev1, key = ikey_dynamics
342    #endif
343          IF ( useGCHEM ) THEN
344    #ifdef ALLOW_DEBUG
345            IF ( debugLevel .GE. debLevB )
346         &       CALL DEBUG_CALL('GCHEM_CALC_TENDENCY',myThid)
347    #endif
348            CALL TIMER_START('GCHEM_CALC_TENDENCY [FORWARD_STEP]',myThid)
349            CALL GCHEM_CALC_TENDENCY( myTime, myIter, myThid )
350            CALL TIMER_STOP ('GCHEM_CALC_TENDENCY [FORWARD_STEP]',myThid)
351          ENDIF
352    #endif /* ALLOW_GCHEM */
353    
354    #ifdef ALLOW_AUTODIFF_TAMC
355    cph needed to be moved here from do_oceanic_physics
356    cph to be visible down the road
357    c
358    CADJ STORE surfaceForcingS    = comlev1, key = ikey_dynamics
359    CADJ STORE surfaceForcingT    = comlev1, key = ikey_dynamics
360    CADJ STORE surfaceForcingTice = comlev1, key = ikey_dynamics
361    ctest(
362    CADJ STORE IVDConvCount       = comlev1, key = ikey_dynamics
363    ctest)
364    # ifdef ALLOW_PTRACERS
365    CADJ STORE surfaceForcingPTr  = comlev1, key = ikey_dynamics
366    # endif
367    c
368    # ifdef ALLOW_GMREDI
369    CADJ STORE Kwx                = comlev1, key = ikey_dynamics
370    CADJ STORE Kwy                = comlev1, key = ikey_dynamics
371    CADJ STORE Kwz                = comlev1, key = ikey_dynamics
372    #  ifdef GM_BOLUS_ADVEC
373    CADJ STORE GM_PsiX            = comlev1, key = ikey_dynamics
374    CADJ STORE GM_PsiY            = comlev1, key = ikey_dynamics
375    #  endif
376    # endif
377    c
378    # ifdef ALLOW_KPP
379    CADJ STORE KPPghat            = comlev1, key = ikey_dynamics
380    CADJ STORE KPPfrac            = comlev1, key = ikey_dynamics
381    CADJ STORE KPPdiffKzS         = comlev1, key = ikey_dynamics
382    CADJ STORE KPPdiffKzT         = comlev1, key = ikey_dynamics
383    # endif
384    c
385    # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
386    CADJ STORE etaH               = comlev1, key = ikey_dynamics
387    #  ifdef ALLOW_CD_CODE
388    CADJ STORE etanm1             = comlev1, key = ikey_dynamics
389    #  endif
390    #  ifndef DISABLE_RSTAR_CODE
391    cph-test
392    CADJ STORE rstarexpc = comlev1, key = ikey_dynamics
393    #  endif
394    # endif
395    #endif /* ALLOW_AUTODIFF_TAMC */
396    
397          IF ( .NOT.staggerTimeStep ) THEN
398    #ifdef ALLOW_DEBUG
399            IF ( debugLevel .GE. debLevB )
400         &    CALL DEBUG_CALL('THERMODYNAMICS',myThid)
401  #endif  #endif
402  #ifdef ALLOW_ZONAL_FILT          CALL TIMER_START('THERMODYNAMICS      [FORWARD_STEP]',myThid)
403         IF (useZONAL_FILT .AND.          CALL THERMODYNAMICS( myTime, myIter, myThid )
404       &     staggerTimeStep .AND. zonal_filt_TrStagg ) THEN          CALL TIMER_STOP ('THERMODYNAMICS      [FORWARD_STEP]',myThid)
405          CALL TIMER_START('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)  C--    if not staggerTimeStep: end
         CALL ZONAL_FILT_APPLY_TS( gT, gS, myThid )  
         CALL TIMER_STOP ('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)  
406        ENDIF        ENDIF
407  #endif    c #ifdef ALLOW_NONHYDROSTATIC
408          IF ( implicitIntGravWave ) THEN
409            CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
410            CALL DO_STAGGER_FIELDS_EXCHANGES( myTime, myIter, myThid )
411            CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
412          ENDIF
413    c #endif
414    
415  C--     Step forward fields and calculate time tendency terms.  #ifdef COMPONENT_MODULE
416          IF ( momStepping ) THEN        IF ( useCoupler .AND. .NOT.cpl_earlyExpImpCall ) THEN
417          CALL TIMER_START('DYNAMICS            [THE_MAIN_LOOP]',mythid)  C      Post coupling data that I export.
418          CALL DYNAMICS( myTime, myIter, myThid )  C      Read in coupling data that I import.
419          CALL TIMER_STOP ('DYNAMICS            [THE_MAIN_LOOP]',mythid)           myItP1 = myIter + 1
420             CALL TIMER_START('CPL_EXPORT-IMPORT  [FORWARD_STEP]',myThid)
421             CALL CPL_EXPORT_MY_DATA(       myItP1, myTime, myThid )
422             CALL CPL_IMPORT_EXTERNAL_DATA( myItP1, myTime, myThid )
423             CALL TIMER_STOP ('CPL_EXPORT-IMPORT  [FORWARD_STEP]',myThid)
424    # ifdef ALLOW_OCN_COMPON_INTERF
425            IF ( useRealFreshWaterFlux ) THEN
426             CALL OCN_APPLY_IMPORT( .FALSE., myTime, myIter, myThid )
427          ENDIF          ENDIF
428    # endif /* ALLOW_OCN_COMPON_INTERF */
429          ENDIF
430    #endif /* COMPONENT_MODULE */
431    
432  #ifdef ALLOW_NONHYDROSTATIC  #ifdef ALLOW_AUTODIFF_TAMC
433  C--   Step forward W field in N-H algorithm  # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
434          IF ( momStepping .AND. nonHydrostatic ) THEN  CADJ STORE hFacC          = comlev1, key = ikey_dynamics
435            CALL TIMER_START('CALC_GW          [THE_MAIN_LOOP]',myThid)  CADJ STORE hFacS          = comlev1, key = ikey_dynamics
436            CALL CALC_GW(myThid)  CADJ STORE hFacW          = comlev1, key = ikey_dynamics
437            CALL TIMER_STOP ('CALC_GW          [THE_MAIN_LOOP]',myThid)  CADJ STORE recip_hFacC    = comlev1, key = ikey_dynamics
438          ENDIF  CADJ STORE recip_hFacS    = comlev1, key = ikey_dynamics
439    CADJ STORE recip_hFacW    = comlev1, key = ikey_dynamics
440    CADJ STORE etaN           = comlev1, key = ikey_dynamics
441    c
442    #  ifndef DISABLE_RSTAR_CODE
443    CADJ STORE rstarFacC    = comlev1, key = ikey_dynamics
444    CADJ STORE rstarFacS    = comlev1, key = ikey_dynamics
445    CADJ STORE rstarFacW    = comlev1, key = ikey_dynamics
446    c
447    CADJ STORE h0facc,h0facs,h0facw  
448    CADJ &     = comlev1, key = ikey_dynamics
449    CADJ STORE rstardhcdt,rstardhsdt,rstardhwdt
450    CADJ &     = comlev1, key = ikey_dynamics
451    CADJ STORE rstarexpc,rstarexps,rstarexpw
452    CADJ &     = comlev1, key = ikey_dynamics
453    #  endif
454    # endif
455    #endif
456    C--   Step forward fields and calculate time tendency terms.
457    #ifndef ALLOW_AUTODIFF_TAMC
458          IF ( momStepping ) THEN
459    #endif
460    #ifdef ALLOW_DEBUG
461            IF ( debugLevel .GE. debLevB )
462         &    CALL DEBUG_CALL('DYNAMICS',myThid)
463    #endif
464            CALL TIMER_START('DYNAMICS            [FORWARD_STEP]',myThid)
465            CALL DYNAMICS( myTime, myIter, myThid )
466            CALL TIMER_STOP ('DYNAMICS            [FORWARD_STEP]',myThid)
467    #ifndef ALLOW_AUTODIFF_TAMC
468          ENDIF
469    #endif
470    
471    #ifdef ALLOW_AUTODIFF_TAMC
472    # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
473    cph-test
474    CADJ STORE gU, gV  = comlev1, key = ikey_dynamics
475    # endif
476  #endif  #endif
477    
478    C--   Update time-counter
479          myIter = nIter0 + iLoop
480          myTime = startTime + deltaTClock * float(iLoop)
481    
482    #ifdef ALLOW_MNC
483    C     Update the default next iter for MNC
484          IF ( useMNC ) THEN
485             CALL MNC_CW_CITER_SETG( 1, 1, -1, myIter , myThid )
486    
487    C        TODO: Logic should be added here so that users can specify, on
488    C        a per-citer-group basis, when it is time to update the
489    C        "current" (and not just the "next") iteration
490    
491    C        TODO: the following is just a temporary band-aid (mostly, for
492    C        Baylor) until someone writes a routine that better handles time
493    C        boundaries such as weeks, months, years, etc.
494             IF ( mnc_filefreq .GT. 0 ) THEN
495               IF (DIFFERENT_MULTIPLE(mnc_filefreq,myTime,deltaTClock))
496         &          THEN
497                 CALL MNC_CW_CITER_SETG( 1, 1, myIter, -1 , myThid )
498               ENDIF
499             ENDIF
500          ENDIF
501    #endif /* ALLOW_MNC */
502    
503    C--   Update geometric factors:
504  #ifdef NONLIN_FRSURF  #ifdef NONLIN_FRSURF
505  C--   update hfacC,W,S and recip_hFac according to etaH(n+1) :  C-    update hfacC,W,S and recip_hFac according to etaH(n+1) :
       IF ( momStepping ) THEN  
506        IF ( nonlinFreeSurf.GT.0) THEN        IF ( nonlinFreeSurf.GT.0) THEN
507           IF ( select_rStar.GT.0 ) THEN
508    # ifndef DISABLE_RSTAR_CODE
509    # ifdef ALLOW_AUTODIFF_TAMC
510    cph-test
511    CADJ STORE hFacC    = comlev1, key = ikey_dynamics
512    CADJ STORE hFacS    = comlev1, key = ikey_dynamics
513    CADJ STORE hFacW    = comlev1, key = ikey_dynamics
514    CADJ STORE recip_hFacC    = comlev1, key = ikey_dynamics
515    CADJ STORE recip_hFacS    = comlev1, key = ikey_dynamics
516    CADJ STORE recip_hFacW    = comlev1, key = ikey_dynamics
517    c
518    CADJ STORE rstarFacC    = comlev1, key = ikey_dynamics
519    CADJ STORE rstarFacS    = comlev1, key = ikey_dynamics
520    CADJ STORE rstarFacW    = comlev1, key = ikey_dynamics
521    c
522    CADJ STORE h0facc,h0facs,h0facw  = comlev1, key = ikey_dynamics
523    # endif
524            CALL TIMER_START('UPDATE_R_STAR       [FORWARD_STEP]',myThid)
525            CALL UPDATE_R_STAR( myTime, myIter, myThid )
526            CALL TIMER_STOP ('UPDATE_R_STAR       [FORWARD_STEP]',myThid)
527    # ifdef ALLOW_AUTODIFF_TAMC
528    cph-test
529    CADJ STORE hFacC    = comlev1, key = ikey_dynamics
530    CADJ STORE hFacS    = comlev1, key = ikey_dynamics
531    CADJ STORE hFacW    = comlev1, key = ikey_dynamics
532    CADJ STORE recip_hFacC    = comlev1, key = ikey_dynamics
533    CADJ STORE recip_hFacS    = comlev1, key = ikey_dynamics
534    CADJ STORE recip_hFacW    = comlev1, key = ikey_dynamics
535    # endif
536    # endif /* DISABLE_RSTAR_CODE */
537           ELSE
538    #ifdef ALLOW_AUTODIFF_TAMC
539    CADJ STORE hFac_surfC, hFac_surfS, hFac_surfW
540    CADJ &     = comlev1, key = ikey_dynamics
541    #endif
542            CALL TIMER_START('UPDATE_SURF_DR      [FORWARD_STEP]',myThid)
543          CALL UPDATE_SURF_DR( myTime, myIter, myThid )          CALL UPDATE_SURF_DR( myTime, myIter, myThid )
544            CALL TIMER_STOP ('UPDATE_SURF_DR      [FORWARD_STEP]',myThid)
545           ENDIF
546        ENDIF        ENDIF
547    # ifdef ALLOW_AUTODIFF_TAMC
548    cph-test
549    CADJ STORE hFacC    = comlev1, key = ikey_dynamics
550    CADJ STORE hFacS    = comlev1, key = ikey_dynamics
551    CADJ STORE hFacW    = comlev1, key = ikey_dynamics
552    CADJ STORE recip_hFacC    = comlev1, key = ikey_dynamics
553    CADJ STORE recip_hFacS    = comlev1, key = ikey_dynamics
554    CADJ STORE recip_hFacW    = comlev1, key = ikey_dynamics
555    # endif
556  C-    update also CG2D matrix (and preconditioner)  C-    update also CG2D matrix (and preconditioner)
557        IF ( nonlinFreeSurf.GT.2) THEN        IF ( momStepping .AND. nonlinFreeSurf.GT.2 ) THEN
558            CALL TIMER_START('UPDATE_CG2D         [FORWARD_STEP]',myThid)
559          CALL UPDATE_CG2D( myTime, myIter, myThid )          CALL UPDATE_CG2D( myTime, myIter, myThid )
560            CALL TIMER_STOP ('UPDATE_CG2D         [FORWARD_STEP]',myThid)
561        ENDIF        ENDIF
562        ENDIF  #endif /* NONLIN_FRSURF */
 #endif  
563    
564  C--   Apply Filters to u*,v* before SOLVE_FOR_PRESSURE  C--   Apply Filters to u*,v* before SOLVE_FOR_PRESSURE
565  #ifdef ALLOW_SHAP_FILT  #ifdef ALLOW_SHAP_FILT
566        IF (useSHAP_FILT .AND. shap_filt_uvStar) THEN        IF (useSHAP_FILT .AND. shap_filt_uvStar) THEN
567          CALL TIMER_START('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('SHAP_FILT_UV        [FORWARD_STEP]',myThid)
         CALL SHAP_FILT_APPLY_UV( gUnm1,gVnm1, myTime,myIter,myThid )  
568          IF (implicDiv2Dflow.LT.1.) THEN          IF (implicDiv2Dflow.LT.1.) THEN
569  C--   Explicit+Implicit part of the Barotropic Flow Divergence  C--   Explicit+Implicit part of the Barotropic Flow Divergence
570  C      => Filtering of uVel,vVel is necessary  C      => Filtering of uVel,vVel is necessary
571            CALL SHAP_FILT_APPLY_UV( uVel,vVel, myTime,myIter,myThid )            CALL SHAP_FILT_APPLY_UV( uVel,vVel,
572         &                             myTime, myIter, myThid )
573          ENDIF          ENDIF
574          CALL TIMER_STOP ('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL SHAP_FILT_APPLY_UV( gU,gV,myTime,myIter,myThid)
575            CALL TIMER_STOP ('SHAP_FILT_UV        [FORWARD_STEP]',myThid)
576        ENDIF        ENDIF
577  #endif  #endif
578  #ifdef ALLOW_ZONAL_FILT  #ifdef ALLOW_ZONAL_FILT
579        IF (useZONAL_FILT .AND. zonal_filt_uvStar) THEN        IF (useZONAL_FILT .AND. zonal_filt_uvStar) THEN
580          CALL TIMER_START('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('ZONAL_FILT_UV       [FORWARD_STEP]',myThid)
         CALL ZONAL_FILT_APPLY_UV( gUnm1, gVnm1, myThid )  
581          IF (implicDiv2Dflow.LT.1.) THEN          IF (implicDiv2Dflow.LT.1.) THEN
582  C--   Explicit+Implicit part of the Barotropic Flow Divergence  C--   Explicit+Implicit part of the Barotropic Flow Divergence
583  C      => Filtering of uVel,vVel is necessary  C      => Filtering of uVel,vVel is necessary
584            CALL ZONAL_FILT_APPLY_UV( uVel, vVel, myThid )            CALL ZONAL_FILT_APPLY_UV( uVel, vVel, myThid )
585          ENDIF          ENDIF
586          CALL TIMER_STOP ('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL ZONAL_FILT_APPLY_UV( gU, gV, myThid )
587            CALL TIMER_STOP ('ZONAL_FILT_UV       [FORWARD_STEP]',myThid)
588        ENDIF        ENDIF
589  #endif    #endif
590    
591  C--   Solve elliptic equation(s).  C--   Solve elliptic equation(s).
592  C     Two-dimensional only for conventional hydrostatic or  C     Two-dimensional only for conventional hydrostatic or
593  C     three-dimensional for non-hydrostatic and/or IGW scheme.  C     three-dimensional for non-hydrostatic and/or IGW scheme.
594        IF ( momStepping ) THEN        IF ( momStepping ) THEN
595        CALL TIMER_START('SOLVE_FOR_PRESSURE  [THE_MAIN_LOOP]',myThid)  #ifdef ALLOW_AUTODIFF_TAMC
596        CALL SOLVE_FOR_PRESSURE(myTime, myIter, myThid)  # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
597        CALL TIMER_STOP ('SOLVE_FOR_PRESSURE  [THE_MAIN_LOOP]',myThid)  CADJ STORE uvel, vvel
598    CADJ &     = comlev1, key = ikey_dynamics
599    CADJ STORE empmr,hfacs,hfacw
600    CADJ &     = comlev1, key = ikey_dynamics
601    # endif
602    #endif
603            CALL TIMER_START('SOLVE_FOR_PRESSURE  [FORWARD_STEP]',myThid)
604            CALL SOLVE_FOR_PRESSURE(myTime, myIter, myThid)
605            CALL TIMER_STOP ('SOLVE_FOR_PRESSURE  [FORWARD_STEP]',myThid)
606        ENDIF        ENDIF
607    
608  C--   Correct divergence in flow field and cycle time-stepping  C--   Correct divergence in flow field and cycle time-stepping momentum
609  C     arrays (for all fields) ; update time-counter  #ifndef ALLOW_AUTODIFF_TAMC
610        myIter = nIter0 + iLoop        IF ( momStepping ) THEN
611        myTime = startTime + deltaTClock * float(iLoop)  #endif
612        CALL TIMER_START('THE_CORRECTION_STEP [THE_MAIN_LOOP]',myThid)  #ifdef ALLOW_AUTODIFF_TAMC
613        CALL THE_CORRECTION_STEP(myTime, myIter, myThid)  # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
614        CALL TIMER_STOP ('THE_CORRECTION_STEP [THE_MAIN_LOOP]',myThid)  #  ifndef DISABLE_RSTAR_CODE
615    cph-test
616    cph not clear, why this one
617    CADJ STORE h0facc = comlev1, key = ikey_dynamics
618    #  endif
619    # endif
620    # ifdef ALLOW_DEPTH_CONTROL
621    CADJ STORE etan, uvel,vvel
622    CADJ &     = comlev1, key = ikey_dynamics
623    # endif
624    #endif
625            CALL TIMER_START('MOM_CORRECTION_STEP [FORWARD_STEP]',myThid)
626            CALL MOMENTUM_CORRECTION_STEP(myTime, myIter, myThid)
627            CALL TIMER_STOP ('MOM_CORRECTION_STEP [FORWARD_STEP]',myThid)
628    #ifndef ALLOW_AUTODIFF_TAMC
629          ENDIF
630    #endif
631    
632    #ifdef EXACT_CONSERV
633          IF (exactConserv) THEN
634    C--   Update etaH(n+1) :
635            CALL TIMER_START('UPDATE_ETAH         [FORWARD_STEP]',myThid)
636            CALL UPDATE_ETAH( myTime, myIter, myThid )
637            CALL TIMER_STOP ('UPDATE_ETAH         [FORWARD_STEP]',myThid)
638          ENDIF
639    #endif /* EXACT_CONSERV */
640    
641    #ifdef NONLIN_FRSURF
642          IF ( select_rStar.NE.0 ) THEN
643    # ifndef DISABLE_RSTAR_CODE
644    #  ifdef ALLOW_AUTODIFF_TAMC
645    cph-test
646    CADJ STORE rstarfacc,rstarfacs,rstarfacw = comlev1, key = ikey_dynamics
647    #  endif
648    C--   r* : compute the future level thickness according to etaH(n+1)
649            CALL TIMER_START('CALC_R_STAR         [FORWARD_STEP]',myThid)
650            CALL CALC_R_STAR(etaH, myTime, myIter, myThid )
651            CALL TIMER_STOP ('CALC_R_STAR         [FORWARD_STEP]',myThid)
652    # endif /* DISABLE_RSTAR_CODE */
653          ELSEIF ( nonlinFreeSurf.GT.0) THEN
654    C--   compute the future surface level thickness according to etaH(n+1)
655    # ifdef ALLOW_AUTODIFF_TAMC
656    CADJ STORE etaH          = comlev1, key = ikey_dynamics
657    # endif
658            CALL TIMER_START('CALC_SURF_DR      [FORWARD_STEP]',myThid)
659            CALL CALC_SURF_DR(etaH, myTime, myIter, myThid )
660            CALL TIMER_STOP ('CALC_SURF_DR      [FORWARD_STEP]',myThid)
661          ENDIF
662    # ifdef ALLOW_AUTODIFF_TAMC
663    cph-test
664    CADJ STORE hFac_surfC    = comlev1, key = ikey_dynamics
665    # endif
666    #endif /* NONLIN_FRSURF */
667    
668    C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
669          IF ( staggerTimeStep ) THEN
670    C--   do exchanges of U,V (needed for multiDim) when using stagger time-step :
671    #ifdef ALLOW_DEBUG
672            IF ( debugLevel .GE. debLevB )
673         &   CALL DEBUG_CALL('DO_STAGGER_FIELDS_EXCH.',myThid)
674    #endif
675            CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
676            CALL DO_STAGGER_FIELDS_EXCHANGES( myTime, myIter, myThid )
677            CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
678    
679    #ifdef ALLOW_DIAGNOSTICS
680    C--   State-variables diagnostics
681            IF ( useDiagnostics ) THEN
682              CALL TIMER_START('DO_STATEVARS_DIAGS  [FORWARD_STEP]',myThid)
683              CALL DO_STATEVARS_DIAGS( myTime, 1, myIter, myThid )
684              CALL TIMER_STOP ('DO_STATEVARS_DIAGS  [FORWARD_STEP]',myThid)
685            ENDIF
686    #endif
687    
688    #ifdef ALLOW_DEBUG
689            IF ( debugLevel .GE. debLevB )
690         &   CALL DEBUG_CALL('THERMODYNAMICS',myThid)
691    #endif
692            CALL TIMER_START('THERMODYNAMICS      [FORWARD_STEP]',myThid)
693            CALL THERMODYNAMICS( myTime, myIter, myThid )
694            CALL TIMER_STOP ('THERMODYNAMICS      [FORWARD_STEP]',myThid)
695    
696    C--    if staggerTimeStep: end
697          ENDIF
698    C---+--------+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
699    
700    #ifdef ALLOW_AUTODIFF_TAMC
701    cph This is needed because convective_adjustment calls
702    cph find_rho which may use pressure()
703    CADJ STORE totphihyd  = comlev1, key = ikey_dynamics
704    #endif
705    C--   Cycle time-stepping Tracers arrays (T,S,+pTracers)
706          CALL TIMER_START('TRC_CORRECTION_STEP [FORWARD_STEP]',myThid)
707          CALL TRACERS_CORRECTION_STEP(myTime, myIter, myThid)
708          CALL TIMER_STOP ('TRC_CORRECTION_STEP [FORWARD_STEP]',myThid)
709    
710    #ifdef ALLOW_GCHEM
711    C     Add separate timestepping of chemical/biological/forcing
712    C     of ptracers here in GCHEM_FORCING_SEP
713    #ifdef ALLOW_AUTODIFF_TAMC
714    CADJ STORE ptracer  = comlev1, key = ikey_dynamics
715    CADJ STORE theta  = comlev1, key = ikey_dynamics
716    CADJ STORE salt  = comlev1, key = ikey_dynamics
717    #endif
718          IF ( useGCHEM ) THEN
719    #ifdef ALLOW_DEBUG
720             IF ( debugLevel .GE. debLevB )
721         &    CALL DEBUG_CALL('GCHEM_FORCING_SEP',myThid)
722    #endif /* ALLOW_DEBUG */
723             CALL TIMER_START('GCHEM_FORCING_SEP  [FORWARD_STEP]',myThid)
724             CALL GCHEM_FORCING_SEP( myTime,myIter,myThid )
725             CALL TIMER_STOP ('GCHEM_FORCING_SEP  [FORWARD_STEP]',myThid)
726          ENDIF
727    #endif /* ALLOW_GCHEM */
728    
729  C--   Do "blocking" sends and receives for tendency "overlap" terms  C--   Do "blocking" sends and receives for tendency "overlap" terms
730  c     CALL TIMER_START('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)  c     CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
731  c     CALL DO_GTERM_BLOCKING_EXCHANGES( myThid )  c     CALL DO_GTERM_BLOCKING_EXCHANGES( myThid )
732  c     CALL TIMER_STOP ('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)  c     CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
733    
734  C--   Do "blocking" sends and receives for field "overlap" terms  C--   Do "blocking" sends and receives for field "overlap" terms
735        CALL TIMER_START('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
736        CALL DO_FIELDS_BLOCKING_EXCHANGES( myThid )        CALL DO_FIELDS_BLOCKING_EXCHANGES( myThid )
737        CALL TIMER_STOP ('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
738    
739    #ifdef ALLOW_DIAGNOSTICS
740          IF ( useDiagnostics ) THEN
741           CALL TIMER_START('DO_STATEVARS_DIAGS  [FORWARD_STEP]',myThid)
742           CALL DO_STATEVARS_DIAGS( myTime, 2, myIter, myThid )
743           CALL TIMER_STOP ('DO_STATEVARS_DIAGS  [FORWARD_STEP]',myThid)
744          ENDIF
745    #endif
746    
747    #ifdef ALLOW_GRIDALT
748          IF (useGRIDALT) THEN
749             CALL GRIDALT_UPDATE(myThid)
750          ENDIF
751    #endif
752    
753    #ifdef ALLOW_FIZHI
754          IF (useFIZHI) THEN
755             CALL TIMER_START('FIZHI               [FORWARD_STEP]',myThid)
756             CALL STEP_FIZHI_CORR ( myTime, myIter, myThid, dTtracerLev(1) )
757             CALL TIMER_STOP ('FIZHI               [FORWARD_STEP]',myThid)
758          ENDIF
759    #endif
760    
761  #ifdef ALLOW_FLT  #ifdef ALLOW_FLT
762  C--   Calculate float trajectories  C--   Calculate float trajectories
763        IF (useFLT) THEN        IF (useFLT) THEN
764          CALL TIMER_START('FLOATS            [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('FLOATS            [FORWARD_STEP]',myThid)
765          CALL FLT_MAIN(myIter,myTime, myThid)          CALL FLT_MAIN(myIter,myTime, myThid)
766          CALL TIMER_STOP ('FLOATS            [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('FLOATS            [FORWARD_STEP]',myThid)
767        ENDIF        ENDIF
768  #endif  #endif
769    
770  #ifndef EXCLUDE_MONITOR  #ifdef ALLOW_TIMEAVE
771    C--   State-variables time-averaging
772          CALL TIMER_START('DO_STATEVARS_TAVE   [FORWARD_STEP]',myThid)
773          CALL DO_STATEVARS_TAVE( myTime, myIter, myThid )
774          CALL TIMER_STOP ('DO_STATEVARS_TAVE   [FORWARD_STEP]',myThid)
775    #endif
776    
777    #ifdef ALLOW_MONITOR
778          IF ( .NOT.useOffLine ) THEN
779  C--   Check status of solution (statistics, cfl, etc...)  C--   Check status of solution (statistics, cfl, etc...)
780        CALL MONITOR( myIter, myTime, myThid )          CALL TIMER_START('MONITOR             [FORWARD_STEP]',myThid)
781  #endif /* EXCLUDE_MONITOR */          CALL MONITOR( myIter, myTime, myThid )
782            CALL TIMER_STOP ('MONITOR             [FORWARD_STEP]',myThid)
783          ENDIF
784    #endif /* ALLOW_MONITOR */
785    
786    #ifdef ALLOW_COST
787    C--     compare model with data and compute cost function
788    C--     this is done after exchanges to allow interpolation
789          CALL TIMER_START('COST_TILE           [FORWARD_STEP]',myThid)
790          CALL COST_TILE  ( myTime, myIter, myThid )
791          CALL TIMER_STOP ('COST_TILE           [FORWARD_STEP]',myThid)
792    #endif
793    
 #ifndef ALLOW_AUTODIFF_TAMC  
794  C--   Do IO if needed.  C--   Do IO if needed.
795        CALL TIMER_START('DO_THE_MODEL_IO     [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('DO_THE_MODEL_IO     [FORWARD_STEP]',myThid)
796        CALL DO_THE_MODEL_IO( myTime, myIter, myThid )        CALL DO_THE_MODEL_IO( myTime, myIter, myThid )
797        CALL TIMER_STOP ('DO_THE_MODEL_IO     [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('DO_THE_MODEL_IO     [FORWARD_STEP]',myThid)
798    
799          modelEnd = myTime.EQ.endTime .OR. myIter.EQ.nEndIter
800    #ifdef HAVE_SIGREG
801          IF ( useSIGREG ) THEN
802            modelEnd = modelEnd .OR. ( i_got_signal.GT.0 )
803          ENDIF
804    #endif /* HAVE_SIGREG */
805    
806  C--   Save state for restarts  C--   Save state for restarts
807  C     Note:    (jmc: is it still the case after ckp35 ?)        CALL TIMER_START('DO_WRITE_PICKUP     [FORWARD_STEP]',myThid)
808  C     =====        CALL DO_WRITE_PICKUP(
809  C     Because of the ordering of the timestepping code and       I                      modelEnd, myTime, myIter, myThid )
810  C     tendency term code at end of loop model arrays hold        CALL TIMER_STOP ('DO_WRITE_PICKUP     [FORWARD_STEP]',myThid)
811  C     U,V,T,S  at "time-level" N but gu, gv, gs, gt, guNM1,...  
812  C     at "time-level" N+1/2 (guNM1 at "time-level" N+1/2 is  #ifdef HAVE_SIGREG
813  C     gu at "time-level" N-1/2) and etaN at "time-level" N+1/2.        IF ( useSIGREG ) THEN
814  C      where N = I+timeLevBase-1          IF ( modelEnd .AND. i_got_signal.GT.0 ) THEN
815  C     Thus a checkpoint contains U.0000000000, GU.0000000001 and            STOP 'Checkpoint completed -- killed by signal handler'
816  C     etaN.0000000001 in the indexing scheme used for the model          ENDIF
817  C     "state" files. This example is referred to as a checkpoint        ENDIF
818  C     at time level 1  #endif /* HAVE_SIGREG */
       CALL TIMER_START('WRITE_CHECKPOINT    [THE_MAIN_LOOP]',myThid)  
       CALL WRITE_CHECKPOINT(  
      &        .FALSE., myTime, myIter, myThid )  
       CALL TIMER_STOP ('WRITE_CHECKPOINT    [THE_MAIN_LOOP]',myThid)  
819    
820  #endif /* ALLOW_AUTODIFF_TAMC */  #ifdef ALLOW_AUTODIFF_TAMC
821          CALL AUTODIFF_INADMODE_SET( myThid )
822    #endif
823    
824    #ifdef ALLOW_SHOWFLOPS
825          CALL TIMER_START('SHOWFLOPS_INLOOP   [THE_MAIN_LOOP]', mythid)
826          CALL SHOWFLOPS_INLOOP( iloop, mythid )
827          CALL TIMER_STOP ('SHOWFLOPS_INLOOP   [THE_MAIN_LOOP]', mythid)
828    #endif
829    
830    #ifdef ALLOW_DEBUG
831          IF ( debugLevel .GE. debLevB )
832         &    CALL DEBUG_LEAVE('FORWARD_STEP',myThid)
833    #endif
834    
835          RETURN
836        END        END

Legend:
Removed from v.1.32  
changed lines
  Added in v.1.156

  ViewVC Help
Powered by ViewVC 1.1.22