/[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.46 - (show annotations) (download)
Wed Jun 7 01:55:13 2006 UTC (17 years, 11 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint59, checkpoint58y_post, checkpoint58t_post, checkpoint58m_post, checkpoint58w_post, checkpoint58o_post, checkpoint58p_post, checkpoint58q_post, mitgcm_mapl_00, checkpoint58r_post, checkpoint58n_post, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59a, checkpoint59c, checkpoint59b, checkpoint59h, checkpoint58k_post, checkpoint58v_post, checkpoint58l_post, checkpoint58x_post, checkpoint58h_post, checkpoint58j_post, checkpoint58i_post, checkpoint58u_post, checkpoint58s_post
Changes since 1.45: +3 -3 lines
Modifications for bottom topography control
o replace hFacC by _hFacC at various places
o replace ALLOW_HFACC_CONTROL by ALLOW_DEPTH_CONTROL
o add non-self-adjoint cg2d_nsa
o update autodiff support routines
o re-initialise hfac after ctrl_depth_ini
o works for 5x5 box, doesnt work for global_ocean.90x40x15

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

  ViewVC Help
Powered by ViewVC 1.1.22