/[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.35 by jmc, Mon Oct 7 16:24:45 2002 UTC revision 1.36 by heimbach, Tue Nov 12 20:39:46 2002 UTC
# Line 99  C       (DO_GTERM_BLOCKING_EXCHANGES). Line 99  C       (DO_GTERM_BLOCKING_EXCHANGES).
99  #ifdef EXACT_CONSERV  #ifdef EXACT_CONSERV
100        IF (exactConserv) THEN        IF (exactConserv) THEN
101  C--   Update etaH(n+1) :  C--   Update etaH(n+1) :
102             CALL TIMER_START('UPDATE_ETAH        [FORWARD_STEP]',mythid)
103           CALL UPDATE_ETAH( myTime, myIter, myThid )           CALL UPDATE_ETAH( myTime, myIter, myThid )
104             CALL TIMER_STOP ('UPDATE_ETAH        [FORWARD_STEP]',mythid)
105        ENDIF        ENDIF
106  #endif /* EXACT_CONSERV */  #endif /* EXACT_CONSERV */
107    
# Line 107  C--   Update etaH(n+1) : Line 109  C--   Update etaH(n+1) :
109  C--   compute the future surface level thickness  C--   compute the future surface level thickness
110  C      according to etaH(n+1)  C      according to etaH(n+1)
111          IF ( nonlinFreeSurf.GT.0) THEN          IF ( nonlinFreeSurf.GT.0) THEN
112              CALL TIMER_START('CALC_SURF_DR      [FORWARD_STEP]',mythid)
113            CALL CALC_SURF_DR(etaH, myTime, myIter, myThid )            CALL CALC_SURF_DR(etaH, myTime, myIter, myThid )
114              CALL TIMER_STOP ('CALC_SURF_DR      [FORWARD_STEP]',mythid)
115          ENDIF          ENDIF
116  #endif /* NONLIN_FRSURF */  #endif /* NONLIN_FRSURF */
117    
118  C--     Load forcing/external data fields.  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.  
119  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
120  c**************************************  c**************************************
121  #include "checkpoint_lev1_directives.h"  #include "checkpoint_lev1_directives.h"
122  c**************************************  c**************************************
123  #endif  #endif
124          CALL EXF_GETFORCING( mytime, myiter, mythid )  #ifdef INCLUDE_EXTERNAL_FORCING_PACKAGE
125    C       NOTE, that although the exf package is part of the
126    C       distribution, it is not currently maintained, i.e.
127    C       exf is disabled by default in genmake.
128            IF ( .not. useSEAICE ) THEN
129             CALL TIMER_START('EXF_GETFORCING     [FORWARD_STEP]',mythid)
130             CALL EXF_GETFORCING( mytime, myiter, mythid )
131             CALL TIMER_STOP ('EXF_GETFORCING     [FORWARD_STEP]',mythid)
132            ENDIF
133  #else  #else
134          CALL TIMER_START('EXTERNAL_FIELDS_LOAD[THE_MAIN_LOOP]',mythid)          IF ( .not. useSEAICE ) THEN
135          CALL EXTERNAL_FIELDS_LOAD( mytime, myiter, mythid )           CALL TIMER_START('EXTERNAL_FIELDS_LOAD[FORWARD_STEP]',mythid)
136          CALL TIMER_STOP ('EXTERNAL_FIELDS_LOAD[THE_MAIN_LOOP]',mythid)           CALL EXTERNAL_FIELDS_LOAD( mytime, myiter, mythid )
137  #endif           CALL TIMER_STOP ('EXTERNAL_FIELDS_LOAD[FORWARD_STEP]',mythid)
138            ENDIF
139    #endif /* INCLUDE_EXTERNAL_FORCING_PACKAGE */
140    
141    #ifdef ALLOW_SEAICE
142    C--   Call sea ice model to compute forcing/external data fields.  In
143    C     addition to computing prognostic sea-ice variables and diagnosing the
144    C     forcing/external data fields that drive the ocean model, SEAICE_MODEL
145    C     also sets theta to the freezing point under sea-ice.  The implied
146    C     surface heat flux is then stored in variable surfaceTendencyTice,
147    C     which is needed by KPP package (kpp_calc.F and kpp_transport_t.F)
148    C     to diagnose surface buoyancy fluxes and for the non-local transport
149    C     term.  Because this call precedes model thermodynamics, temperature
150    C     under sea-ice may not be "exactly" at the freezing point by the time
151    C     theta is dumped or time-averaged.
152            IF ( useSEAICE ) THEN
153             CALL TIMER_START('SEAICE_MODEL       [FORWARD_STEP]',myThid)
154             CALL SEAICE_MODEL( myTime, myIter, myThid )
155             CALL TIMER_STOP ('SEAICE_MODEL       [FORWARD_STEP]',myThid)
156            ENDIF
157    #endif ALLOW_SEAICE
158    
159  C--     Step forward fields and calculate time tendency terms.  C--     Step forward fields and calculate time tendency terms.
160          CALL TIMER_START('THERMODYNAMICS      [THE_MAIN_LOOP]',mythid)          CALL TIMER_START('THERMODYNAMICS      [FORWARD_STEP]',mythid)
161          CALL THERMODYNAMICS( myTime, myIter, myThid )          CALL THERMODYNAMICS( myTime, myIter, myThid )
162          CALL TIMER_STOP ('THERMODYNAMICS      [THE_MAIN_LOOP]',mythid)          CALL TIMER_STOP ('THERMODYNAMICS      [FORWARD_STEP]',mythid)
163    
164  C--   do exchanges (needed for DYNAMICS) when using stagger time-step :  C--   do exchanges (needed for DYNAMICS) when using stagger time-step :
165          CALL TIMER_START('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
166          CALL DO_STAGGER_FIELDS_EXCHANGES( myTime, myIter, myThid )          CALL DO_STAGGER_FIELDS_EXCHANGES( myTime, myIter, myThid )
167          CALL TIMER_STOP ('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
168    
169  #ifdef ALLOW_SHAP_FILT  #ifdef ALLOW_SHAP_FILT
170         IF (useSHAP_FILT .AND.         IF (useSHAP_FILT .AND.
171       &     staggerTimeStep .AND. shap_filt_TrStagg ) THEN       &     staggerTimeStep .AND. shap_filt_TrStagg ) THEN
172          CALL TIMER_START('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('SHAP_FILT           [FORWARD_STEP]',myThid)
173          CALL SHAP_FILT_APPLY_TS( gT, gS, myTime, myIter, myThid )          CALL SHAP_FILT_APPLY_TS( gT, gS, myTime, myIter, myThid )
174          CALL TIMER_STOP ('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('SHAP_FILT           [FORWARD_STEP]',myThid)
175         ENDIF         ENDIF
176  #endif  #endif
177  #ifdef ALLOW_ZONAL_FILT  #ifdef ALLOW_ZONAL_FILT
178         IF (useZONAL_FILT .AND.         IF (useZONAL_FILT .AND.
179       &     staggerTimeStep .AND. zonal_filt_TrStagg ) THEN       &     staggerTimeStep .AND. zonal_filt_TrStagg ) THEN
180          CALL TIMER_START('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('ZONAL_FILT_APPLY    [FORWARD_STEP]',myThid)
181          CALL ZONAL_FILT_APPLY_TS( gT, gS, myThid )          CALL ZONAL_FILT_APPLY_TS( gT, gS, myThid )
182          CALL TIMER_STOP ('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('ZONAL_FILT_APPLY    [FORWARD_STEP]',myThid)
183        ENDIF        ENDIF
184  #endif    #endif  
185    
186  C--     Step forward fields and calculate time tendency terms.  C--     Step forward fields and calculate time tendency terms.
187          IF ( momStepping ) THEN          IF ( momStepping ) THEN
188          CALL TIMER_START('DYNAMICS            [THE_MAIN_LOOP]',mythid)          CALL TIMER_START('DYNAMICS            [FORWARD_STEP]',mythid)
189          CALL DYNAMICS( myTime, myIter, myThid )          CALL DYNAMICS( myTime, myIter, myThid )
190          CALL TIMER_STOP ('DYNAMICS            [THE_MAIN_LOOP]',mythid)          CALL TIMER_STOP ('DYNAMICS            [FORWARD_STEP]',mythid)
191          ENDIF          ENDIF
192    
193  #ifdef ALLOW_NONHYDROSTATIC  #ifdef ALLOW_NONHYDROSTATIC
194  C--   Step forward W field in N-H algorithm  C--   Step forward W field in N-H algorithm
195          IF ( momStepping .AND. nonHydrostatic ) THEN          IF ( momStepping .AND. nonHydrostatic ) THEN
196            CALL TIMER_START('CALC_GW          [THE_MAIN_LOOP]',myThid)            CALL TIMER_START('CALC_GW          [FORWARD_STEP]',myThid)
197            CALL CALC_GW(myThid)            CALL CALC_GW(myThid)
198            CALL TIMER_STOP ('CALC_GW          [THE_MAIN_LOOP]',myThid)            CALL TIMER_STOP ('CALC_GW          [FORWARD_STEP]',myThid)
199          ENDIF          ENDIF
200  #endif  #endif
201    
202  #ifdef NONLIN_FRSURF  #ifdef NONLIN_FRSURF
203  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) :
204        IF ( nonlinFreeSurf.GT.0) THEN        IF ( nonlinFreeSurf.GT.0) THEN
205            CALL TIMER_START('UPDATE_SURF_DR     [FORWARD_STEP]',mythid)
206          CALL UPDATE_SURF_DR( myTime, myIter, myThid )          CALL UPDATE_SURF_DR( myTime, myIter, myThid )
207            CALL TIMER_STOP ('UPDATE_SURF_DR     [FORWARD_STEP]',myThid)
208        ENDIF        ENDIF
209  C-    update also CG2D matrix (and preconditioner)  C-    update also CG2D matrix (and preconditioner)
210        IF ( momStepping .AND. nonlinFreeSurf.GT.2 ) THEN        IF ( momStepping .AND. nonlinFreeSurf.GT.2 ) THEN
211            CALL TIMER_START('UPDATE_CG2D        [FORWARD_STEP]',mythid)
212          CALL UPDATE_CG2D( myTime, myIter, myThid )          CALL UPDATE_CG2D( myTime, myIter, myThid )
213            CALL TIMER_START('UPDATE_CG2D        [FORWARD_STEP]',mythid)
214        ENDIF        ENDIF
215  #endif  #endif
216    
217  C--   Apply Filters to u*,v* before SOLVE_FOR_PRESSURE  C--   Apply Filters to u*,v* before SOLVE_FOR_PRESSURE
218  #ifdef ALLOW_SHAP_FILT  #ifdef ALLOW_SHAP_FILT
219        IF (useSHAP_FILT .AND. shap_filt_uvStar) THEN        IF (useSHAP_FILT .AND. shap_filt_uvStar) THEN
220          CALL TIMER_START('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('SHAP_FILT           [FORWARD_STEP]',myThid)
221          CALL SHAP_FILT_APPLY_UV( gUnm1,gVnm1, myTime,myIter,myThid )          CALL SHAP_FILT_APPLY_UV( gUnm1,gVnm1, myTime,myIter,myThid )
222          IF (implicDiv2Dflow.LT.1.) THEN          IF (implicDiv2Dflow.LT.1.) THEN
223  C--   Explicit+Implicit part of the Barotropic Flow Divergence  C--   Explicit+Implicit part of the Barotropic Flow Divergence
224  C      => Filtering of uVel,vVel is necessary  C      => Filtering of uVel,vVel is necessary
225            CALL SHAP_FILT_APPLY_UV( uVel,vVel, myTime,myIter,myThid )            CALL SHAP_FILT_APPLY_UV( uVel,vVel, myTime,myIter,myThid )
226          ENDIF          ENDIF
227          CALL TIMER_STOP ('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('SHAP_FILT           [FORWARD_STEP]',myThid)
228        ENDIF        ENDIF
229  #endif  #endif
230  #ifdef ALLOW_ZONAL_FILT  #ifdef ALLOW_ZONAL_FILT
231        IF (useZONAL_FILT .AND. zonal_filt_uvStar) THEN        IF (useZONAL_FILT .AND. zonal_filt_uvStar) THEN
232          CALL TIMER_START('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('ZONAL_FILT_APPLY    [FORWARD_STEP]',myThid)
233          CALL ZONAL_FILT_APPLY_UV( gUnm1, gVnm1, myThid )          CALL ZONAL_FILT_APPLY_UV( gUnm1, gVnm1, myThid )
234          IF (implicDiv2Dflow.LT.1.) THEN          IF (implicDiv2Dflow.LT.1.) THEN
235  C--   Explicit+Implicit part of the Barotropic Flow Divergence  C--   Explicit+Implicit part of the Barotropic Flow Divergence
236  C      => Filtering of uVel,vVel is necessary  C      => Filtering of uVel,vVel is necessary
237            CALL ZONAL_FILT_APPLY_UV( uVel, vVel, myThid )            CALL ZONAL_FILT_APPLY_UV( uVel, vVel, myThid )
238          ENDIF          ENDIF
239          CALL TIMER_STOP ('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('ZONAL_FILT_APPLY    [FORWARD_STEP]',myThid)
240        ENDIF        ENDIF
241  #endif    #endif  
242    
# Line 212  C--   Solve elliptic equation(s). Line 244  C--   Solve elliptic equation(s).
244  C     Two-dimensional only for conventional hydrostatic or  C     Two-dimensional only for conventional hydrostatic or
245  C     three-dimensional for non-hydrostatic and/or IGW scheme.  C     three-dimensional for non-hydrostatic and/or IGW scheme.
246        IF ( momStepping ) THEN        IF ( momStepping ) THEN
247        CALL TIMER_START('SOLVE_FOR_PRESSURE  [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('SOLVE_FOR_PRESSURE  [FORWARD_STEP]',myThid)
248        CALL SOLVE_FOR_PRESSURE(myTime, myIter, myThid)        CALL SOLVE_FOR_PRESSURE(myTime, myIter, myThid)
249        CALL TIMER_STOP ('SOLVE_FOR_PRESSURE  [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('SOLVE_FOR_PRESSURE  [FORWARD_STEP]',myThid)
250        ENDIF        ENDIF
251    
252  C--   Correct divergence in flow field and cycle time-stepping  C--   Correct divergence in flow field and cycle time-stepping
253  C     arrays (for all fields) ; update time-counter  C     arrays (for all fields) ; update time-counter
254        myIter = nIter0 + iLoop        myIter = nIter0 + iLoop
255        myTime = startTime + deltaTClock * float(iLoop)        myTime = startTime + deltaTClock * float(iLoop)
256        CALL TIMER_START('THE_CORRECTION_STEP [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('THE_CORRECTION_STEP [FORWARD_STEP]',myThid)
257        CALL THE_CORRECTION_STEP(myTime, myIter, myThid)        CALL THE_CORRECTION_STEP(myTime, myIter, myThid)
258        CALL TIMER_STOP ('THE_CORRECTION_STEP [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('THE_CORRECTION_STEP [FORWARD_STEP]',myThid)
259    
260  C--   Do "blocking" sends and receives for tendency "overlap" terms  C--   Do "blocking" sends and receives for tendency "overlap" terms
261  c     CALL TIMER_START('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)  c     CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
262  c     CALL DO_GTERM_BLOCKING_EXCHANGES( myThid )  c     CALL DO_GTERM_BLOCKING_EXCHANGES( myThid )
263  c     CALL TIMER_STOP ('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)  c     CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
264    
265  C--   Do "blocking" sends and receives for field "overlap" terms  C--   Do "blocking" sends and receives for field "overlap" terms
266        CALL TIMER_START('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
267        CALL DO_FIELDS_BLOCKING_EXCHANGES( myThid )        CALL DO_FIELDS_BLOCKING_EXCHANGES( myThid )
268        CALL TIMER_STOP ('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
269    
270  #ifdef ALLOW_FLT  #ifdef ALLOW_FLT
271  C--   Calculate float trajectories  C--   Calculate float trajectories
272        IF (useFLT) THEN        IF (useFLT) THEN
273          CALL TIMER_START('FLOATS            [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('FLOATS            [FORWARD_STEP]',myThid)
274          CALL FLT_MAIN(myIter,myTime, myThid)          CALL FLT_MAIN(myIter,myTime, myThid)
275          CALL TIMER_STOP ('FLOATS            [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('FLOATS            [FORWARD_STEP]',myThid)
276        ENDIF        ENDIF
277  #endif  #endif
278    
279  #ifndef EXCLUDE_MONITOR  #ifndef EXCLUDE_MONITOR
280  C--   Check status of solution (statistics, cfl, etc...)  C--   Check status of solution (statistics, cfl, etc...)
281          CALL TIMER_START('MONITOR             [FORWARD_STEP]',mythid)
282        CALL MONITOR( myIter, myTime, myThid )        CALL MONITOR( myIter, myTime, myThid )
283          CALL TIMER_STOP ('MONITOR             [FORWARD_STEP]',myThid)
284  #endif /* EXCLUDE_MONITOR */  #endif /* EXCLUDE_MONITOR */
285    
286  C--   Do IO if needed.  C--   Do IO if needed.
287        CALL TIMER_START('DO_THE_MODEL_IO     [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('DO_THE_MODEL_IO     [FORWARD_STEP]',myThid)
288        CALL DO_THE_MODEL_IO( myTime, myIter, myThid )        CALL DO_THE_MODEL_IO( myTime, myIter, myThid )
289        CALL TIMER_STOP ('DO_THE_MODEL_IO     [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('DO_THE_MODEL_IO     [FORWARD_STEP]',myThid)
290    
291  C--   Save state for restarts  C--   Save state for restarts
292  C     Note:    (jmc: is it still the case after ckp35 ?)  C     Note:    (jmc: is it still the case after ckp35 ?)
# Line 267  C     Thus a checkpoint contains U.00000 Line 301  C     Thus a checkpoint contains U.00000
301  C     etaN.0000000001 in the indexing scheme used for the model  C     etaN.0000000001 in the indexing scheme used for the model
302  C     "state" files. This example is referred to as a checkpoint  C     "state" files. This example is referred to as a checkpoint
303  C     at time level 1  C     at time level 1
304        CALL TIMER_START('WRITE_CHECKPOINT    [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('WRITE_CHECKPOINT    [FORWARD_STEP]',myThid)
305        CALL WRITE_CHECKPOINT(        CALL WRITE_CHECKPOINT(
306       &        .FALSE., myTime, myIter, myThid )       &        .FALSE., myTime, myIter, myThid )
307        CALL TIMER_STOP ('WRITE_CHECKPOINT    [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('WRITE_CHECKPOINT    [FORWARD_STEP]',myThid)
308    
309        END        END

Legend:
Removed from v.1.35  
changed lines
  Added in v.1.36

  ViewVC Help
Powered by ViewVC 1.1.22