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

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

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


Revision 1.44 - (show annotations) (download)
Thu Feb 23 20:55:49 2006 UTC (18 years, 2 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 C $Header: /u/gcmpack/MITgcm/model/src/timestep.F,v 1.43 2005/12/13 21:07:13 jmc Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 CBOP
8 C !ROUTINE: TIMESTEP
9 C !INTERFACE:
10 SUBROUTINE TIMESTEP( bi, bj, iMin, iMax, jMin, jMax, k,
11 I dPhiHydX,dPhiHydY, phiSurfX, phiSurfY,
12 I guDissip, gvDissip,
13 I myTime, myIter, myThid )
14 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 IMPLICIT NONE
23 C == Global variables ==
24 #include "SIZE.h"
25 #include "DYNVARS.h"
26 #include "EEPARAMS.h"
27 #include "PARAMS.h"
28 #include "GRID.h"
29 #include "SURFACE.h"
30
31 C !INPUT/OUTPUT PARAMETERS:
32 C == Routine Arguments ==
33 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 C guDissip :: dissipation tendency (all explicit terms), u component
37 C gvDissip :: dissipation tendency (all explicit terms), v component
38
39 INTEGER bi,bj,iMin,iMax,jMin,jMax
40 INTEGER k
41 _RL dPhiHydX(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
42 _RL dPhiHydY(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
43 _RL phiSurfX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
44 _RL phiSurfY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
45 _RL guDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
46 _RL gvDissip(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
47 _RL myTime
48 INTEGER myIter, myThid
49
50 C !LOCAL VARIABLES:
51 C == Local variables ==
52 LOGICAL momForcing_In_AB
53 LOGICAL momDissip_In_AB
54 LOGICAL momStartAB
55 INTEGER i,j
56 _RL phxFac,phyFac, psFac
57 _RL gUtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
58 _RL gVtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
59 #ifdef ALLOW_DIAGNOSTICS
60 C Allow diagnosis of external forcing
61 LOGICAL externForcDiagIsOn
62 LOGICAL DIAGNOSTICS_IS_ON
63 EXTERNAL DIAGNOSTICS_IS_ON
64 _RL gUext(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
65 _RL gVext(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
66 #endif
67 #ifdef ALLOW_CD_CODE
68 _RL guCor(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
69 _RL gvCor(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
70 #endif
71 CEOP
72
73 C Start AB with low-order timestepping weights
74 momStartAB = nIter0.EQ.0
75
76 C-- explicit part of the surface potential gradient is added in this S/R
77 psFac = pfFacMom*(1. _d 0 - implicSurfPress)
78
79 C-- factors for gradient (X & Y directions) of Hydrostatic Potential
80 phxFac = pfFacMom
81 phyFac = pfFacMom
82
83 C-- including or excluding momentum forcing from Adams-Bashforth:
84 momForcing_In_AB = forcing_In_AB
85 momForcing_In_AB = .TRUE.
86 momDissip_In_AB = .TRUE.
87
88 #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 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
97
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 #ifdef ALLOW_CD_CODE
104 guCor(i,j) = 0. _d 0
105 gvCor(i,j) = 0. _d 0
106 #endif
107 ENDDO
108 ENDDO
109
110 IF ( .NOT.staggerTimeStep .AND. .NOT. implicitIntGravWave ) THEN
111 C-- Synchronous time step: add grad Phi_Hyp to gU,gV before doing Adams-Bashforth
112 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 phxFac = 0.
119 phyFac = 0.
120 c ELSE
121 C-- Stagger time step: grad Phi_Hyp will be added later
122 ENDIF
123
124 C-- Dissipation term inside the Adams-Bashforth:
125 IF ( momViscosity .AND. momDissip_In_AB) THEN
126 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 C-- Forcing term inside the Adams-Bashforth:
135 IF (momForcing .AND. momForcing_In_AB) THEN
136 #ifdef ALLOW_DIAGNOSTICS
137 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
138 DO j=1,sNy+1
139 DO i=1,sNx+1
140 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 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
154 #ifdef ALLOW_DIAGNOSTICS
155 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
156 DO j=1,sNy+1
157 DO i=1,sNx+1
158 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 ENDIF
165
166 IF (useCDscheme) THEN
167 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 ENDIF
184
185 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 #ifdef ALLOW_ADAMSBASHFORTH_3
188 CALL ADAMS_BASHFORTH3(
189 I bi, bj, k,
190 U gU, guNm,
191 I momStartAB, myIter, myThid )
192 CALL ADAMS_BASHFORTH3(
193 I bi, bj, k,
194 U gV, gvNm,
195 I momStartAB, myIter, myThid )
196 #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
207 C-- Forcing term outside the Adams-Bashforth:
208 C (not recommended with CD-scheme ON)
209 IF (momForcing .AND. .NOT.momForcing_In_AB) THEN
210 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 #ifdef ALLOW_DIAGNOSTICS
219 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
220 DO j=1,sNy+1
221 DO i=1,sNx+1
222 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 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
236 #ifdef ALLOW_DIAGNOSTICS
237 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
238 DO j=1,sNy+1
239 DO i=1,sNx+1
240 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 C- for CD-scheme, compute gU,Vtmp = gU,V^n + forcing
248 IF (useCDscheme) THEN
249 DO j=jMin,jMax
250 DO i=iMin,iMax
251 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 ENDDO
254 ENDDO
255 ENDIF
256 ENDIF
257
258 #ifdef ALLOW_CD_CODE
259 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 CALL CD_CODE_SCHEME(
263 I bi,bj,k, dPhiHydX,dPhiHydY, gUtmp,gVtmp,
264 O guCor,gvCor,
265 I myTime, myIter, myThid)
266 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 ENDDO
274 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 ENDIF
284 #endif
285
286 #ifdef NONLIN_FRSURF
287 IF (.NOT. vectorInvariantMomentum
288 & .AND. nonlinFreeSurf.GT.1) THEN
289 IF (select_rStar.GT.0) THEN
290 DO j=jMin,jMax
291 DO i=iMin,iMax
292 gUtmp(i,j) = gUtmp(i,j)/rStarExpW(i,j,bi,bj)
293 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 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 IF ( k.EQ.ksurfS(i,j,bi,bj) ) THEN
304 gVtmp(i,j) = gVtmp(i,j)
305 & *hFacS(i,j,k,bi,bj)/hFac_surfS(i,j,bi,bj)
306 ENDIF
307 ENDDO
308 ENDDO
309 ENDIF
310 ENDIF
311 #endif /* NONLIN_FRSURF */
312
313 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
314
315 C-- Dissipation term outside the Adams-Bashforth:
316 IF ( momViscosity .AND. .NOT.momDissip_In_AB ) THEN
317 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 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
337 C Step forward meridional velocity (store in Gv)
338 DO j=jMin,jMax
339 DO i=iMin,iMax
340 gV(i,j,k,bi,bj) = vVel(i,j,k,bi,bj)
341 & +deltaTmom*(
342 & gVtmp(i,j)
343 & - psFac*phiSurfY(i,j)
344 & - phyFac*dPhiHydY(i,j)
345 & )*_maskS(i,j,k,bi,bj)
346 ENDDO
347 ENDDO
348
349 #ifdef ALLOW_DIAGNOSTICS
350 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 #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 RETURN
363 END

  ViewVC Help
Powered by ViewVC 1.1.22