/[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.47 - (hide annotations) (download)
Fri Oct 19 14:41:39 2007 UTC (16 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint60, checkpoint61, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59i, checkpoint59k, checkpoint61f, checkpoint61n, checkpoint59j, checkpoint61q, checkpoint61e, checkpoint61g, checkpoint61d, checkpoint61b, checkpoint61c, checkpoint61a, checkpoint61o, checkpoint61l, checkpoint61m, checkpoint61j, checkpoint61k, checkpoint61h, checkpoint61i, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint61x, checkpoint61y
Changes since 1.46: +6 -9 lines
prepare for "clever pickup" implementation:
add startAB parameter to argument list of S/R ADAMS_BASHFORTH2

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

  ViewVC Help
Powered by ViewVC 1.1.22