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

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

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

revision 1.32 by heimbach, Thu May 30 02:32:14 2002 UTC revision 1.42 by cheisey, Mon Dec 2 13:11:09 2002 UTC
# Line 49  C     == Global variables == Line 49  C     == Global variables ==
49  # include "ctrl.h"  # include "ctrl.h"
50  # include "ctrl_dummy.h"  # include "ctrl_dummy.h"
51  # include "cost.h"  # include "cost.h"
52    # include "EOS.h"
53  # ifdef INCLUDE_EXTERNAL_FORCING_PACKAGE  # ifdef INCLUDE_EXTERNAL_FORCING_PACKAGE
54  #  include "exf_fields.h"  #  include "exf_fields.h"
55  #  ifdef ALLOW_BULKFORMULAE  #  ifdef ALLOW_BULK_FORCE
56  #   include "exf_constants.h"  #   include "exf_constants.h"
57  #  endif  #  endif
58  # endif  # endif
# Line 99  C       (DO_GTERM_BLOCKING_EXCHANGES). Line 100  C       (DO_GTERM_BLOCKING_EXCHANGES).
100  #ifdef EXACT_CONSERV  #ifdef EXACT_CONSERV
101        IF (exactConserv) THEN        IF (exactConserv) THEN
102  C--   Update etaH(n+1) :  C--   Update etaH(n+1) :
103          DO bj=myByLo(myThid),myByHi(myThid)           CALL TIMER_START('UPDATE_ETAH        [FORWARD_STEP]',mythid)
104           DO bi=myBxLo(myThid),myBxHi(myThid)           CALL UPDATE_ETAH( myTime, myIter, myThid )
105             CALL CALC_EXACT_ETA( .FALSE., bi,bj, uVel,vVel,           CALL TIMER_STOP ('UPDATE_ETAH        [FORWARD_STEP]',mythid)
      I                          myTime, myIter, myThid )  
          ENDDO  
         ENDDO  
         IF (implicDiv2Dflow .NE. 1. _d 0 .OR. useOBCS )  
      &     _EXCH_XY_R8(etaH, myThid )  
106        ENDIF        ENDIF
107  #endif /* EXACT_CONSERV */  #endif /* EXACT_CONSERV */
108    
# Line 114  C--   Update etaH(n+1) : Line 110  C--   Update etaH(n+1) :
110  C--   compute the future surface level thickness  C--   compute the future surface level thickness
111  C      according to etaH(n+1)  C      according to etaH(n+1)
112          IF ( nonlinFreeSurf.GT.0) THEN          IF ( nonlinFreeSurf.GT.0) THEN
113              CALL TIMER_START('CALC_SURF_DR      [FORWARD_STEP]',mythid)
114            CALL CALC_SURF_DR(etaH, myTime, myIter, myThid )            CALL CALC_SURF_DR(etaH, myTime, myIter, myThid )
115              CALL TIMER_STOP ('CALC_SURF_DR      [FORWARD_STEP]',mythid)
116          ENDIF          ENDIF
117  #endif /* NONLIN_FRSURF */  #endif /* NONLIN_FRSURF */
118    
119    
120    
121    
122  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.  
123  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
124  c**************************************  c**************************************
125  #include "checkpoint_lev1_directives.h"  #include "checkpoint_lev1_directives.h"
126  c**************************************  c**************************************
127  #endif  #endif
128          CALL EXF_GETFORCING( mytime, myiter, mythid )  
129    
130    C--   Call external forcing package
131    cswdblk -- add ---
132    #ifdef ALLOW_BULK_FORCE
133           CALL TIMER_START('BULKF_FIELDS_LOAD[THE_MAIN_LOOP]',mythid)
134           CALL BULKF_FIELDS_LOAD( mytime, myiter, mythid )
135           CALL TIMER_STOP ('BULKF_FIELDS_LOAD[THE_MAIN_LOOP]',mythid)
136    c calculate qnet and empmr (and wind stress)
137           DO bj=myByLo(myThid),myByHi(myThid)
138             DO bi=myBxLo(myThid),myBxHi(myThid)
139              CALL BULKF_FORCING( bi,bj, mytime, myiter, mythid )
140             ENDDO
141           ENDDO
142    c     Update the tile edges.
143           _EXCH_XY_R8(Qnet,   mythid)
144           _EXCH_XY_R8(EmPmR,   mythid)
145           _EXCH_XY_R8(fu     , mythid)
146           _EXCH_XY_R8(fv     , mythid)
147    cswdblk -- end add ---
148    #else
149    #ifdef INCLUDE_EXTERNAL_FORCING_PACKAGE
150            IF ( .not. useSEAICE  ) THEN
151             CALL TIMER_START('EXF_GETFORCING     [FORWARD_STEP]',mythid)
152             CALL EXF_GETFORCING( mytime, myiter, mythid )
153             CALL TIMER_STOP ('EXF_GETFORCING     [FORWARD_STEP]',mythid)
154            ENDIF
155  #else  #else
156          CALL TIMER_START('EXTERNAL_FIELDS_LOAD[THE_MAIN_LOOP]',mythid)          IF ( .not. useSEAICE  ) THEN
157          CALL EXTERNAL_FIELDS_LOAD( mytime, myiter, mythid )           CALL TIMER_START('EXTERNAL_FIELDS_LOAD[FORWARD_STEP]',mythid)
158          CALL TIMER_STOP ('EXTERNAL_FIELDS_LOAD[THE_MAIN_LOOP]',mythid)           CALL EXTERNAL_FIELDS_LOAD( mytime, myiter, mythid )
159             CALL TIMER_STOP ('EXTERNAL_FIELDS_LOAD[FORWARD_STEP]',mythid)
160            ENDIF
161    #endif /* INCLUDE_EXTERNAL_FORCING_PACKAGE */
162  #endif  #endif
163    
164    
165    
166    #ifdef ALLOW_SEAICE
167    C--   Call sea ice model to compute forcing/external data fields.
168            IF ( useSEAICE ) THEN
169             CALL TIMER_START('SEAICE_MODEL       [FORWARD_STEP]',myThid)
170             CALL SEAICE_MODEL( myTime, myIter, myThid )
171             CALL TIMER_STOP ('SEAICE_MODEL       [FORWARD_STEP]',myThid)
172            ENDIF
173    #endif ALLOW_SEAICE
174    
175  C--     Step forward fields and calculate time tendency terms.  C--     Step forward fields and calculate time tendency terms.
176          CALL TIMER_START('THERMODYNAMICS      [THE_MAIN_LOOP]',mythid)          CALL TIMER_START('THERMODYNAMICS      [FORWARD_STEP]',mythid)
177          CALL THERMODYNAMICS( myTime, myIter, myThid )          CALL THERMODYNAMICS( myTime, myIter, myThid )
178          CALL TIMER_STOP ('THERMODYNAMICS      [THE_MAIN_LOOP]',mythid)          CALL TIMER_STOP ('THERMODYNAMICS      [FORWARD_STEP]',mythid)
179    
180    C--   do exchanges (needed for DYNAMICS) when using stagger time-step :
181            CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
182            CALL DO_STAGGER_FIELDS_EXCHANGES( myTime, myIter, myThid )
183            CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
184    
185  #ifdef ALLOW_SHAP_FILT  #ifdef ALLOW_SHAP_FILT
186         IF (useSHAP_FILT .AND.         IF (useSHAP_FILT .AND.
187       &     staggerTimeStep .AND. shap_filt_TrStagg ) THEN       &     staggerTimeStep .AND. shap_filt_TrStagg ) THEN
188          CALL TIMER_START('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('SHAP_FILT           [FORWARD_STEP]',myThid)
189          CALL SHAP_FILT_APPLY_TS( gT, gS, myTime, myIter, myThid )          CALL SHAP_FILT_APPLY_TS( gT, gS, myTime, myIter, myThid )
190          CALL TIMER_STOP ('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('SHAP_FILT           [FORWARD_STEP]',myThid)
191         ENDIF         ENDIF
192  #endif  #endif
193  #ifdef ALLOW_ZONAL_FILT  #ifdef ALLOW_ZONAL_FILT
194         IF (useZONAL_FILT .AND.         IF (useZONAL_FILT .AND.
195       &     staggerTimeStep .AND. zonal_filt_TrStagg ) THEN       &     staggerTimeStep .AND. zonal_filt_TrStagg ) THEN
196          CALL TIMER_START('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('ZONAL_FILT_APPLY    [FORWARD_STEP]',myThid)
197          CALL ZONAL_FILT_APPLY_TS( gT, gS, myThid )          CALL ZONAL_FILT_APPLY_TS( gT, gS, myThid )
198          CALL TIMER_STOP ('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('ZONAL_FILT_APPLY    [FORWARD_STEP]',myThid)
199        ENDIF        ENDIF
200  #endif    #endif  
201    
202  C--     Step forward fields and calculate time tendency terms.  C--     Step forward fields and calculate time tendency terms.
203          IF ( momStepping ) THEN          IF ( momStepping ) THEN
204          CALL TIMER_START('DYNAMICS            [THE_MAIN_LOOP]',mythid)          CALL TIMER_START('DYNAMICS            [FORWARD_STEP]',mythid)
205          CALL DYNAMICS( myTime, myIter, myThid )          CALL DYNAMICS( myTime, myIter, myThid )
206          CALL TIMER_STOP ('DYNAMICS            [THE_MAIN_LOOP]',mythid)          CALL TIMER_STOP ('DYNAMICS            [FORWARD_STEP]',mythid)
207          ENDIF          ENDIF
208    
209  #ifdef ALLOW_NONHYDROSTATIC  #ifdef ALLOW_NONHYDROSTATIC
210  C--   Step forward W field in N-H algorithm  C--   Step forward W field in N-H algorithm
211          IF ( momStepping .AND. nonHydrostatic ) THEN          IF ( momStepping .AND. nonHydrostatic ) THEN
212            CALL TIMER_START('CALC_GW          [THE_MAIN_LOOP]',myThid)            CALL TIMER_START('CALC_GW          [FORWARD_STEP]',myThid)
213            CALL CALC_GW(myThid)            CALL CALC_GW(myThid)
214            CALL TIMER_STOP ('CALC_GW          [THE_MAIN_LOOP]',myThid)            CALL TIMER_STOP ('CALC_GW          [FORWARD_STEP]',myThid)
215          ENDIF          ENDIF
216  #endif  #endif
217    
218  #ifdef NONLIN_FRSURF  #ifdef NONLIN_FRSURF
219  C--   update hfacC,W,S and recip_hFac according to etaH(n+1) :  C--   update hfacC,W,S and recip_hFac according to etaH(n+1) :
       IF ( momStepping ) THEN  
220        IF ( nonlinFreeSurf.GT.0) THEN        IF ( nonlinFreeSurf.GT.0) THEN
221            CALL TIMER_START('UPDATE_SURF_DR     [FORWARD_STEP]',mythid)
222          CALL UPDATE_SURF_DR( myTime, myIter, myThid )          CALL UPDATE_SURF_DR( myTime, myIter, myThid )
223            CALL TIMER_STOP ('UPDATE_SURF_DR     [FORWARD_STEP]',myThid)
224        ENDIF        ENDIF
225  C-    update also CG2D matrix (and preconditioner)  C-    update also CG2D matrix (and preconditioner)
226        IF ( nonlinFreeSurf.GT.2) THEN        IF ( momStepping .AND. nonlinFreeSurf.GT.2 ) THEN
227            CALL TIMER_START('UPDATE_CG2D        [FORWARD_STEP]',mythid)
228          CALL UPDATE_CG2D( myTime, myIter, myThid )          CALL UPDATE_CG2D( myTime, myIter, myThid )
229        ENDIF          CALL TIMER_START('UPDATE_CG2D        [FORWARD_STEP]',mythid)
230        ENDIF        ENDIF
231  #endif  #endif
232    
233  C--   Apply Filters to u*,v* before SOLVE_FOR_PRESSURE  C--   Apply Filters to u*,v* before SOLVE_FOR_PRESSURE
234  #ifdef ALLOW_SHAP_FILT  #ifdef ALLOW_SHAP_FILT
235        IF (useSHAP_FILT .AND. shap_filt_uvStar) THEN        IF (useSHAP_FILT .AND. shap_filt_uvStar) THEN
236          CALL TIMER_START('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('SHAP_FILT           [FORWARD_STEP]',myThid)
237          CALL SHAP_FILT_APPLY_UV( gUnm1,gVnm1, myTime,myIter,myThid )          CALL SHAP_FILT_APPLY_UV( gUnm1,gVnm1, myTime,myIter,myThid )
238          IF (implicDiv2Dflow.LT.1.) THEN          IF (implicDiv2Dflow.LT.1.) THEN
239  C--   Explicit+Implicit part of the Barotropic Flow Divergence  C--   Explicit+Implicit part of the Barotropic Flow Divergence
240  C      => Filtering of uVel,vVel is necessary  C      => Filtering of uVel,vVel is necessary
241            CALL SHAP_FILT_APPLY_UV( uVel,vVel, myTime,myIter,myThid )            CALL SHAP_FILT_APPLY_UV( uVel,vVel, myTime,myIter,myThid )
242          ENDIF          ENDIF
243          CALL TIMER_STOP ('SHAP_FILT           [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('SHAP_FILT           [FORWARD_STEP]',myThid)
244        ENDIF        ENDIF
245  #endif  #endif
246  #ifdef ALLOW_ZONAL_FILT  #ifdef ALLOW_ZONAL_FILT
247        IF (useZONAL_FILT .AND. zonal_filt_uvStar) THEN        IF (useZONAL_FILT .AND. zonal_filt_uvStar) THEN
248          CALL TIMER_START('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('ZONAL_FILT_APPLY    [FORWARD_STEP]',myThid)
249          CALL ZONAL_FILT_APPLY_UV( gUnm1, gVnm1, myThid )          CALL ZONAL_FILT_APPLY_UV( gUnm1, gVnm1, myThid )
250          IF (implicDiv2Dflow.LT.1.) THEN          IF (implicDiv2Dflow.LT.1.) THEN
251  C--   Explicit+Implicit part of the Barotropic Flow Divergence  C--   Explicit+Implicit part of the Barotropic Flow Divergence
252  C      => Filtering of uVel,vVel is necessary  C      => Filtering of uVel,vVel is necessary
253            CALL ZONAL_FILT_APPLY_UV( uVel, vVel, myThid )            CALL ZONAL_FILT_APPLY_UV( uVel, vVel, myThid )
254          ENDIF          ENDIF
255          CALL TIMER_STOP ('ZONAL_FILT_APPLY    [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('ZONAL_FILT_APPLY    [FORWARD_STEP]',myThid)
256        ENDIF        ENDIF
257  #endif    #endif  
258    
# Line 216  C--   Solve elliptic equation(s). Line 260  C--   Solve elliptic equation(s).
260  C     Two-dimensional only for conventional hydrostatic or  C     Two-dimensional only for conventional hydrostatic or
261  C     three-dimensional for non-hydrostatic and/or IGW scheme.  C     three-dimensional for non-hydrostatic and/or IGW scheme.
262        IF ( momStepping ) THEN        IF ( momStepping ) THEN
263        CALL TIMER_START('SOLVE_FOR_PRESSURE  [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('SOLVE_FOR_PRESSURE  [FORWARD_STEP]',myThid)
264        CALL SOLVE_FOR_PRESSURE(myTime, myIter, myThid)        CALL SOLVE_FOR_PRESSURE(myTime, myIter, myThid)
265        CALL TIMER_STOP ('SOLVE_FOR_PRESSURE  [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('SOLVE_FOR_PRESSURE  [FORWARD_STEP]',myThid)
266        ENDIF        ENDIF
267    
268    #ifdef ALLOW_AUTODIFF_TAMC
269    cph This is needed because convective_adjustment calls
270    cph find_rho which may use pressure()
271    CADJ STORE pressure  = comlev1, key = ikey_dynamics
272    #endif
273  C--   Correct divergence in flow field and cycle time-stepping  C--   Correct divergence in flow field and cycle time-stepping
274  C     arrays (for all fields) ; update time-counter  C     arrays (for all fields) ; update time-counter
275        myIter = nIter0 + iLoop        myIter = nIter0 + iLoop
276        myTime = startTime + deltaTClock * float(iLoop)        myTime = startTime + deltaTClock * float(iLoop)
277        CALL TIMER_START('THE_CORRECTION_STEP [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('THE_CORRECTION_STEP [FORWARD_STEP]',myThid)
278        CALL THE_CORRECTION_STEP(myTime, myIter, myThid)        CALL THE_CORRECTION_STEP(myTime, myIter, myThid)
279        CALL TIMER_STOP ('THE_CORRECTION_STEP [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('THE_CORRECTION_STEP [FORWARD_STEP]',myThid)
280    
281  C--   Do "blocking" sends and receives for tendency "overlap" terms  C--   Do "blocking" sends and receives for tendency "overlap" terms
282  c     CALL TIMER_START('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)  c     CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
283  c     CALL DO_GTERM_BLOCKING_EXCHANGES( myThid )  c     CALL DO_GTERM_BLOCKING_EXCHANGES( myThid )
284  c     CALL TIMER_STOP ('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)  c     CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
285    
286  C--   Do "blocking" sends and receives for field "overlap" terms  C--   Do "blocking" sends and receives for field "overlap" terms
287        CALL TIMER_START('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
288        CALL DO_FIELDS_BLOCKING_EXCHANGES( myThid )        CALL DO_FIELDS_BLOCKING_EXCHANGES( myThid )
289        CALL TIMER_STOP ('BLOCKING_EXCHANGES  [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('BLOCKING_EXCHANGES  [FORWARD_STEP]',myThid)
290    
291  #ifdef ALLOW_FLT  #ifdef ALLOW_FLT
292  C--   Calculate float trajectories  C--   Calculate float trajectories
293        IF (useFLT) THEN        IF (useFLT) THEN
294          CALL TIMER_START('FLOATS            [THE_MAIN_LOOP]',myThid)          CALL TIMER_START('FLOATS            [FORWARD_STEP]',myThid)
295          CALL FLT_MAIN(myIter,myTime, myThid)          CALL FLT_MAIN(myIter,myTime, myThid)
296          CALL TIMER_STOP ('FLOATS            [THE_MAIN_LOOP]',myThid)          CALL TIMER_STOP ('FLOATS            [FORWARD_STEP]',myThid)
297        ENDIF        ENDIF
298  #endif  #endif
299    
300  #ifndef EXCLUDE_MONITOR  #ifndef EXCLUDE_MONITOR
301  C--   Check status of solution (statistics, cfl, etc...)  C--   Check status of solution (statistics, cfl, etc...)
302          CALL TIMER_START('MONITOR             [FORWARD_STEP]',mythid)
303        CALL MONITOR( myIter, myTime, myThid )        CALL MONITOR( myIter, myTime, myThid )
304          CALL TIMER_STOP ('MONITOR             [FORWARD_STEP]',myThid)
305  #endif /* EXCLUDE_MONITOR */  #endif /* EXCLUDE_MONITOR */
306    
 #ifndef ALLOW_AUTODIFF_TAMC  
307  C--   Do IO if needed.  C--   Do IO if needed.
308        CALL TIMER_START('DO_THE_MODEL_IO     [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('DO_THE_MODEL_IO     [FORWARD_STEP]',myThid)
309        CALL DO_THE_MODEL_IO( myTime, myIter, myThid )        CALL DO_THE_MODEL_IO( myTime, myIter, myThid )
310        CALL TIMER_STOP ('DO_THE_MODEL_IO     [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('DO_THE_MODEL_IO     [FORWARD_STEP]',myThid)
311    
312  C--   Save state for restarts  C--   Save state for restarts
313  C     Note:    (jmc: is it still the case after ckp35 ?)  C     Note:    (jmc: is it still the case after ckp35 ?)
# Line 272  C     Thus a checkpoint contains U.00000 Line 322  C     Thus a checkpoint contains U.00000
322  C     etaN.0000000001 in the indexing scheme used for the model  C     etaN.0000000001 in the indexing scheme used for the model
323  C     "state" files. This example is referred to as a checkpoint  C     "state" files. This example is referred to as a checkpoint
324  C     at time level 1  C     at time level 1
325        CALL TIMER_START('WRITE_CHECKPOINT    [THE_MAIN_LOOP]',myThid)        CALL TIMER_START('WRITE_CHECKPOINT    [FORWARD_STEP]',myThid)
326        CALL WRITE_CHECKPOINT(        CALL WRITE_CHECKPOINT(
327       &        .FALSE., myTime, myIter, myThid )       &        .FALSE., myTime, myIter, myThid )
328        CALL TIMER_STOP ('WRITE_CHECKPOINT    [THE_MAIN_LOOP]',myThid)        CALL TIMER_STOP ('WRITE_CHECKPOINT    [FORWARD_STEP]',myThid)
   
 #endif /* ALLOW_AUTODIFF_TAMC */  
329    
330        END        END

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

  ViewVC Help
Powered by ViewVC 1.1.22