/[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.44 - (hide annotations) (download)
Thu Feb 23 20:55:49 2006 UTC (18 years, 3 months ago) by jmc
Branch: MAIN
Changes since 1.43: +2 -2 lines
1rst implementation of  Implicit IGW using the 3-D solver (use3Dsolver=T)
 and based on the reference stratification

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

  ViewVC Help
Powered by ViewVC 1.1.22