/[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.41 - (show 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 C $Header: /u/gcmpack/MITgcm/model/src/timestep.F,v 1.40 2005/09/29 16:47:16 baylor 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 INTEGER i,j
55 _RL ab15,ab05
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 Adams-Bashforth timestepping weights
74 IF (myIter .EQ. 0) THEN
75 ab15=1.0
76 ab05=0.0
77 ELSE
78 ab15=1.5+abeps
79 ab05=-0.5-abeps
80 ENDIF
81
82 C-- explicit part of the surface potential gradient is added in this S/R
83 psFac = pfFacMom*(1. _d 0 - implicSurfPress)
84
85 C-- factors for gradient (X & Y directions) of Hydrostatic Potential
86 phxFac = pfFacMom
87 phyFac = pfFacMom
88
89 C-- including or excluding momentum forcing from Adams-Bashforth:
90 momForcing_In_AB = forcing_In_AB
91 momForcing_In_AB = .TRUE.
92 momDissip_In_AB = .TRUE.
93
94 #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 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
103
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 #ifdef ALLOW_CD_CODE
110 guCor(i,j) = 0. _d 0
111 gvCor(i,j) = 0. _d 0
112 #endif
113 ENDDO
114 ENDDO
115
116 IF ( .NOT.staggerTimeStep ) THEN
117 C-- Synchronous time step: add grad Phi_Hyp to gU,gV before doing Adams-Bashforth
118 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 phxFac = 0.
125 phyFac = 0.
126 c ELSE
127 C-- Stagger time step: grad Phi_Hyp will be added later
128 ENDIF
129
130 C-- Dissipation term inside the Adams-Bashforth:
131 IF ( momViscosity .AND. momDissip_In_AB) THEN
132 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 C-- Forcing term inside the Adams-Bashforth:
141 IF (momForcing .AND. momForcing_In_AB) THEN
142 #ifdef ALLOW_DIAGNOSTICS
143 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
144 DO j=1,sNy+1
145 DO i=1,sNx+1
146 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 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
160 #ifdef ALLOW_DIAGNOSTICS
161 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
162 DO j=1,sNy+1
163 DO i=1,sNx+1
164 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 ENDIF
171
172 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 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 #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
204 C-- Forcing term outside the Adams-Bashforth:
205 C (not recommended with CD-scheme ON)
206 IF (momForcing .AND. .NOT.momForcing_In_AB) THEN
207 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 #ifdef ALLOW_DIAGNOSTICS
216 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
217 DO j=1,sNy+1
218 DO i=1,sNx+1
219 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 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
233 #ifdef ALLOW_DIAGNOSTICS
234 IF ( useDiagnostics .AND. externForcDiagIsOn ) THEN
235 DO j=1,sNy+1
236 DO i=1,sNx+1
237 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 C- for CD-scheme, compute gU,Vtmp = gU,V^n + forcing
245 IF (useCDscheme) THEN
246 DO j=jMin,jMax
247 DO i=iMin,iMax
248 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 ENDDO
251 ENDDO
252 ENDIF
253 ENDIF
254
255 #ifdef ALLOW_CD_CODE
256 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 CALL CD_CODE_SCHEME(
260 I bi,bj,k, dPhiHydX,dPhiHydY, gUtmp,gVtmp,
261 O guCor,gvCor,
262 I myTime, myIter, myThid)
263 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 ENDDO
271 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 ENDIF
281 #endif
282
283 #ifdef NONLIN_FRSURF
284 IF (.NOT. vectorInvariantMomentum
285 & .AND. nonlinFreeSurf.GT.1) THEN
286 IF (select_rStar.GT.0) THEN
287 DO j=jMin,jMax
288 DO i=iMin,iMax
289 gUtmp(i,j) = gUtmp(i,j)/rStarExpW(i,j,bi,bj)
290 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 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 IF ( k.EQ.ksurfS(i,j,bi,bj) ) THEN
301 gVtmp(i,j) = gVtmp(i,j)
302 & *hFacS(i,j,k,bi,bj)/hFac_surfS(i,j,bi,bj)
303 ENDIF
304 ENDDO
305 ENDDO
306 ENDIF
307 ENDIF
308 #endif /* NONLIN_FRSURF */
309
310 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
311
312 C-- Dissipation term outside the Adams-Bashforth:
313 IF ( momViscosity .AND. .NOT.momDissip_In_AB ) THEN
314 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 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
334 C Step forward meridional velocity (store in Gv)
335 DO j=jMin,jMax
336 DO i=iMin,iMax
337 gV(i,j,k,bi,bj) = vVel(i,j,k,bi,bj)
338 & +deltaTmom*(
339 & gVtmp(i,j)
340 & - psFac*phiSurfY(i,j)
341 & - phyFac*dPhiHydY(i,j)
342 & )*_maskS(i,j,k,bi,bj)
343 ENDDO
344 ENDDO
345
346 #ifdef ALLOW_DIAGNOSTICS
347 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 #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 RETURN
360 END

  ViewVC Help
Powered by ViewVC 1.1.22