/[MITgcm]/MITgcm_contrib/ksnow/press_release/code_expt/forward_step.F
ViewVC logotype

Annotation of /MITgcm_contrib/ksnow/press_release/code_expt/forward_step.F

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


Revision 1.1 - (hide annotations) (download)
Fri Dec 16 15:25:29 2016 UTC (9 years, 8 months ago) by ksnow
Branch: MAIN
Adding shelfice_remeshing files for experiment

1 ksnow 1.1 C $Header: /u/gcmpack/MITgcm_contrib/verification_other/shelfice_remeshing/code/forward_step.F,v 1.3 2016/05/05 18:16:04 dgoldberg Exp $
2     C $Name: $
3    
4     #include "PACKAGES_CONFIG.h"
5     #include "CPP_OPTIONS.h"
6    
7     #ifdef ALLOW_AUTODIFF
8     # include "AUTODIFF_OPTIONS.h"
9     #endif
10     #ifdef ALLOW_GENERIC_ADVDIFF
11     # include "GAD_OPTIONS.h"
12     #endif
13     #ifdef ALLOW_GGL90
14     # include "GGL90_OPTIONS.h"
15     #endif
16     #ifdef ALLOW_GMREDI
17     # include "GMREDI_OPTIONS.h"
18     #endif
19     #ifdef ALLOW_OBCS
20     # include "OBCS_OPTIONS.h"
21     #endif
22     #ifdef ALLOW_THSICE
23     # include "THSICE_OPTIONS.h"
24     #endif
25     #ifdef ALLOW_SEAICE
26     # include "SEAICE_OPTIONS.h"
27     #endif
28     #ifdef ALLOW_PTRACERS
29     # include "PTRACERS_OPTIONS.h"
30     #endif
31     #ifdef ALLOW_EXF
32     # include "EXF_OPTIONS.h"
33     #endif
34     #ifdef ALLOW_STREAMICE
35     # include "STREAMICE_OPTIONS.h"
36     #endif
37     #ifdef ALLOW_SHELFICE
38     # include "SHELFICE_OPTIONS.h"
39     #endif
40     #ifdef ALLOW_COST
41     # include "COST_OPTIONS.h"
42     #endif
43     #ifdef ALLOW_CTRL
44     # include "CTRL_OPTIONS.h"
45     #endif
46     #ifdef ALLOW_ECCO
47     # include "ECCO_OPTIONS.h"
48     #endif
49    
50     #define ALLOW_MOM_STEPPING
51     #if ( defined (ALLOW_AUTODIFF) && defined (ALLOW_OFFLINE) )
52     # undef ALLOW_MOM_STEPPING
53     #endif
54    
55    
56    
57    
58     CBOP
59     C !ROUTINE: FORWARD_STEP
60     C !INTERFACE:
61     SUBROUTINE FORWARD_STEP( iloop, myTime, myIter, myThid )
62    
63     C !DESCRIPTION: \bv
64     C *=================================================================
65     C | SUBROUTINE forward_step
66     C | o Step forward in time the model variables for one time-step
67     C *=================================================================
68     C | The algorithm...
69     C |
70     C | "Calculation of Gs"
71     C | ===================
72     C | This is where all the accelerations and tendencies (ie.
73     C | physics, parameterizations etc...) are calculated
74     C | rho = rho ( theta[n], salt[n] )
75     C | b = b(rho, theta)
76     C | K31 = K31 ( rho )
77     C | Gu[n] = Gu( u[n], v[n], wVel, b, ... )
78     C | Gv[n] = Gv( u[n], v[n], wVel, b, ... )
79     C | Gt[n] = Gt( theta[n], u[n], v[n], wVel, K31, ... )
80     C | Gs[n] = Gs( salt[n], u[n], v[n], wVel, K31, ... )
81     C |
82     C | "Time-stepping" or "Prediction"
83     C | ================================
84     C | The models variables are stepped forward with the appropriate
85     C | time-stepping scheme (currently we use Adams-Bashforth II)
86     C | - For momentum, the result is always *only* a "prediction"
87     C | in that the flow may be divergent and will be "corrected"
88     C | later with a surface pressure gradient.
89     C | - Normally for tracers the result is the new field at time
90     C | level [n+1} *BUT* in the case of implicit diffusion the result
91     C | is also *only* a prediction.
92     C | - We denote "predictors" with an asterisk (*).
93     C | U* = U[n] + dt x ( 3/2 Gu[n] - 1/2 Gu[n-1] )
94     C | V* = V[n] + dt x ( 3/2 Gv[n] - 1/2 Gv[n-1] )
95     C | theta[n+1] = theta[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
96     C | salt[n+1] = salt[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
97     C | With implicit diffusion:
98     C | theta* = theta[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
99     C | salt* = salt[n] + dt x ( 3/2 Gt[n] - 1/2 atG[n-1] )
100     C | (1 + dt * K * d_zz) theta[n+1] = theta*
101     C | (1 + dt * K * d_zz) salt[n+1] = salt*
102     C |
103     C | "Correction Step"
104     C | =================
105     C | Here we update the horizontal velocities with the surface
106     C | pressure such that the resulting flow is either consistent
107     C | with the free-surface evolution or the rigid-lid:
108     C | U[n] = U* + dt x d/dx P
109     C | V[n] = V* + dt x d/dy P
110     C | W[n] = W* + dt x d/dz P (NH mode)
111     C *=================================================================
112     C \ev
113    
114     C !CALLING SEQUENCE:
115     C FORWARD_STEP
116     C |
117     C |-- SHELFICE_REMESHING
118     C |
119     C |-- AUTODIFF_INADMODE_UNSET
120     C |
121     C |-- RESET_NLFS_VARS
122     C |-- UPDATE_R_STAR
123     C |-- UPDATE_SURF_DR
124     C |
125     C |-- PTRACERS_SWITCH_ONOFF
126     C |
127     C |-- DIAGNOSTICS_SWITCH_ONOFF
128     C |-- DO_STATEVARS_DIAGS
129     C |
130     C |-- NEST_CHILD_SETMEMO
131     C |-- NEST_PARENT_IO_1
132     C |
133     C |-- LOAD_FIELDS_DRIVER
134     C |
135     C |-- BULKF_FORCING
136     C |
137     C |-- CHEAPAML
138     C |
139     C |-- CTRL_MAP_FORCING
140     C |-- DUMMY_IN_STEPPING
141     C |
142     C |-- CPL_EXPORT_IMPORT_DATA
143     C |
144     C |-- OASIS_PUT
145     C |-- OASIS_GET
146     C |
147     C |-- EBM_DRIVER
148     C |
149     C |-- DO_ATMOSPHERIC_PHYS
150     C |
151     C |-- DO_OCEANIC_PHYS
152     C |
153     C |-- STREAMICE_TIMESTEP
154     C |
155     C |-- GCHEM_CALC_TENDENCY
156     C |
157     C |-- LONGSTEP_AVERAGE
158     C |-- LONGSTEP_THERMODYNAMICS
159     C |
160     C |-- THERMODYNAMICS
161     C |
162     C |-- LONGSTEP_AVERAGE
163     C |-- LONGSTEP_THERMODYNAMICS
164     C |
165     C |-- DO_STAGGER_FIELDS_EXCHANGES
166     C |
167     C |-- DYNAMICS
168     C |
169     C |-- MNC_UPDATE_TIME
170     C |
171     C |-- OFFLINE_FIELDS_LOAD
172     C |
173     C |-- UPDATE_R_STAR
174     C |-- UPDATE_SIGMA
175     C |-- UPDATE_SURF_DR
176     C |-- UPDATE_CG2D
177     C |
178     C |-- SHAP_FILT_APPLY_UV
179     C |-- ZONAL_FILT_APPLY_UV
180     C |
181     C |-- SOLVE_FOR_PRESSURE
182     C |
183     C |-- MOMENTUM_CORRECTION_STEP
184     C |
185     C |-- INTEGR_CONTINUITY
186     C |
187     C |-- CALC_R_STAR
188     C |-- CALC_SURF_DR
189     C |
190     C |-- DO_STAGGER_FIELDS_EXCHANGES
191     C |
192     C |-- DO_STATEVARS_DIAGS
193     C |
194     C |-- THERMODYNAMICS
195     C |
196     C |-- TRACERS_CORRECTION_STEP
197     C |
198     C |-- LONGSTEP_AVERAGE
199     C |-- LONGSTEP_THERMODYNAMICS
200     C |
201     C |-- GCHEM_FORCING_SEP
202     C |
203     C |-- DO_FIELDS_BLOCKING_EXCHANGES
204     C |
205     C |-- DO_STATEVARS_DIAGS
206     C |
207     C |-- GRIDALT_UPDATE
208     C |-- STEP_FIZHI_CORR
209     C |
210     C |-- FLT_MAIN
211     C |
212     C |-- DO_STATEVARS_TAVE
213     C |
214     C |-- NEST_PARENT_IO_2
215     C |-- NEST_CHILD_TRANSP
216     C |
217     C |-- MONITOR
218     C |
219     C |-- COST_TILE
220     C |
221     C |-- DO_THE_MODEL_IO
222     C |
223     C |-- PTRACERS_RESET
224     C |
225     C |-- DO_WRITE_PICKUP
226     C |
227     C |-- AUTODIFF_INADMODE_SET
228     C |
229     C |-- SHOWFLOPS_INLOOP
230    
231     C !USES:
232     IMPLICIT NONE
233     C == Global variables ==
234     #include "SIZE.h"
235     #include "EEPARAMS.h"
236     #include "PARAMS.h"
237     #include "DYNVARS.h"
238    
239     #ifdef HAVE_SIGREG
240     #include "SIGREG.h"
241     #endif
242    
243     #ifdef ALLOW_SHAP_FILT
244     # include "SHAP_FILT.h"
245     #endif
246     #ifdef ALLOW_ZONAL_FILT
247     # include "ZONAL_FILT.h"
248     #endif
249    
250     #ifdef ALLOW_LONGSTEP
251     # include "LONGSTEP_PARAMS.h"
252     # include "LONGSTEP.h"
253     #endif
254    
255     #ifdef ALLOW_AUTODIFF
256     # include "AUTODIFF_MYFIELDS.h"
257     # include "FFIELDS.h"
258     # include "SURFACE.h"
259    
260     # include "tamc.h"
261     # ifdef ALLOW_CTRL
262     # include "CTRL_SIZE.h"
263     # include "ctrl.h"
264     # include "ctrl_dummy.h"
265     # include "CTRL_GENARR.h"
266     # include "CTRL_OBCS.h"
267     # endif
268     # ifdef ALLOW_COST
269     # include "cost.h"
270     # endif
271     # ifdef ALLOW_ECCO
272     # include "ecco_cost.h"
273     # endif
274     # include "EOS.h"
275     # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
276     # include "GRID.h"
277     # endif
278     # ifdef ALLOW_GMREDI
279     # include "GMREDI.h"
280     # endif
281     # ifdef ALLOW_EXF
282     # include "EXF_FIELDS.h"
283     # include "EXF_PARAM.h"
284     # ifdef ALLOW_BULKFORMULAE
285     # include "EXF_CONSTANTS.h"
286     # endif
287     # endif
288     # ifdef ALLOW_CD_CODE
289     # include "CD_CODE_VARS.h"
290     # endif
291     # ifdef ALLOW_GENERIC_ADVDIFF
292     # include "GAD.h"
293     # include "GAD_SOM_VARS.h"
294     # endif
295     # ifdef ALLOW_GGL90
296     # include "GGL90.h"
297     # endif
298     # ifdef ALLOW_PTRACERS
299     # include "PTRACERS_SIZE.h"
300     # include "PTRACERS_FIELDS.h"
301     # endif
302     # ifdef ALLOW_GCHEM
303     # include "GCHEM_FIELDS.h"
304     # endif
305     # ifdef ALLOW_CFC
306     # include "CFC.h"
307     # endif
308     # ifdef ALLOW_DIC
309     # include "DIC_VARS.h"
310     # include "DIC_LOAD.h"
311     # include "DIC_ATMOS.h"
312     # include "DIC_COST.h"
313     # endif
314     # ifdef ALLOW_OBCS
315     # include "OBCS_PARAMS.h"
316     # include "OBCS_FIELDS.h"
317     # include "OBCS_SEAICE.h"
318     # ifdef ALLOW_PTRACERS
319     # include "OBCS_PTRACERS.h"
320     # endif
321     # endif
322     # ifdef ALLOW_THSICE
323     # include "THSICE_PARAMS.h"
324     # include "THSICE_SIZE.h"
325     # include "THSICE_VARS.h"
326     # include "THSICE_COST.h"
327     # endif
328     # ifdef ALLOW_SEAICE
329     # include "SEAICE_SIZE.h"
330     # include "SEAICE.h"
331     # include "SEAICE_COST.h"
332     # endif
333     # ifdef ALLOW_SALT_PLUME
334     # include "SALT_PLUME.h"
335     # endif
336     # ifdef ALLOW_SHELFICE
337     # include "SHELFICE.h"
338     # include "SHELFICE_COST.h"
339     # endif
340     # ifdef ALLOW_STREAMICE
341     # include "STREAMICE.h"
342     # include "STREAMICE_ADV.h"
343     # include "STREAMICE_BDRY.h"
344     # include "STREAMICE_CG.h"
345     # endif
346     # ifdef ALLOW_EBM
347     # include "EBM.h"
348     # endif
349     # ifdef ALLOW_KPP
350     # include "KPP.h"
351     # endif
352     # ifdef ALLOW_RBCS
353     # include "RBCS_SIZE.h"
354     # include "RBCS_FIELDS.h"
355     # endif
356     # ifdef ALLOW_OFFLINE
357     # include "OFFLINE.h"
358     # endif
359     # ifdef ALLOW_CG2D_NSA
360     # include "CG2D.h"
361     # endif
362     #endif /* ALLOW_AUTODIFF */
363    
364     #include "GRID.h"
365    
366     C !INPUT/OUTPUT PARAMETERS:
367     C == Routine arguments ==
368     C note: under the multi-threaded model myIter and
369     C myTime are local variables passed around as routine
370     C arguments. Although this is fiddly it saves the need to
371     C impose additional synchronisation points when they are
372     C updated.
373     C myTime :: time counter for this thread
374     C myIter :: iteration counter for this thread
375     C myThid :: thread number for this instance of the routine.
376     INTEGER iloop
377     _RL myTime
378     INTEGER myIter
379     INTEGER myThid
380    
381     C !LOCAL VARIABLES:
382     C == Local variables ==
383     C modelEnd :: true if reaching the end of the run
384     C myTimeBeg :: time at beginning of time step (needed by longstep)
385     C myIterBeg :: iteration number at beginning of time step
386     LOGICAL modelEnd
387     #ifdef ALLOW_LONGSTEP
388     INTEGER myIterBeg
389     _RL myTimeBeg
390     #endif /* ALLOW_LONGSTEP */
391     CEOP
392    
393     #ifdef ALLOW_SHELFICE
394     #ifdef ALLOW_SHELFICE_REMESHING
395     C-- Remesh shelfice
396     CALL TIMER_START('SHELFICE_REMESHING [FORWARD_STEP]',myThid)
397     CALL SHELFICE_REMESHING (myTime, myIter, myThid )
398     CALL TIMER_STOP('SHELFICE_REMESHING [FORWARD_STEP]',myThid)
399     #endif /* ALLOW_SHELFICE_REMESHING */
400     #endif /* ALLOW_SHELFICE */
401    
402    
403    
404    
405    
406     #ifdef ALLOW_DEBUG
407     IF (debugMode) CALL DEBUG_ENTER('FORWARD_STEP',myThid)
408     #endif
409    
410     #ifdef ALLOW_AUTODIFF
411     CALL AUTODIFF_INADMODE_UNSET( myThid )
412     #endif
413    
414     #ifdef ALLOW_AUTODIFF
415     C-- Reset the model iteration counter and the model time.
416     myIter = nIter0 + (iloop-1)
417     myTime = startTime + deltaTClock*(iLoop-1)
418     #endif
419    
420     #ifdef ALLOW_LONGSTEP
421     C store this for longstep_average with staggerTimeStep
422     C which is called after myIter and myTime are incremented
423     C but needs iter/time at beginning of time step
424     myIterBeg = myIter
425     myTimeBeg = myTime
426     #endif /* ALLOW_LONGSTEP */
427    
428     #ifdef ALLOW_AUTODIFF_TAMC
429     c**************************************
430     #include "checkpoint_lev1_directives.h"
431     #include "checkpoint_lev1_template.h"
432     c**************************************
433     #endif
434    
435     C-- Reset geometric factors (hFacC,W,S & recip_hFac) to their current values:
436     C added to simplify adjoint derivation - no effect in forward run
437     #ifdef NONLIN_FRSURF
438     #ifndef ALLOW_AUTODIFF
439     IF ( doResetHFactors ) THEN
440     #endif
441     CALL RESET_NLFS_VARS( myTime, myIter, myThid )
442     IF ( select_rStar.GT.0 ) THEN
443     # ifndef DISABLE_RSTAR_CODE
444     # ifdef ALLOW_AUTODIFF_TAMC
445     CADJ STORE rStarFacC, rStarFacS, rStarFacW =
446     CADJ & comlev1, key = ikey_dynamics, kind = isbyte
447     # endif
448     CALL TIMER_START('UPDATE_R_STAR [FORWARD_STEP]',myThid)
449     CALL UPDATE_R_STAR( .FALSE., myTime, myIter, myThid )
450     CALL TIMER_STOP ('UPDATE_R_STAR [FORWARD_STEP]',myThid)
451     # endif /* DISABLE_RSTAR_CODE */
452     ELSE
453     #ifdef ALLOW_AUTODIFF_TAMC
454     CADJ STORE hFac_surfC, hFac_surfS, hFac_surfW
455     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
456     #endif
457     CALL TIMER_START('UPDATE_SURF_DR [FORWARD_STEP]',myThid)
458     CALL UPDATE_SURF_DR( .FALSE., myTime, myIter, myThid )
459     CALL TIMER_STOP ('UPDATE_SURF_DR [FORWARD_STEP]',myThid)
460     ENDIF
461    
462     #ifdef ALLOW_AUTODIFF_TAMC
463     CADJ STORE hFacC, hFacS, hFacW =
464     CADJ & comlev1, key = ikey_dynamics, kind = isbyte
465     CADJ STORE recip_hFacC, recip_hFacS, recip_hFacW =
466     CADJ & comlev1, key = ikey_dynamics, kind = isbyte
467     #endif
468     #ifndef ALLOW_AUTODIFF
469     ENDIF
470     #endif
471     #endif /* NONLIN_FRSURF */
472    
473     #ifdef ALLOW_PTRACERS
474     C-- Switch on/off individual tracer time-stepping
475     IF ( usePTRACERS ) THEN
476     CALL PTRACERS_SWITCH_ONOFF( myTime, myIter, myThid )
477     ENDIF
478     #endif /* ALLOW_PTRACERS */
479    
480     C-- Switch on/off diagnostics for snap-shot output:
481     #ifdef ALLOW_DIAGNOSTICS
482     IF ( useDiagnostics ) THEN
483     CALL DIAGNOSTICS_SWITCH_ONOFF( myTime, myIter, myThid )
484     C-- State-variables diagnostics
485     CALL TIMER_START('DO_STATEVARS_DIAGS [FORWARD_STEP]',myThid)
486     CALL DO_STATEVARS_DIAGS( myTime, 0, myIter, myThid )
487     CALL TIMER_STOP ('DO_STATEVARS_DIAGS [FORWARD_STEP]',myThid)
488     ENDIF
489     #endif /* ALLOW_DIAGNOSTICS */
490    
491     #ifdef ALLOW_NEST_CHILD
492     IF ( useNEST_CHILD) THEN
493     CALL NEST_CHILD_SETMEMO( myTime, myIter, myThid )
494     ENDIF
495     #endif /* ALLOW_NEST_CHILD */
496    
497     #ifdef ALLOW_NEST_PARENT
498     IF ( useNEST_PARENT) THEN
499     CALL NEST_PARENT_IO_1( myTime, myIter, myThid )
500     ENDIF
501     #endif /* ALLOW_NEST_PARENT */
502    
503     C-- Call driver to load external forcing fields from file
504     #ifdef ALLOW_DEBUG
505     IF (debugMode) CALL DEBUG_CALL('LOAD_FIELDS_DRIVER',myThid)
506     #endif
507     #ifdef ALLOW_AUTODIFF_TAMC
508     cph Important STORE that avoids hidden recomp. of load_fields_driver
509     CADJ STORE theta = comlev1, key = ikey_dynamics,
510     CADJ & kind = isbyte
511     CADJ STORE uVel, vVel = comlev1, key = ikey_dynamics,
512     CADJ & kind = isbyte
513     #endif
514     CALL TIMER_START('LOAD_FIELDS_DRIVER [FORWARD_STEP]',myThid)
515     CALL LOAD_FIELDS_DRIVER( myTime, myIter, myThid )
516     CALL TIMER_STOP ('LOAD_FIELDS_DRIVER [FORWARD_STEP]',myThid)
517    
518     C-- Call Bulk-Formulae forcing package
519     #ifdef ALLOW_BULK_FORCE
520     IF ( useBulkForce ) THEN
521     #ifdef ALLOW_DEBUG
522     IF (debugMode) CALL DEBUG_CALL('BULKF_FORCING',myThid)
523     #endif
524     CALL TIMER_START('BULKF_FORCING [FORWARD_STEP]',myThid)
525     C- calculate qnet and empmr (and wind stress)
526     CALL BULKF_FORCING( myTime, myIter, myThid )
527     CALL TIMER_STOP ('BULKF_FORCING [FORWARD_STEP]',myThid)
528     ENDIF
529     #endif /* ALLOW_BULK_FORCE */
530    
531     C-- Call external chepaml forcing package
532     #ifdef ALLOW_CHEAPAML
533     IF ( useCheapAML ) THEN
534     #ifdef ALLOW_DEBUG
535     IF (debugMode) CALL DEBUG_CALL('CHEAPAML',myThid)
536     #endif
537     CALL TIMER_START('CHEAPAML [FORWARD_STEP]',myThid)
538     C- calculate qnet (and wind stress)
539     CALL CHEAPAML( myTime, myIter,myThid )
540     CALL TIMER_STOP ('CHEAPAML [FORWARD_STEP]',myThid)
541     ENDIF
542     #endif /*ALLOW_CHEAPAML */
543    
544     #ifdef ALLOW_CTRL
545     C-- Add control vector for forcing and parameter fields
546     IF ( ( useCTRL ).AND.( myIter .EQ. nIter0 ) )
547     & CALL CTRL_MAP_FORCING (myThid)
548     #endif
549    
550     #ifdef ALLOW_AUTODIFF_MONITOR
551     CALL DUMMY_IN_STEPPING( myTime, myIter, myThid )
552     #endif
553    
554     #ifdef COMPONENT_MODULE
555     IF ( useCoupler ) THEN
556     C Post coupling data that I export.
557     C Read in coupling data that I import.
558     CALL TIMER_START('CPL_EXPORT-IMPORT [FORWARD_STEP]',myThid)
559     CALL CPL_EXPORT_IMPORT_DATA( myTime, myIter, myThid )
560     CALL TIMER_STOP ('CPL_EXPORT-IMPORT [FORWARD_STEP]',myThid)
561     ENDIF
562     #endif /* COMPONENT_MODULE */
563     #ifdef ALLOW_OASIS
564     IF ( useOASIS ) THEN
565     CALL TIMER_START('OASIS_PUT-GET [FORWARD_STEP]',myThid)
566     C Post coupling data that I export.
567     CALL OASIS_PUT( myTime, myIter, myThid )
568     C Read in coupling data that I import.
569     CALL OASIS_GET( myTime, myIter, myThid )
570     CALL TIMER_STOP ('OASIS_PUT-GET [FORWARD_STEP]',myThid)
571     ENDIF
572     #endif /* ALLOW_OASIS */
573    
574     #ifdef ALLOW_EBM
575     IF ( useEBM ) THEN
576     # ifdef ALLOW_DEBUG
577     IF (debugMode) CALL DEBUG_CALL('EBM',myThid)
578     # endif
579     CALL TIMER_START('EBM [FORWARD_STEP]',myThid)
580     CALL EBM_DRIVER ( myTime, myIter, myThid )
581     CALL TIMER_STOP ('EBM [FORWARD_STEP]',myThid)
582     ENDIF
583     #endif /* ALLOW_EBM */
584    
585     C-- Step forward fields and calculate time tendency terms.
586    
587     #ifdef ALLOW_DEBUG
588     IF (debugMode) CALL DEBUG_CALL('DO_ATMOSPHERIC_PHYS',myThid)
589     #endif
590     CALL TIMER_START('DO_ATMOSPHERIC_PHYS [FORWARD_STEP]',myThid)
591     CALL DO_ATMOSPHERIC_PHYS( myTime, myIter, myThid )
592     CALL TIMER_STOP ('DO_ATMOSPHERIC_PHYS [FORWARD_STEP]',myThid)
593    
594     #ifdef ALLOW_AUTODIFF_TAMC
595     CADJ STORE surfaceForcingTice = comlev1, key = ikey_dynamics,
596     CADJ & kind = isbyte
597     # ifdef ALLOW_KPP
598     CADJ STORE uVel, vVel = comlev1, key = ikey_dynamics,
599     CADJ & kind = isbyte
600     # endif /* ALLOW_KPP */
601     # ifdef EXACT_CONSERV
602     CADJ STORE EmPmR = comlev1, key=ikey_dynamics, kind=isbyte
603     CADJ STORE PmEpR = comlev1, key=ikey_dynamics, kind=isbyte
604     # endif
605     # ifdef ALLOW_OBCS
606     CADJ STORE salt = comlev1, key=ikey_dynamics, kind=isbyte
607     CADJ STORE totphihyd = comlev1, key=ikey_dynamics, kind=isbyte
608     # ifdef ALLOW_OBCS_STEVENS
609     CADJ STORE gsNm1 = comlev1, key=ikey_dynamics, kind=isbyte
610     CADJ STORE gtNm1 = comlev1, key=ikey_dynamics, kind=isbyte
611     # endif
612     # endif /* ALLOW_OBCS */
613     # ifdef ALLOW_PTRACERS
614     CADJ STORE pTracer = comlev1, key = ikey_dynamics,
615     CADJ & kind = isbyte
616     # endif /* ALLOW_PTRACERS */
617     # ifdef ALLOW_DEPTH_CONTROL
618     CADJ STORE hFacC = comlev1, key = ikey_dynamics, kind = isbyte
619     # endif
620     #endif /* ALLOW_AUTODIFF_TAMC */
621    
622     #ifdef ALLOW_DEBUG
623     IF (debugMode) CALL DEBUG_CALL('DO_OCEANIC_PHYS',myThid)
624     #endif
625     CALL TIMER_START('DO_OCEANIC_PHYS [FORWARD_STEP]',myThid)
626     CALL DO_OCEANIC_PHYS( myTime, myIter, myThid )
627     CALL TIMER_STOP ('DO_OCEANIC_PHYS [FORWARD_STEP]',myThid)
628    
629     #ifdef ALLOW_STREAMICE
630     IF (useStreamIce) THEN
631     CALL STREAMICE_TIMESTEP ( myThid, myIter,
632     & iLoop, myTime )
633     ENDIF
634     #endif
635    
636     #ifdef ALLOW_AUTODIFF_TAMC
637     CADJ STORE EmPmR = comlev1, key = ikey_dynamics,
638     CADJ & kind = isbyte
639     # ifdef EXACT_CONSERV
640     CADJ STORE PmEpR = comlev1, key = ikey_dynamics,
641     CADJ & kind = isbyte
642     # endif
643     cph-test(
644     CADJ STORE surfaceForcingU = comlev1, key=ikey_dynamics, kind=isbyte
645     CADJ STORE surfaceForcingV = comlev1, key=ikey_dynamics, kind=isbyte
646     CADJ STORE qsw = comlev1, key = ikey_dynamics, kind = isbyte
647     # ifdef ATMOSPHERIC_LOADING
648     CADJ STORE phi0surf = comlev1, key = ikey_dynamics, kind = isbyte
649     # endif
650     cph-test)
651    
652     # ifdef ALLOW_DEPTH_CONTROL
653     CADJ STORE hFacC, hFacS, hFacW
654     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
655     CADJ STORE recip_hFacC, recip_hFacS, recip_hFacW
656     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
657     CADJ STORE surfaceForcingU, surfaceForcingV =
658     CADJ & comlev1, key = ikey_dynamics, kind = isbyte
659     # endif
660     #endif /* ALLOW_AUTODIFF_TAMC */
661    
662     #ifdef ALLOW_GCHEM
663     IF ( useGCHEM ) THEN
664     #ifdef ALLOW_AUTODIFF_TAMC
665     CADJ STORE pTracer = comlev1, key = ikey_dynamics,
666     CADJ & kind = isbyte
667     CADJ STORE theta, salt = comlev1, key = ikey_dynamics,
668     CADJ & kind = isbyte
669     #endif
670     #ifdef ALLOW_DEBUG
671     IF (debugMode) CALL DEBUG_CALL('GCHEM_CALC_TENDENCY',myThid)
672     #endif
673     CALL TIMER_START('GCHEM_CALC_TENDENCY [FORWARD_STEP]',myThid)
674     CALL GCHEM_CALC_TENDENCY( myTime, myIter, myThid )
675     CALL TIMER_STOP ('GCHEM_CALC_TENDENCY [FORWARD_STEP]',myThid)
676     ENDIF
677     #endif /* ALLOW_GCHEM */
678    
679     #ifdef ALLOW_AUTODIFF_TAMC
680     cph needed to be moved here from do_oceanic_physics
681     cph to be visible down the road
682    
683     CADJ STORE rhoInSitu = comlev1, key = ikey_dynamics,
684     CADJ & kind = isbyte
685     CADJ STORE surfaceForcingS = comlev1, key = ikey_dynamics,
686     CADJ & kind = isbyte
687     CADJ STORE surfaceForcingT = comlev1, key = ikey_dynamics,
688     CADJ & kind = isbyte
689     CADJ STORE surfaceForcingTice = comlev1, key = ikey_dynamics,
690     CADJ & kind = isbyte
691     CADJ STORE IVDConvCount = comlev1, key = ikey_dynamics,
692     CADJ & kind = isbyte
693     # ifdef ALLOW_PTRACERS
694     CADJ STORE surfaceForcingPTr = comlev1, key = ikey_dynamics,
695     CADJ & kind = isbyte
696     # endif
697    
698     # ifdef ALLOW_GMREDI
699     CADJ STORE Kwx = comlev1, key = ikey_dynamics,
700     CADJ & kind = isbyte
701     CADJ STORE Kwy = comlev1, key = ikey_dynamics,
702     CADJ & kind = isbyte
703     CADJ STORE Kwz = comlev1, key = ikey_dynamics,
704     CADJ & kind = isbyte
705     # ifdef GM_BOLUS_ADVEC
706     CADJ STORE GM_PsiX = comlev1, key = ikey_dynamics,
707     CADJ & kind = isbyte
708     CADJ STORE GM_PsiY = comlev1, key = ikey_dynamics,
709     CADJ & kind = isbyte
710     # endif
711     # endif
712    
713     # ifdef ALLOW_KPP
714     CADJ STORE KPPghat = comlev1, key = ikey_dynamics,
715     CADJ & kind = isbyte
716     CADJ STORE KPPfrac = comlev1, key = ikey_dynamics,
717     CADJ & kind = isbyte
718     CADJ STORE KPPdiffKzS = comlev1, key = ikey_dynamics,
719     CADJ & kind = isbyte
720     CADJ STORE KPPdiffKzT = comlev1, key = ikey_dynamics,
721     CADJ & kind = isbyte
722     # endif
723    
724     # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
725     CADJ STORE theta,salt = comlev1, key = ikey_dynamics, kind = isbyte
726     CADJ STORE etaH = comlev1, key = ikey_dynamics, kind = isbyte
727     # ifdef ALLOW_CD_CODE
728     CADJ STORE etaNm1 = comlev1, key = ikey_dynamics, kind = isbyte
729     # endif
730     # ifndef DISABLE_RSTAR_CODE
731     CADJ STORE rStarExpC = comlev1, key = ikey_dynamics, kind = isbyte
732     # endif
733     # endif
734     #endif /* ALLOW_AUTODIFF_TAMC */
735    
736     #ifdef ALLOW_LONGSTEP
737     IF ( usePTRACERS .AND. LS_whenToSample .EQ. 0 ) THEN
738     C Average all variables before advection (but after do_oceanic_phys
739     C where Qsw, KPP and GMRedi stuff is computed).
740     C This is like diagnostics package and will reproduce offline
741     C results.
742     #ifdef ALLOW_DEBUG
743     IF (debugMode) CALL DEBUG_CALL('LONGSTEP_AVERAGE',myThid)
744     #endif
745     CALL TIMER_START('LONGSTEP_AVERAGE [FORWARD_STEP]',myThid)
746     CALL LONGSTEP_AVERAGE( myTime, myIter, myThid )
747     CALL TIMER_STOP ('LONGSTEP_AVERAGE [FORWARD_STEP]',myThid)
748    
749     #ifdef ALLOW_DEBUG
750     IF (debugMode)
751     & CALL DEBUG_CALL('LONGSTEP_THERMODYNAMICS',myThid)
752     #endif
753     CALL TIMER_START('LONGSTEP_THERMODYNAMICS [FORWARD_STEP]',
754     & myThid)
755     CALL LONGSTEP_THERMODYNAMICS( myTime, myIter, myThid )
756     CALL TIMER_STOP ('LONGSTEP_THERMODYNAMICS [FORWARD_STEP]',
757     & myThid)
758     ENDIF
759     #endif /* ALLOW_LONGSTEP */
760    
761     IF ( .NOT.staggerTimeStep ) THEN
762     #ifdef ALLOW_AUTODIFF_TAMC
763     CADJ STORE wVel = comlev1, key = ikey_dynamics, kind = isbyte
764     #endif
765     #ifdef ALLOW_DEBUG
766     IF (debugMode) CALL DEBUG_CALL('THERMODYNAMICS',myThid)
767     #endif
768     CALL TIMER_START('THERMODYNAMICS [FORWARD_STEP]',myThid)
769     CALL THERMODYNAMICS( myTime, myIter, myThid )
770     CALL TIMER_STOP ('THERMODYNAMICS [FORWARD_STEP]',myThid)
771     C-- if not staggerTimeStep: end
772     ENDIF
773    
774     #ifdef ALLOW_LONGSTEP
775     IF ( usePTRACERS .AND. LS_whenToSample .EQ. 1 ) THEN
776     C Average T and S after thermodynamics, but U,V,W before dynamics.
777     C This will reproduce online results with staggerTimeStep=.FALSE.
778     C for LS_nIter=1
779     #ifdef ALLOW_DEBUG
780     IF (debugMode) CALL DEBUG_CALL('LONGSTEP_AVERAGE',myThid)
781     #endif
782     CALL TIMER_START('LONGSTEP_AVERAGE [FORWARD_STEP]',myThid)
783     CALL LONGSTEP_AVERAGE( myTime, myIter, myThid )
784     CALL TIMER_STOP ('LONGSTEP_AVERAGE [FORWARD_STEP]',myThid)
785    
786     #ifdef ALLOW_DEBUG
787     IF (debugMode)
788     & CALL DEBUG_CALL('LONGSTEP_THERMODYNAMICS',myThid)
789     #endif
790     CALL TIMER_START('LONGSTEP_THERMODYNAMICS [FORWARD_STEP]',
791     & myThid)
792     CALL LONGSTEP_THERMODYNAMICS( myTime, myIter, myThid )
793     CALL TIMER_STOP ('LONGSTEP_THERMODYNAMICS [FORWARD_STEP]',
794     & myThid)
795     ENDIF
796     #endif /* ALLOW_LONGSTEP */
797    
798     c #ifdef ALLOW_NONHYDROSTATIC
799     IF ( implicitIntGravWave ) THEN
800     CALL TIMER_START('BLOCKING_EXCHANGES [FORWARD_STEP]',myThid)
801     CALL DO_STAGGER_FIELDS_EXCHANGES( myTime, myIter, myThid )
802     CALL TIMER_STOP ('BLOCKING_EXCHANGES [FORWARD_STEP]',myThid)
803     ENDIF
804     c #endif
805    
806     #ifdef ALLOW_AUTODIFF_TAMC
807     CADJ STORE etaN = comlev1, key = ikey_dynamics, kind = isbyte
808     # ifdef ALLOW_DEPTH_CONTROL
809     CADJ STORE hFacC, hFacS, hFacW
810     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
811     CADJ STORE recip_hFacC, recip_hFacS, recip_hFacW
812     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
813     # endif /* ALLOW_DEPTH_CONTROL */
814     #endif /* ALLOW_AUTODIFF_TAMC */
815    
816     C-- Step forward fields and calculate time tendency terms.
817     #ifdef ALLOW_MOM_STEPPING
818     #ifndef ALLOW_AUTODIFF
819     IF ( momStepping ) THEN
820     #endif
821     #ifdef ALLOW_DEBUG
822     IF (debugMode) CALL DEBUG_CALL('DYNAMICS',myThid)
823     #endif
824     CALL TIMER_START('DYNAMICS [FORWARD_STEP]',myThid)
825     CALL DYNAMICS( myTime, myIter, myThid )
826     CALL TIMER_STOP ('DYNAMICS [FORWARD_STEP]',myThid)
827     #ifndef ALLOW_AUTODIFF
828     ENDIF
829     #endif
830     #endif /* ALLOW_MOM_STEPPING */
831    
832    
833     #ifdef ALLOW_AUTODIFF_TAMC
834     # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
835     CADJ STORE gU, gV = comlev1, key = ikey_dynamics,
836     CADJ & kind = isbyte
837     # endif
838     #endif
839    
840     C-- Update time-counter
841     myIter = nIter0 + iLoop
842     myTime = startTime + deltaTClock*iLoop
843    
844     #ifdef ALLOW_MNC
845     C Update MNC time information
846     IF ( useMNC ) THEN
847     CALL MNC_UPDATE_TIME( myTime, myIter, myThid )
848     ENDIF
849     #endif /* ALLOW_MNC */
850    
851     #ifdef ALLOW_OFFLINE
852     C Load new Offline fields and update state-variable
853     IF ( useOffLine ) THEN
854     #ifdef ALLOW_DEBUG
855     IF (debugMode) CALL DEBUG_CALL('OFFLINE_FIELDS_LOAD',myThid)
856     #endif /* ALLOW_DEBUG */
857     CALL TIMER_START('OFFLINE_FLDS_LOAD [FORWARD_STEP]',myThid)
858     CALL OFFLINE_FIELDS_LOAD( myTime, myIter, myThid )
859     CALL TIMER_STOP ('OFFLINE_FLDS_LOAD [FORWARD_STEP]',myThid)
860     ENDIF
861     #endif /* ALLOW_OFFLINE */
862    
863     C-- Update geometric factors:
864     #ifdef NONLIN_FRSURF
865     C- update hfacC,W,S and recip_hFac according to etaH(n+1) :
866     IF ( select_rStar.GT.0 ) THEN
867     # ifndef DISABLE_RSTAR_CODE
868     # ifdef ALLOW_AUTODIFF_TAMC
869     CADJ STORE rStarFacC, rStarFacS, rStarFacW =
870     CADJ & comlev1, key = ikey_dynamics, kind = isbyte
871     # endif
872     CALL TIMER_START('UPDATE_R_STAR [FORWARD_STEP]',myThid)
873     CALL UPDATE_R_STAR( .TRUE., myTime, myIter, myThid )
874     CALL TIMER_STOP ('UPDATE_R_STAR [FORWARD_STEP]',myThid)
875     # endif /* DISABLE_RSTAR_CODE */
876     ELSEIF ( selectSigmaCoord.NE.0 ) THEN
877     # ifndef DISABLE_SIGMA_CODE
878     CALL UPDATE_SIGMA( etaH, myTime, myIter, myThid )
879     # endif /* DISABLE_RSTAR_CODE */
880     ELSE
881     # ifdef ALLOW_AUTODIFF_TAMC
882    
883    
884     CADJ STORE hFac_surfC, hFac_surfS, hFac_surfW
885     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
886     # endif
887     CALL TIMER_START('UPDATE_SURF_DR [FORWARD_STEP]',myThid)
888     CALL UPDATE_SURF_DR( .TRUE., myTime, myIter, myThid )
889     CALL TIMER_STOP ('UPDATE_SURF_DR [FORWARD_STEP]',myThid)
890     ENDIF
891     # ifdef ALLOW_AUTODIFF_TAMC
892    
893    
894     CADJ STORE hFacC, hFacS, hFacW =
895     CADJ & comlev1, key = ikey_dynamics, kind = isbyte
896     CADJ STORE recip_hFacC, recip_hFacS, recip_hFacW =
897     CADJ & comlev1, key = ikey_dynamics, kind = isbyte
898     # ifdef ALLOW_CG2D_NSA
899     CADJ STORE aW2d, aS2d, aC2d =
900     CADJ & comlev1, key = ikey_dynamics, kind = isbyte
901     CADJ STORE pC, pS, pW =
902     CADJ & comlev1, key = ikey_dynamics, kind = isbyte
903     # endif
904     # endif
905    
906     C- update also CG2D matrix (and preconditioner)
907     IF ( momStepping .AND. nonlinFreeSurf.GT.2 ) THEN
908     CALL TIMER_START('UPDATE_CG2D [FORWARD_STEP]',myThid)
909     CALL UPDATE_CG2D( myTime, myIter, myThid )
910     CALL TIMER_STOP ('UPDATE_CG2D [FORWARD_STEP]',myThid)
911     ENDIF
912     #endif /* NONLIN_FRSURF */
913    
914     C-- Apply Filters to u*,v* before SOLVE_FOR_PRESSURE
915     #ifdef ALLOW_SHAP_FILT
916     IF (useSHAP_FILT .AND. shap_filt_uvStar) THEN
917     CALL TIMER_START('SHAP_FILT_UV [FORWARD_STEP]',myThid)
918     IF (implicDiv2Dflow.LT.1.) THEN
919     C-- Explicit+Implicit part of the Barotropic Flow Divergence
920     C => Filtering of uVel,vVel is necessary
921     CALL SHAP_FILT_APPLY_UV( uVel,vVel,
922     & myTime, myIter, myThid )
923     ENDIF
924     CALL SHAP_FILT_APPLY_UV( gU,gV,myTime,myIter,myThid)
925     CALL TIMER_STOP ('SHAP_FILT_UV [FORWARD_STEP]',myThid)
926     ENDIF
927     #endif
928     #ifdef ALLOW_ZONAL_FILT
929     IF (useZONAL_FILT .AND. zonal_filt_uvStar) THEN
930     CALL TIMER_START('ZONAL_FILT_UV [FORWARD_STEP]',myThid)
931     IF (implicDiv2Dflow.LT.1.) THEN
932     C-- Explicit+Implicit part of the Barotropic Flow Divergence
933     C => Filtering of uVel,vVel is necessary
934     CALL ZONAL_FILT_APPLY_UV( uVel, vVel, myThid )
935     ENDIF
936     CALL ZONAL_FILT_APPLY_UV( gU, gV, myThid )
937     CALL TIMER_STOP ('ZONAL_FILT_UV [FORWARD_STEP]',myThid)
938     ENDIF
939     #endif
940    
941     C-- Solve elliptic equation(s).
942     C Two-dimensional only for conventional hydrostatic or
943     C three-dimensional for non-hydrostatic and/or IGW scheme.
944     IF ( momStepping ) THEN
945     #ifdef ALLOW_AUTODIFF_TAMC
946     # if (defined NONLIN_FRSURF) || (defined ALLOW_DEPTH_CONTROL)
947     CADJ STORE uVel, vVel
948     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
949     CADJ STORE EmPmR,hFacS,hFacW
950     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
951     # endif
952     #endif
953     CALL TIMER_START('SOLVE_FOR_PRESSURE [FORWARD_STEP]',myThid)
954     CALL SOLVE_FOR_PRESSURE(myTime, myIter, myThid)
955     CALL TIMER_STOP ('SOLVE_FOR_PRESSURE [FORWARD_STEP]',myThid)
956     ENDIF
957    
958     C-- Correct divergence in flow field and cycle time-stepping momentum
959     #ifdef ALLOW_MOM_STEPPING
960     #ifndef ALLOW_AUTODIFF
961     IF ( momStepping ) THEN
962     #endif
963     #ifdef ALLOW_AUTODIFF_TAMC
964     # ifdef ALLOW_DEPTH_CONTROL
965     CADJ STORE etaN, uVel,vVel
966     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
967     # endif /* ALLOW_DEPTH_CONTROL */
968     #endif /* ALLOW_AUTODIFF_TAMC */
969     CALL TIMER_START('MOM_CORRECTION_STEP [FORWARD_STEP]',myThid)
970     CALL MOMENTUM_CORRECTION_STEP(myTime, myIter, myThid)
971     CALL TIMER_STOP ('MOM_CORRECTION_STEP [FORWARD_STEP]',myThid)
972     #ifndef ALLOW_AUTODIFF
973     ENDIF
974    
975     #endif
976     #endif /* ALLOW_MOM_STEPPING */
977     #ifdef ALLOW_AUTODIFF_TAMC
978     CADJ STORE uVel, vVel = comlev1, key = ikey_dynamics, kind = isbyte
979     #endif
980    
981     IF ( calc_wVelocity ) THEN
982     C-- Integrate continuity vertically for vertical velocity
983     C (+ update "etaN" & "etaH", exact volume conservation):
984     CALL TIMER_START('INTEGR_CONTINUITY [FORWARD_STEP]',myThid)
985     CALL INTEGR_CONTINUITY( uVel, vVel, myTime, myIter, myThid)
986     CALL TIMER_STOP ('INTEGR_CONTINUITY [FORWARD_STEP]',myThid)
987     ENDIF
988    
989     #ifdef NONLIN_FRSURF
990     IF ( select_rStar.NE.0 ) THEN
991     # ifndef DISABLE_RSTAR_CODE
992     # ifdef ALLOW_AUTODIFF_TAMC
993     CADJ STORE etaH
994     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
995     CADJ STORE rStarFacC,rStarFacS,rStarFacW
996     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
997     # endif
998     C-- r* : compute the future level thickness according to etaH(n+1)
999     CALL TIMER_START('CALC_R_STAR [FORWARD_STEP]',myThid)
1000     CALL CALC_R_STAR(etaH, myTime, myIter, myThid )
1001     CALL TIMER_STOP ('CALC_R_STAR [FORWARD_STEP]',myThid)
1002     # endif /* DISABLE_RSTAR_CODE */
1003     ELSEIF ( nonlinFreeSurf.GT.0 .AND. selectSigmaCoord.EQ.0 ) THEN
1004     C-- compute the future surface level thickness according to etaH(n+1)
1005     # ifdef ALLOW_AUTODIFF_TAMC
1006     CADJ STORE etaH = comlev1, key = ikey_dynamics,
1007     CADJ & kind = isbyte
1008     # endif
1009     CALL TIMER_START('CALC_SURF_DR [FORWARD_STEP]',myThid)
1010     CALL CALC_SURF_DR(etaH, myTime, myIter, myThid )
1011     CALL TIMER_STOP ('CALC_SURF_DR [FORWARD_STEP]',myThid)
1012     ENDIF
1013     # ifdef ALLOW_AUTODIFF_TAMC
1014     CADJ STORE rStarExpC
1015     CADJ & = comlev1, key = ikey_dynamics, kind = isbyte
1016     CADJ STORE hFac_surfC = comlev1, key = ikey_dynamics,
1017     CADJ & kind = isbyte
1018     CADJ STORE salt,theta = comlev1, key = ikey_dynamics,
1019     CADJ & kind = isbyte
1020     # endif
1021     #endif /* NONLIN_FRSURF */
1022    
1023     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
1024     IF ( staggerTimeStep ) THEN
1025     C-- do exchanges of U,V (needed for multiDim) when using stagger time-step :
1026     #ifdef ALLOW_DEBUG
1027     IF (debugMode)
1028     & CALL DEBUG_CALL('DO_STAGGER_FIELDS_EXCH.',myThid)
1029     #endif
1030     CALL TIMER_START('BLOCKING_EXCHANGES [FORWARD_STEP]',myThid)
1031     CALL DO_STAGGER_FIELDS_EXCHANGES( myTime, myIter, myThid )
1032     CALL TIMER_STOP ('BLOCKING_EXCHANGES [FORWARD_STEP]',myThid)
1033    
1034     #ifdef ALLOW_DIAGNOSTICS
1035     C-- State-variables diagnostics
1036     IF ( useDiagnostics ) THEN
1037     CALL TIMER_START('DO_STATEVARS_DIAGS [FORWARD_STEP]',myThid)
1038     CALL DO_STATEVARS_DIAGS( myTime, 1, myIter, myThid )
1039     CALL TIMER_STOP ('DO_STATEVARS_DIAGS [FORWARD_STEP]',myThid)
1040     ENDIF
1041     #endif
1042    
1043    
1044    
1045    
1046    
1047    
1048     #ifdef ALLOW_AUTODIFF_TAMC
1049     CADJ STORE wVel = comlev1, key = ikey_dynamics, kind = isbyte
1050     #endif
1051     #ifdef ALLOW_DEBUG
1052     IF (debugMode) CALL DEBUG_CALL('THERMODYNAMICS',myThid)
1053     #endif
1054     CALL TIMER_START('THERMODYNAMICS [FORWARD_STEP]',myThid)
1055     CALL THERMODYNAMICS( myTime, myIter, myThid )
1056     CALL TIMER_STOP ('THERMODYNAMICS [FORWARD_STEP]',myThid)
1057    
1058     C-- if staggerTimeStep: end
1059     ENDIF
1060     C---+--------+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
1061    
1062     #ifdef ALLOW_AUTODIFF_TAMC
1063     cph This is needed because convective_adjustment calls
1064     cph find_rho which may use pressure()
1065     CADJ STORE totPhiHyd = comlev1, key = ikey_dynamics,
1066     CADJ & kind = isbyte
1067     #endif
1068     C-- Apply adjustments to Tracers arrays (T,S,+pTracers)
1069     CALL TIMER_START('TRC_CORRECTION_STEP [FORWARD_STEP]',myThid)
1070     CALL TRACERS_CORRECTION_STEP(myTime, myIter, myThid)
1071     CALL TIMER_STOP ('TRC_CORRECTION_STEP [FORWARD_STEP]',myThid)
1072    
1073     #ifdef ALLOW_LONGSTEP
1074     IF ( usePTRACERS ) THEN
1075     IF ( LS_whenToSample .EQ. 2 ) THEN
1076     C Average everything at the end of the timestep. This will
1077     C reproduce online results with staggerTimeStep=.TRUE.
1078     C when LS_nIter=1
1079     #ifdef ALLOW_DEBUG
1080     IF (debugMode) CALL DEBUG_CALL('LONGSTEP_AVERAGE',myThid)
1081     #endif
1082     CALL TIMER_START('LONGSTEP_AVERAGE [FORWARD_STEP]',myThid)
1083     C myIter has been update after dynamics, but the averaging window
1084     C should be determined by myIter at beginning of timestep
1085     CALL LONGSTEP_AVERAGE( myTimeBeg, myIterBeg, myThid )
1086     CALL TIMER_STOP ('LONGSTEP_AVERAGE [FORWARD_STEP]',myThid)
1087    
1088     #ifdef ALLOW_DEBUG
1089     IF (debugMode)
1090     & CALL DEBUG_CALL('LONGSTEP_THERMODYNAMICS',myThid)
1091     #endif
1092     CALL TIMER_START('LONGSTEP_THERMODYNAMICS [FORWARD_STEP]',
1093     & myThid)
1094     CALL LONGSTEP_THERMODYNAMICS( myTime, myIter, myThid )
1095     CALL TIMER_STOP ('LONGSTEP_THERMODYNAMICS [FORWARD_STEP]',
1096     & myThid)
1097     C-- if LS_whenToSample.EQ.2: end
1098     ENDIF
1099    
1100     C-- Apply adjustments to passive Tracers arrays (pTracers)
1101     c CALL TIMER_START('LS_CORRECTION_STEP [FORWARD_STEP]',myThid)
1102     c CALL LONGSTEP_CORRECTION_STEP(myTime, myIter, myThid)
1103     c CALL TIMER_STOP ('LS_CORRECTION_STEP [FORWARD_STEP]',myThid)
1104     C-- if usePTRACERS: end
1105     ENDIF
1106     #endif /* ALLOW_LONGSTEP */
1107    
1108     #ifdef ALLOW_GCHEM
1109     C Add separate timestepping of chemical/biological/forcing
1110     C of ptracers here in GCHEM_FORCING_SEP
1111     #ifdef ALLOW_LONGSTEP
1112     IF ( useGCHEM .AND. LS_doTimeStep ) THEN
1113     #else
1114     IF ( useGCHEM ) THEN
1115     #endif
1116     #ifdef ALLOW_AUTODIFF_TAMC
1117     CADJ STORE pTracer = comlev1, key = ikey_dynamics,
1118     CADJ & kind = isbyte
1119     CADJ STORE theta, salt = comlev1, key = ikey_dynamics,
1120     CADJ & kind = isbyte
1121     #endif
1122     #ifdef ALLOW_DEBUG
1123     IF (debugMode) CALL DEBUG_CALL('GCHEM_FORCING_SEP',myThid)
1124     #endif /* ALLOW_DEBUG */
1125     CALL TIMER_START('GCHEM_FORCING_SEP [FORWARD_STEP]',myThid)
1126     CALL GCHEM_FORCING_SEP( myTime,myIter,myThid )
1127     CALL TIMER_STOP ('GCHEM_FORCING_SEP [FORWARD_STEP]',myThid)
1128     ENDIF
1129     #endif /* ALLOW_GCHEM */
1130    
1131     C-- Do "blocking" sends and receives for tendency "overlap" terms
1132     c CALL TIMER_START('BLOCKING_EXCHANGES [FORWARD_STEP]',myThid)
1133     c CALL DO_GTERM_BLOCKING_EXCHANGES( myThid )
1134     c CALL TIMER_STOP ('BLOCKING_EXCHANGES [FORWARD_STEP]',myThid)
1135    
1136     C-- Do "blocking" sends and receives for field "overlap" terms
1137     CALL TIMER_START('BLOCKING_EXCHANGES [FORWARD_STEP]',myThid)
1138     CALL DO_FIELDS_BLOCKING_EXCHANGES( myThid )
1139     CALL TIMER_STOP ('BLOCKING_EXCHANGES [FORWARD_STEP]',myThid)
1140    
1141     #ifdef ALLOW_DIAGNOSTICS
1142     IF ( useDiagnostics ) THEN
1143     CALL TIMER_START('DO_STATEVARS_DIAGS [FORWARD_STEP]',myThid)
1144     CALL DO_STATEVARS_DIAGS( myTime, 2, myIter, myThid )
1145     CALL TIMER_STOP ('DO_STATEVARS_DIAGS [FORWARD_STEP]',myThid)
1146     ENDIF
1147     #endif
1148    
1149     #ifdef ALLOW_GRIDALT
1150     IF (useGRIDALT) THEN
1151     CALL GRIDALT_UPDATE(myThid)
1152     ENDIF
1153     #endif
1154    
1155     #ifdef ALLOW_FIZHI
1156     IF (useFIZHI) THEN
1157     CALL TIMER_START('FIZHI [FORWARD_STEP]',myThid)
1158     CALL STEP_FIZHI_CORR ( myTime, myIter, myThid, dTtracerLev(1) )
1159     CALL TIMER_STOP ('FIZHI [FORWARD_STEP]',myThid)
1160     ENDIF
1161     #endif
1162    
1163     #ifdef ALLOW_FLT
1164     C-- Calculate float trajectories
1165     IF (useFLT) THEN
1166     CALL TIMER_START('FLOATS [FORWARD_STEP]',myThid)
1167     CALL FLT_MAIN( myTime, myIter, myThid )
1168     CALL TIMER_STOP ('FLOATS [FORWARD_STEP]',myThid)
1169     ENDIF
1170     #endif
1171    
1172     #ifdef ALLOW_TIMEAVE
1173     C-- State-variables time-averaging
1174     CALL TIMER_START('DO_STATEVARS_TAVE [FORWARD_STEP]',myThid)
1175     CALL DO_STATEVARS_TAVE( myTime, myIter, myThid )
1176     CALL TIMER_STOP ('DO_STATEVARS_TAVE [FORWARD_STEP]',myThid)
1177     #endif
1178    
1179     #ifdef ALLOW_NEST_PARENT
1180     IF ( useNEST_PARENT) THEN
1181     CALL NEST_PARENT_IO_2( myTime, myIter, myThid )
1182     ENDIF
1183     #endif /* ALLOW_NEST_PARENT */
1184    
1185     #ifdef ALLOW_NEST_CHILD
1186     IF ( useNEST_CHILD) THEN
1187     CALL NEST_CHILD_TRANSP( myTime, myIter, myThid )
1188     ENDIF
1189     #endif /* ALLOW_NEST_CHILD */
1190    
1191     #ifdef ALLOW_MONITOR
1192     IF ( monitorFreq.GT.0. .OR. adjMonitorFreq.GT.0. ) THEN
1193     C-- Check status of solution (statistics, cfl, etc...)
1194     CALL TIMER_START('MONITOR [FORWARD_STEP]',myThid)
1195     CALL MONITOR( myTime, myIter, myThid )
1196     CALL TIMER_STOP ('MONITOR [FORWARD_STEP]',myThid)
1197     ENDIF
1198     #endif /* ALLOW_MONITOR */
1199    
1200     #ifdef ALLOW_COST
1201     C-- compare model with data and compute cost function
1202     C-- this is done after exchanges to allow interpolation
1203     CALL TIMER_START('COST_TILE [FORWARD_STEP]',myThid)
1204     CALL COST_TILE ( myTime, myIter, myThid )
1205     CALL TIMER_STOP ('COST_TILE [FORWARD_STEP]',myThid)
1206     #endif
1207    
1208     C-- Check if it has reached the end of simulation
1209     modelEnd = myTime.EQ.endTime .OR. myIter.EQ.nEndIter
1210     #ifdef HAVE_SIGREG
1211     IF ( useSIGREG ) THEN
1212     modelEnd = modelEnd .OR. ( i_got_signal.GT.0 )
1213     ENDIF
1214     #endif /* HAVE_SIGREG */
1215    
1216     C-- Do IO if needed.
1217     CALL TIMER_START('DO_THE_MODEL_IO [FORWARD_STEP]',myThid)
1218     CALL DO_THE_MODEL_IO( modelEnd, myTime, myIter, myThid )
1219     CALL TIMER_STOP ('DO_THE_MODEL_IO [FORWARD_STEP]',myThid)
1220    
1221     #ifdef ALLOW_PTRACERS
1222     C Reset the ptracers (but after the io is done)
1223     IF ( usePTRACERS ) THEN
1224     CALL TIMER_START('PTRACERS_RESET [FORWARD_STEP]',myThid)
1225     CALL PTRACERS_RESET( myTime, myIter, myThid )
1226     CALL TIMER_STOP ('PTRACERS_RESET [FORWARD_STEP]',myThid)
1227     ENDIF
1228     #endif /* ALLOW_PTRACERS */
1229    
1230     C-- Save state for restarts
1231     CALL TIMER_START('DO_WRITE_PICKUP [FORWARD_STEP]',myThid)
1232     CALL DO_WRITE_PICKUP( modelEnd, myTime, myIter, myThid )
1233     CALL TIMER_STOP ('DO_WRITE_PICKUP [FORWARD_STEP]',myThid)
1234    
1235     #ifdef HAVE_SIGREG
1236     IF ( useSIGREG ) THEN
1237     IF ( modelEnd .AND. i_got_signal.GT.0 ) THEN
1238     STOP 'Checkpoint completed -- killed by signal handler'
1239     ENDIF
1240     ENDIF
1241     #endif /* HAVE_SIGREG */
1242    
1243     #ifdef ALLOW_AUTODIFF
1244     CALL AUTODIFF_INADMODE_SET( myThid )
1245     #endif
1246    
1247     #ifdef ALLOW_SHOWFLOPS
1248     CALL TIMER_START('SHOWFLOPS_INLOOP [THE_MAIN_LOOP]', myThid)
1249     CALL SHOWFLOPS_INLOOP( iloop, myThid )
1250     CALL TIMER_STOP ('SHOWFLOPS_INLOOP [THE_MAIN_LOOP]', myThid)
1251     #endif
1252    
1253     #ifdef ALLOW_DEBUG
1254     IF (debugMode) CALL DEBUG_LEAVE('FORWARD_STEP',myThid)
1255     #endif
1256    
1257    
1258    
1259    
1260    
1261     RETURN
1262     END

  ViewVC Help
Powered by ViewVC 1.1.22