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

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

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


Revision 1.27 - (show annotations) (download)
Fri Jun 26 23:10:09 2009 UTC (14 years, 10 months ago) by jahn
Branch: MAIN
CVS Tags: checkpoint62c, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62i, checkpoint62h, checkpoint62, checkpoint62b, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61s, checkpoint61z, checkpoint61x, checkpoint61y
Changes since 1.26: +19 -1 lines
add package longstep

1 C $Header: /u/gcmpack/MITgcm/model/src/impldiff.F,v 1.26 2006/12/05 05:25:08 jmc Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 CBOP
8 C !ROUTINE: IMPLDIFF
9 C !INTERFACE:
10 SUBROUTINE IMPLDIFF( bi, bj, iMin, iMax, jMin, jMax,
11 I tracerId, KappaRX, recip_hFac,
12 U gXNm1,
13 I myThid )
14 C !DESCRIPTION: \bv
15 C *==========================================================*
16 C | S/R IMPLDIFF
17 C | o Solve implicit diffusion equation for vertical
18 C | diffusivity.
19 C *==========================================================*
20 C | o Recoded from 2d intermediate fields to 3d to reduce
21 C | TAMC storage
22 C | o Fixed missing masks for fields a(), c()
23 C *==========================================================*
24 C \ev
25
26 C !USES:
27 IMPLICIT NONE
28 C == Global data ==
29 #include "SIZE.h"
30 #include "DYNVARS.h"
31 #include "EEPARAMS.h"
32 #include "PARAMS.h"
33 #include "GRID.h"
34 #ifdef ALLOW_GENERIC_ADVDIFF
35 #include "GAD.h"
36 #endif
37 #ifdef ALLOW_LONGSTEP
38 #include "LONGSTEP_PARAMS.h"
39 #endif
40 #ifdef ALLOW_PTRACERS
41 #include "PTRACERS_SIZE.h"
42 #include "PTRACERS_PARAMS.h"
43 #endif
44 #ifdef ALLOW_AUTODIFF_TAMC
45 #include "tamc_keys.h"
46 #endif
47
48 C !INPUT/OUTPUT PARAMETERS:
49 C == Routine Arguments ==
50 C tracerId :: tracer Identificator (if > 0) ;
51 C = 0 or < 0 when solving vertical viscosity implicitly for U or V
52 INTEGER bi,bj,iMin,iMax,jMin,jMax
53 INTEGER tracerId
54 _RL KappaRX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
55 _RS recip_hFac(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
56 _RL gXnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
57 INTEGER myThid
58
59 C !LOCAL VARIABLES:
60 C == Local variables ==
61 INTEGER i,j,k
62 _RL deltaTX(Nr)
63 _RL gYnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
64 _RL a(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
65 _RL b(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
66 _RL c(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
67 _RL bet(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
68 _RL gam(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
69 #ifdef ALLOW_DIAGNOSTICS
70 CHARACTER*8 diagName
71 CHARACTER*4 diagSufx
72 #ifdef ALLOW_GENERIC_ADVDIFF
73 CHARACTER*4 GAD_DIAG_SUFX
74 EXTERNAL GAD_DIAG_SUFX
75 #endif
76 LOGICAL DIAGNOSTICS_IS_ON
77 EXTERNAL DIAGNOSTICS_IS_ON
78 _RL df (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
79 #endif /* ALLOW_DIAGNOSTICS */
80 CEOP
81
82 cph(
83 cph Not good for TAF: may create irreducible control flow graph
84 cph IF (Nr.LE.1) RETURN
85 cph)
86
87 #ifdef ALLOW_PTRACERS
88 IF ( tracerId.GE.GAD_TR1) THEN
89 DO k=1,Nr
90 deltaTX(k) = PTRACERS_dTLev(k)
91 ENDDO
92 ELSEIF ( tracerId.GE.1 ) THEN
93 #else
94 IF ( tracerId.GE.1 ) THEN
95 #endif
96 DO k=1,Nr
97 deltaTX(k) = dTtracerLev(k)
98 ENDDO
99 ELSE
100 DO k=1,Nr
101 deltaTX(k) = deltaTmom
102 ENDDO
103 ENDIF
104
105 C-- Initialise
106 DO k=1,Nr
107 DO j=jMin,jMax
108 DO i=iMin,iMax
109 gYNm1(i,j,k,bi,bj) = 0. _d 0
110 ENDDO
111 ENDDO
112 ENDDO
113
114 C-- Old aLower
115 DO j=jMin,jMax
116 DO i=iMin,iMax
117 a(i,j,1) = 0. _d 0
118 ENDDO
119 ENDDO
120 DO k=2,Nr
121 DO j=jMin,jMax
122 DO i=iMin,iMax
123 a(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
124 & *recip_deepFac2C(k)*recip_rhoFacC(k)
125 & *KappaRX(i,j, k )*recip_drC( k )
126 & *deepFac2F(k)*rhoFacF(k)
127 IF (recip_hFac(i,j,k-1,bi,bj).EQ.0.) a(i,j,k)=0.
128 ENDDO
129 ENDDO
130 ENDDO
131
132 C-- Old aUpper
133 DO k=1,Nr-1
134 DO j=jMin,jMax
135 DO i=iMin,iMax
136 c(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
137 & *recip_deepFac2C(k)*recip_rhoFacC(k)
138 & *KappaRX(i,j,k+1)*recip_drC(k+1)
139 & *deepFac2F(k+1)*rhoFacF(k+1)
140 IF (recip_hFac(i,j,k+1,bi,bj).EQ.0.) c(i,j,k)=0.
141 ENDDO
142 ENDDO
143 ENDDO
144 DO j=jMin,jMax
145 DO i=iMin,iMax
146 c(i,j,Nr) = 0. _d 0
147 ENDDO
148 ENDDO
149
150 C-- Old aCenter
151 DO k=1,Nr
152 DO j=jMin,jMax
153 DO i=iMin,iMax
154 b(i,j,k) = 1. _d 0 - c(i,j,k) - a(i,j,k)
155 ENDDO
156 ENDDO
157 ENDDO
158
159 C-- Old and new gam, bet are the same
160 DO k=1,Nr
161 DO j=jMin,jMax
162 DO i=iMin,iMax
163 bet(i,j,k) = 1. _d 0
164 gam(i,j,k) = 0. _d 0
165 ENDDO
166 ENDDO
167 ENDDO
168
169 C-- Only need do anything if Nr>1
170 IF (Nr.GT.1) THEN
171
172 k = 1
173 C-- Beginning of forward sweep (top level)
174 DO j=jMin,jMax
175 DO i=iMin,iMax
176 IF (b(i,j,1).NE.0.) bet(i,j,1) = 1. _d 0 / b(i,j,1)
177 ENDDO
178 ENDDO
179
180 ENDIF
181
182 C-- Middle of forward sweep
183 IF (Nr.GE.2) THEN
184
185 CADJ loop = sequential
186 DO k=2,Nr
187
188 DO j=jMin,jMax
189 DO i=iMin,iMax
190 gam(i,j,k) = c(i,j,k-1)*bet(i,j,k-1)
191 IF ( ( b(i,j,k) - a(i,j,k)*gam(i,j,k) ) .NE. 0.)
192 & bet(i,j,k) = 1. _d 0 / ( b(i,j,k) - a(i,j,k)*gam(i,j,k) )
193 ENDDO
194 ENDDO
195
196 ENDDO
197
198 ENDIF
199
200
201 DO j=jMin,jMax
202 DO i=iMin,iMax
203 gYNm1(i,j,1,bi,bj) = gXNm1(i,j,1,bi,bj)*bet(i,j,1)
204 ENDDO
205 ENDDO
206 DO k=2,Nr
207 DO j=jMin,jMax
208 DO i=iMin,iMax
209 gYnm1(i,j,k,bi,bj) = bet(i,j,k)*
210 & (gXnm1(i,j,k,bi,bj) - a(i,j,k)*gYnm1(i,j,k-1,bi,bj))
211 ENDDO
212 ENDDO
213 ENDDO
214
215
216 C-- Backward sweep
217 CADJ loop = sequential
218 DO k=Nr-1,1,-1
219 DO j=jMin,jMax
220 DO i=iMin,iMax
221 gYnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
222 & -gam(i,j,k+1)*gYnm1(i,j,k+1,bi,bj)
223 ENDDO
224 ENDDO
225 ENDDO
226
227 DO k=1,Nr
228 DO j=jMin,jMax
229 DO i=iMin,iMax
230 gXnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
231 ENDDO
232 ENDDO
233 ENDDO
234
235 #ifdef ALLOW_DIAGNOSTICS
236 IF ( useDiagnostics .AND.tracerId.NE.0 ) THEN
237 IF ( tracerId.GE. 1 ) THEN
238 C-- Set diagnostic suffix for the current tracer
239 #ifdef ALLOW_GENERIC_ADVDIFF
240 diagSufx = GAD_DIAG_SUFX( tracerId, myThid )
241 #else
242 diagSufx = 'aaaa'
243 #endif
244 diagName = 'DFrI'//diagSufx
245 ELSEIF ( tracerId.EQ. -1 ) THEN
246 diagName = 'VISrI_Um'
247 ELSEIF ( tracerId.EQ. -2 ) THEN
248 diagName = 'VISrI_Vm'
249 ELSE
250 STOP 'IMPLIDIFF: should never reach this point !'
251 ENDIF
252 IF ( DIAGNOSTICS_IS_ON(diagName,myThid) ) THEN
253 DO k= 1,Nr
254 IF ( k.EQ.1 ) THEN
255 C- Note: Needs to call DIAGNOSTICS_FILL at level k=1 even if array == 0
256 C otherwise counter is not incremented !!
257 DO j=1-OLy,sNy+OLy
258 DO i=1-OLx,sNx+OLx
259 df(i,j) = 0. _d 0
260 ENDDO
261 ENDDO
262 ELSEIF ( tracerId.GE.1 ) THEN
263 DO j=1,sNy
264 DO i=1,sNx
265 df(i,j) =
266 & -rA(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
267 & * KappaRX(i,j,k)*recip_drC(k)
268 & * (gXnm1(i,j,k,bi,bj) - gXnm1(i,j,k-1,bi,bj))*rkSign
269 ENDDO
270 ENDDO
271 ELSEIF ( tracerId.EQ.-1 ) THEN
272 DO j=1,sNy
273 DO i=1,sNx+1
274 df(i,j) =
275 & -rAw(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
276 & * KappaRX(i,j,k)*recip_drC(k)
277 & * (gXnm1(i,j,k,bi,bj) - gXnm1(i,j,k-1,bi,bj))*rkSign
278 & * _maskW(i,j,k,bi,bj)
279 & * _maskW(i,j,k-1,bi,bj)
280 ENDDO
281 ENDDO
282 ELSEIF ( tracerId.EQ.-2 ) THEN
283 DO j=1,sNy+1
284 DO i=1,sNx
285 df(i,j) =
286 & -rAs(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
287 & * KappaRX(i,j,k)*recip_drC(k)
288 & * (gXnm1(i,j,k,bi,bj) - gXnm1(i,j,k-1,bi,bj))*rkSign
289 & * _maskS(i,j,k,bi,bj)
290 & * _maskS(i,j,k-1,bi,bj)
291 ENDDO
292 ENDDO
293 ENDIF
294 CALL DIAGNOSTICS_FILL(df,diagName, k,1, 2,bi,bj, myThid)
295 ENDDO
296 ENDIF
297 ENDIF
298 #endif /* ALLOW_DIAGNOSTICS */
299
300 RETURN
301 END

  ViewVC Help
Powered by ViewVC 1.1.22