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

Annotation of /MITgcm/model/src/timestep.F

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


Revision 1.41 - (hide annotations) (download)
Fri Sep 30 00:22:37 2005 UTC (18 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57t_post, checkpoint57v_post, checkpint57u_post, checkpoint57w_post
Changes since 1.40: +30 -22 lines
compute gUext,gVext only if diagnostic Um_ext,Vm_ext is on ;
 fill those diag. also if momForcing_In_AB=T (was missing).

1 jmc 1.41 C $Header: /u/gcmpack/MITgcm/model/src/timestep.F,v 1.40 2005/09/29 16:47:16 baylor Exp $
2 jmc 1.21 C $Name: $
3 cnh 1.1
4 edhill 1.34 #include "PACKAGES_CONFIG.h"
5 adcroft 1.10 #include "CPP_OPTIONS.h"
6 cnh 1.1
7 cnh 1.27 CBOP
8     C !ROUTINE: TIMESTEP
9     C !INTERFACE:
10 jmc 1.32 SUBROUTINE TIMESTEP( bi, bj, iMin, iMax, jMin, jMax, k,
11 jmc 1.31 I dPhiHydX,dPhiHydY, phiSurfX, phiSurfY,
12 jmc 1.36 I guDissip, gvDissip,
13 jmc 1.32 I myTime, myIter, myThid )
14 cnh 1.27 C !DESCRIPTION: \bv
15     C *==========================================================*
16     C | S/R TIMESTEP
17     C | o Step model fields forward in time
18     C *==========================================================*
19     C \ev
20    
21     C !USES:
22 jmc 1.21 IMPLICIT NONE
23 heimbach 1.18 C == Global variables ==
24 cnh 1.1 #include "SIZE.h"
25     #include "DYNVARS.h"
26 cnh 1.11 #include "EEPARAMS.h"
27 cnh 1.1 #include "PARAMS.h"
28     #include "GRID.h"
29 jmc 1.26 #include "SURFACE.h"
30 heimbach 1.18
31 cnh 1.27 C !INPUT/OUTPUT PARAMETERS:
32 cnh 1.1 C == Routine Arguments ==
33 jmc 1.29 C dPhiHydX,Y :: Gradient (X & Y directions) of Hydrostatic Potential
34     C phiSurfX :: gradient of Surface potential (Pressure/rho, ocean)
35     C phiSurfY :: or geopotential (atmos) in X and Y direction
36 jmc 1.36 C guDissip :: dissipation tendency (all explicit terms), u component
37     C gvDissip :: dissipation tendency (all explicit terms), v component
38    
39 cnh 1.1 INTEGER bi,bj,iMin,iMax,jMin,jMax
40 jmc 1.32 INTEGER k
41 jmc 1.29 _RL dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
42     _RL dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
43 jmc 1.21 _RL phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
44     _RL phiSurfY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
45 jmc 1.36 _RL guDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
46     _RL gvDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
47 jmc 1.32 _RL myTime
48 adcroft 1.17 INTEGER myIter, myThid
49 heimbach 1.18
50 cnh 1.27 C !LOCAL VARIABLES:
51 cnh 1.1 C == Local variables ==
52 jmc 1.32 LOGICAL momForcing_In_AB
53 jmc 1.36 LOGICAL momDissip_In_AB
54 adcroft 1.4 INTEGER i,j
55 adcroft 1.7 _RL ab15,ab05
56 jmc 1.21 _RL phxFac,phyFac, psFac
57 jmc 1.26 _RL gUtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
58     _RL gVtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
59 jmc 1.41 #ifdef ALLOW_DIAGNOSTICS
60 baylor 1.40 C Allow diagnosis of external forcing
61 jmc 1.41 LOGICAL externForcDiagIsOn
62     LOGICAL DIAGNOSTICS_IS_ON
63     EXTERNAL DIAGNOSTICS_IS_ON
64 baylor 1.40 _RL gUext(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
65     _RL gVext(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
66 jmc 1.41 #endif
67 edhill 1.34 #ifdef ALLOW_CD_CODE
68 jmc 1.32 _RL guCor(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
69     _RL gvCor(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
70     #endif
71 cnh 1.27 CEOP
72 cnh 1.1
73     C Adams-Bashforth timestepping weights
74 adcroft 1.25 IF (myIter .EQ. 0) THEN
75     ab15=1.0
76     ab05=0.0
77     ELSE
78 adcroft 1.17 ab15=1.5+abeps
79     ab05=-0.5-abeps
80 adcroft 1.25 ENDIF
81 cnh 1.1
82 jmc 1.29 C-- explicit part of the surface potential gradient is added in this S/R
83     psFac = pfFacMom*(1. _d 0 - implicSurfPress)
84    
85 jmc 1.38 C-- factors for gradient (X & Y directions) of Hydrostatic Potential
86     phxFac = pfFacMom
87     phyFac = pfFacMom
88    
89 jmc 1.32 C-- including or excluding momentum forcing from Adams-Bashforth:
90     momForcing_In_AB = forcing_In_AB
91     momForcing_In_AB = .TRUE.
92 jmc 1.36 momDissip_In_AB = .TRUE.
93 jmc 1.32
94 jmc 1.41 #ifdef ALLOW_DIAGNOSTICS
95     externForcDiagIsOn = useDiagnostics .AND. momForcing
96     IF ( externForcDiagIsOn ) THEN
97     externForcDiagIsOn = DIAGNOSTICS_IS_ON('Um_Ext ',myThid)
98     & .OR. DIAGNOSTICS_IS_ON('Vm_Ext ',myThid)
99     ENDIF
100     #endif /* ALLOW_DIAGNOSTICS */
101    
102 jmc 1.26 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
103 jmc 1.32
104     C- Initialize local arrays (not really necessary but safer)
105     DO j=1-Oly,sNy+Oly
106     DO i=1-Olx,sNx+Olx
107     gUtmp(i,j) = 0. _d 0
108     gVtmp(i,j) = 0. _d 0
109 edhill 1.34 #ifdef ALLOW_CD_CODE
110 jmc 1.32 guCor(i,j) = 0. _d 0
111     gvCor(i,j) = 0. _d 0
112     #endif
113     ENDDO
114     ENDDO
115    
116 jmc 1.38 IF ( .NOT.staggerTimeStep ) THEN
117 jmc 1.36 C-- Synchronous time step: add grad Phi_Hyp to gU,gV before doing Adams-Bashforth
118 jmc 1.38 DO j=jMin,jMax
119     DO i=iMin,iMax
120     gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj) - phxFac*dPhiHydX(i,j)
121     gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj) - phyFac*dPhiHydY(i,j)
122     ENDDO
123     ENDDO
124 jmc 1.36 phxFac = 0.
125     phyFac = 0.
126 jmc 1.38 c ELSE
127     C-- Stagger time step: grad Phi_Hyp will be added later
128 jmc 1.36 ENDIF
129    
130     C-- Dissipation term inside the Adams-Bashforth:
131 jmc 1.38 IF ( momViscosity .AND. momDissip_In_AB) THEN
132 jmc 1.36 DO j=jMin,jMax
133     DO i=iMin,iMax
134     gU(i,j,k,bi,bj) = gU(i,j,k,bi,bj) + guDissip(i,j)
135     gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj) + gvDissip(i,j)
136     ENDDO
137     ENDDO
138     ENDIF
139    
140 jmc 1.32 C-- Forcing term inside the Adams-Bashforth:
141     IF (momForcing .AND. momForcing_In_AB) THEN
142 baylor 1.40 #ifdef ALLOW_DIAGNOSTICS
143 jmc 1.41 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
144     DO j=1,sNy+1
145     DO i=1,sNx+1
146 baylor 1.40 gUext(i,j) = gU(i,j,k,bi,bj)
147     gVext(i,j) = gV(i,j,k,bi,bj)
148     ENDDO
149     ENDDO
150     ENDIF
151     #endif /* ALLOW_DIAGNOSTICS */
152    
153 jmc 1.32 CALL EXTERNAL_FORCING_U(
154     I iMin,iMax,jMin,jMax,bi,bj,k,
155     I myTime,myThid)
156     CALL EXTERNAL_FORCING_V(
157     I iMin,iMax,jMin,jMax,bi,bj,k,
158     I myTime,myThid)
159 baylor 1.40
160     #ifdef ALLOW_DIAGNOSTICS
161 jmc 1.41 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
162     DO j=1,sNy+1
163     DO i=1,sNx+1
164 baylor 1.40 gUext(i,j) = gU(i,j,k,bi,bj)-gUext(i,j)
165     gVext(i,j) = gV(i,j,k,bi,bj)-gVext(i,j)
166     ENDDO
167     ENDDO
168     ENDIF
169     #endif /* ALLOW_DIAGNOSTICS */
170 jmc 1.32 ENDIF
171    
172 jmc 1.37 IF (useCDscheme) THEN
173     C- for CD-scheme, store gU,Vtmp = gU,V^n + forcing
174     DO j=jMin,jMax
175     DO i=iMin,iMax
176     gUtmp(i,j) = gU(i,j,k,bi,bj)
177     gVtmp(i,j) = gV(i,j,k,bi,bj)
178     ENDDO
179     ENDDO
180     ENDIF
181    
182 jmc 1.32 C- Compute effective gU,gV_[n+1/2] terms (including Adams-Bashforth weights)
183     C and save gU,gV_[n] into guNm1,gvNm1 for the next time step.
184 jmc 1.37 #ifdef ALLOW_ADAMSBASHFORTH_3
185     CALL ADAMS_BASHFORTH3(
186     I bi, bj, k,
187     U gU, guNm,
188     I myIter, myThid )
189     CALL ADAMS_BASHFORTH3(
190     I bi, bj, k,
191     U gV, gvNm,
192     I myIter, myThid )
193     #else /* ALLOW_ADAMSBASHFORTH_3 */
194     CALL ADAMS_BASHFORTH2(
195     I bi, bj, k,
196     U gU, guNm1,
197     I myIter, myThid )
198     CALL ADAMS_BASHFORTH2(
199     I bi, bj, k,
200     U gV, gvNm1,
201     I myIter, myThid )
202     #endif /* ALLOW_ADAMSBASHFORTH_3 */
203 jmc 1.26
204 jmc 1.32 C-- Forcing term outside the Adams-Bashforth:
205 baylor 1.40 C (not recommended with CD-scheme ON)
206 jmc 1.32 IF (momForcing .AND. .NOT.momForcing_In_AB) THEN
207 jmc 1.37 IF (useCDscheme) THEN
208     DO j=jMin,jMax
209     DO i=iMin,iMax
210     gUtmp(i,j) = gUtmp(i,j) - gU(i,j,k,bi,bj)
211     gVtmp(i,j) = gVtmp(i,j) - gV(i,j,k,bi,bj)
212     ENDDO
213     ENDDO
214     ENDIF
215 baylor 1.40 #ifdef ALLOW_DIAGNOSTICS
216 jmc 1.41 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
217     DO j=1,sNy+1
218     DO i=1,sNx+1
219 baylor 1.40 gUext(i,j) = gU(i,j,k,bi,bj)
220     gVext(i,j) = gV(i,j,k,bi,bj)
221     ENDDO
222     ENDDO
223     ENDIF
224     #endif /* ALLOW_DIAGNOSTICS */
225    
226 jmc 1.32 CALL EXTERNAL_FORCING_U(
227     I iMin,iMax,jMin,jMax,bi,bj,k,
228     I myTime,myThid)
229     CALL EXTERNAL_FORCING_V(
230     I iMin,iMax,jMin,jMax,bi,bj,k,
231     I myTime,myThid)
232 jmc 1.37
233 baylor 1.40 #ifdef ALLOW_DIAGNOSTICS
234 jmc 1.41 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
235     DO j=1,sNy+1
236     DO i=1,sNx+1
237 baylor 1.40 gUext(i,j) = gU(i,j,k,bi,bj)-gUext(i,j)
238     gVext(i,j) = gV(i,j,k,bi,bj)-gVext(i,j)
239     ENDDO
240     ENDDO
241     ENDIF
242     #endif /* ALLOW_DIAGNOSTICS */
243    
244 jmc 1.37 C- for CD-scheme, compute gU,Vtmp = gU,V^n + forcing
245 jmc 1.32 IF (useCDscheme) THEN
246 jmc 1.28 DO j=jMin,jMax
247     DO i=iMin,iMax
248 jmc 1.37 gUtmp(i,j) = gUtmp(i,j) + gU(i,j,k,bi,bj)
249     gVtmp(i,j) = gVtmp(i,j) + gV(i,j,k,bi,bj)
250 jmc 1.28 ENDDO
251 jmc 1.26 ENDDO
252 jmc 1.28 ENDIF
253 jmc 1.26 ENDIF
254    
255 edhill 1.34 #ifdef ALLOW_CD_CODE
256 jmc 1.32 IF (useCDscheme) THEN
257     C- Step forward D-grid velocity using C-grid gU,Vtmp = gU,V^n + forcing
258     C and return coriolis terms on C-grid (guCor,gvCor)
259 heimbach 1.35 CALL CD_CODE_SCHEME(
260 edhill 1.34 I bi,bj,k, dPhiHydX,dPhiHydY, gUtmp,gVtmp,
261     O guCor,gvCor,
262     I myTime, myIter, myThid)
263 jmc 1.32 DO j=jMin,jMax
264     DO i=iMin,iMax
265     gUtmp(i,j) = gU(i,j,k,bi,bj)
266     & + guCor(i,j)
267     gVtmp(i,j) = gV(i,j,k,bi,bj)
268     & + gvCor(i,j)
269     ENDDO
270 cnh 1.1 ENDDO
271 jmc 1.37 ELSE
272     #endif /* ALLOW_CD_CODE */
273     DO j=jMin,jMax
274     DO i=iMin,iMax
275     gUtmp(i,j) = gU(i,j,k,bi,bj)
276     gVtmp(i,j) = gV(i,j,k,bi,bj)
277     ENDDO
278     ENDDO
279     #ifdef ALLOW_CD_CODE
280 jmc 1.32 ENDIF
281 jmc 1.37 #endif
282 adcroft 1.19
283 jmc 1.26 #ifdef NONLIN_FRSURF
284     IF (.NOT. vectorInvariantMomentum
285     & .AND. nonlinFreeSurf.GT.1) THEN
286 jmc 1.28 IF (select_rStar.GT.0) THEN
287     DO j=jMin,jMax
288     DO i=iMin,iMax
289 jmc 1.32 gUtmp(i,j) = gUtmp(i,j)/rStarExpW(i,j,bi,bj)
290 jmc 1.28 gVtmp(i,j) = gVtmp(i,j)/rStarExpS(i,j,bi,bj)
291     ENDDO
292     ENDDO
293     ELSE
294     DO j=jMin,jMax
295     DO i=iMin,iMax
296 jmc 1.32 IF ( k.EQ.ksurfW(i,j,bi,bj) ) THEN
297     gUtmp(i,j) = gUtmp(i,j)
298     & *hFacW(i,j,k,bi,bj)/hFac_surfW(i,j,bi,bj)
299     ENDIF
300 jmc 1.28 IF ( k.EQ.ksurfS(i,j,bi,bj) ) THEN
301 jmc 1.26 gVtmp(i,j) = gVtmp(i,j)
302     & *hFacS(i,j,k,bi,bj)/hFac_surfS(i,j,bi,bj)
303 jmc 1.28 ENDIF
304     ENDDO
305 jmc 1.26 ENDDO
306 jmc 1.28 ENDIF
307 jmc 1.26 ENDIF
308 jmc 1.32 #endif /* NONLIN_FRSURF */
309    
310     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
311    
312 jmc 1.36 C-- Dissipation term outside the Adams-Bashforth:
313 jmc 1.38 IF ( momViscosity .AND. .NOT.momDissip_In_AB ) THEN
314 jmc 1.36 DO j=jMin,jMax
315     DO i=iMin,iMax
316     gUtmp(i,j) = gUtmp(i,j) + guDissip(i,j)
317     gVtmp(i,j) = gVtmp(i,j) + gvDissip(i,j)
318     ENDDO
319     ENDDO
320     ENDIF
321    
322 jmc 1.32 C Step forward zonal velocity (store in Gu)
323     DO j=jMin,jMax
324     DO i=iMin,iMax
325     gU(i,j,k,bi,bj) = uVel(i,j,k,bi,bj)
326     & +deltaTmom*(
327     & gUtmp(i,j)
328     & - psFac*phiSurfX(i,j)
329     & - phxFac*dPhiHydX(i,j)
330     & )*_maskW(i,j,k,bi,bj)
331     ENDDO
332     ENDDO
333 jmc 1.26
334 adcroft 1.7 C Step forward meridional velocity (store in Gv)
335 adcroft 1.19 DO j=jMin,jMax
336 cnh 1.1 DO i=iMin,iMax
337 jmc 1.32 gV(i,j,k,bi,bj) = vVel(i,j,k,bi,bj)
338 jmc 1.26 & +deltaTmom*(
339     & gVtmp(i,j)
340     & - psFac*phiSurfY(i,j)
341 jmc 1.29 & - phyFac*dPhiHydY(i,j)
342 adcroft 1.7 & )*_maskS(i,j,k,bi,bj)
343 cnh 1.1 ENDDO
344 adcroft 1.19 ENDDO
345 cnh 1.1
346 jmc 1.39 #ifdef ALLOW_DIAGNOSTICS
347 jmc 1.41 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
348     CALL DIAGNOSTICS_FILL(gUext,'Um_Ext ',k,1,2,bi,bj,myThid)
349     CALL DIAGNOSTICS_FILL(gVext,'Vm_Ext ',k,1,2,bi,bj,myThid)
350     ENDIF
351 jmc 1.39 #ifdef ALLOW_CD_CODE
352     IF ( useCDscheme .AND. useDiagnostics ) THEN
353     CALL DIAGNOSTICS_FILL(guCor,'Um_Cori ',k,1,2,bi,bj,myThid)
354     CALL DIAGNOSTICS_FILL(gvCor,'Vm_Cori ',k,1,2,bi,bj,myThid)
355     ENDIF
356     #endif /* ALLOW_CD_CODE */
357     #endif /* ALLOW_DIAGNOSTICS */
358    
359 cnh 1.1 RETURN
360     END

  ViewVC Help
Powered by ViewVC 1.1.22