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

Contents 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.2 - (show annotations) (download)
Wed Feb 1 12:45:48 2017 UTC (9 years, 7 months ago) by dgoldberg
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +1 -1 lines
FILE REMOVED
reorganise files to minimize duplicate files from remeshing exp

1 C $Header: /u/gcmpack/MITgcm_contrib/ksnow/press_release/code_expt/forward_step.F,v 1.1 2016/12/16 15:25:29 ksnow 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