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

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

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


Revision 1.27 - (hide 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 jahn 1.27 C $Header: /u/gcmpack/MITgcm/model/src/impldiff.F,v 1.26 2006/12/05 05:25:08 jmc Exp $
2 cnh 1.17 C $Name: $
3 adcroft 1.1
4 jmc 1.23 #include "PACKAGES_CONFIG.h"
5 cnh 1.7 #include "CPP_OPTIONS.h"
6 adcroft 1.1
7 cnh 1.17 CBOP
8     C !ROUTINE: IMPLDIFF
9     C !INTERFACE:
10 adcroft 1.1 SUBROUTINE IMPLDIFF( bi, bj, iMin, iMax, jMin, jMax,
11 jmc 1.23 I tracerId, KappaRX, recip_hFac,
12 adcroft 1.8 U gXNm1,
13 adcroft 1.1 I myThid )
14 cnh 1.17 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 cnh 1.5 IMPLICIT NONE
28     C == Global data ==
29 adcroft 1.1 #include "SIZE.h"
30     #include "DYNVARS.h"
31 cnh 1.2 #include "EEPARAMS.h"
32 adcroft 1.1 #include "PARAMS.h"
33     #include "GRID.h"
34 jahn 1.27 #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 heimbach 1.9 #ifdef ALLOW_AUTODIFF_TAMC
45     #include "tamc_keys.h"
46     #endif
47    
48 cnh 1.17 C !INPUT/OUTPUT PARAMETERS:
49 adcroft 1.1 C == Routine Arguments ==
50 jmc 1.23 C tracerId :: tracer Identificator (if > 0) ;
51     C = 0 or < 0 when solving vertical viscosity implicitly for U or V
52 adcroft 1.1 INTEGER bi,bj,iMin,iMax,jMin,jMax
53 jmc 1.23 INTEGER tracerId
54 adcroft 1.8 _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 adcroft 1.1 INTEGER myThid
58 cnh 1.5
59 cnh 1.17 C !LOCAL VARIABLES:
60 adcroft 1.1 C == Local variables ==
61     INTEGER i,j,k
62 jmc 1.23 _RL deltaTX(Nr)
63 cnh 1.17 _RL gYnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
64 heimbach 1.12 _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 cnh 1.6 _RL gam(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
69 jmc 1.23 #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 cnh 1.17 CEOP
81 jmc 1.19
82 heimbach 1.21 cph(
83     cph Not good for TAF: may create irreducible control flow graph
84     cph IF (Nr.LE.1) RETURN
85     cph)
86 adcroft 1.1
87 jahn 1.27 #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 jmc 1.23 IF ( tracerId.GE.1 ) THEN
95 jahn 1.27 #endif
96 jmc 1.23 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 heimbach 1.12 C-- Initialise
106 heimbach 1.16 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 heimbach 1.12
114     C-- Old aLower
115 heimbach 1.14 DO j=jMin,jMax
116     DO i=iMin,iMax
117 heimbach 1.12 a(i,j,1) = 0. _d 0
118     ENDDO
119     ENDDO
120     DO k=2,Nr
121 heimbach 1.14 DO j=jMin,jMax
122     DO i=iMin,iMax
123 jmc 1.23 a(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
124 jmc 1.26 & *recip_deepFac2C(k)*recip_rhoFacC(k)
125 heimbach 1.12 & *KappaRX(i,j, k )*recip_drC( k )
126 jmc 1.26 & *deepFac2F(k)*rhoFacF(k)
127 mlosch 1.18 IF (recip_hFac(i,j,k-1,bi,bj).EQ.0.) a(i,j,k)=0.
128 heimbach 1.12 ENDDO
129     ENDDO
130     ENDDO
131    
132     C-- Old aUpper
133     DO k=1,Nr-1
134 heimbach 1.14 DO j=jMin,jMax
135     DO i=iMin,iMax
136 jmc 1.23 c(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
137 jmc 1.26 & *recip_deepFac2C(k)*recip_rhoFacC(k)
138 heimbach 1.12 & *KappaRX(i,j,k+1)*recip_drC(k+1)
139 jmc 1.26 & *deepFac2F(k+1)*rhoFacF(k+1)
140 adcroft 1.13 IF (recip_hFac(i,j,k+1,bi,bj).EQ.0.) c(i,j,k)=0.
141 heimbach 1.12 ENDDO
142     ENDDO
143     ENDDO
144 heimbach 1.14 DO j=jMin,jMax
145     DO i=iMin,iMax
146 heimbach 1.12 c(i,j,Nr) = 0. _d 0
147     ENDDO
148     ENDDO
149    
150     C-- Old aCenter
151     DO k=1,Nr
152 heimbach 1.14 DO j=jMin,jMax
153     DO i=iMin,iMax
154 heimbach 1.12 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 heimbach 1.14 DO j=jMin,jMax
162     DO i=iMin,iMax
163 jmc 1.22 bet(i,j,k) = 1. _d 0
164 heimbach 1.12 gam(i,j,k) = 0. _d 0
165     ENDDO
166     ENDDO
167     ENDDO
168    
169 heimbach 1.10 C-- Only need do anything if Nr>1
170     IF (Nr.GT.1) THEN
171    
172 heimbach 1.12 k = 1
173 cnh 1.5 C-- Beginning of forward sweep (top level)
174 adcroft 1.1 DO j=jMin,jMax
175     DO i=iMin,iMax
176 heimbach 1.12 IF (b(i,j,1).NE.0.) bet(i,j,1) = 1. _d 0 / b(i,j,1)
177 adcroft 1.1 ENDDO
178     ENDDO
179 heimbach 1.10
180 adcroft 1.1 ENDIF
181 heimbach 1.9
182 cnh 1.5 C-- Middle of forward sweep
183 jmc 1.20 IF (Nr.GE.2) THEN
184 heimbach 1.10
185 heimbach 1.12 CADJ loop = sequential
186     DO k=2,Nr
187 heimbach 1.9
188 adcroft 1.1 DO j=jMin,jMax
189     DO i=iMin,iMax
190 heimbach 1.12 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 adcroft 1.1 ENDDO
194     ENDDO
195 heimbach 1.9
196 adcroft 1.1 ENDDO
197 heimbach 1.10
198 adcroft 1.1 ENDIF
199 heimbach 1.10
200 heimbach 1.11
201 heimbach 1.12 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 heimbach 1.10 ENDDO
205 heimbach 1.12 ENDDO
206     DO k=2,Nr
207 heimbach 1.10 DO j=jMin,jMax
208     DO i=iMin,iMax
209 heimbach 1.12 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 heimbach 1.9 ENDDO
212     ENDDO
213 heimbach 1.12 ENDDO
214 heimbach 1.9
215    
216 heimbach 1.12 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 adcroft 1.1 ENDDO
225     ENDDO
226 heimbach 1.9
227 heimbach 1.12 DO k=1,Nr
228 adcroft 1.1 DO j=jMin,jMax
229     DO i=iMin,iMax
230 heimbach 1.12 gXnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
231 adcroft 1.1 ENDDO
232     ENDDO
233     ENDDO
234    
235 jmc 1.23 #ifdef ALLOW_DIAGNOSTICS
236 jmc 1.25 IF ( useDiagnostics .AND.tracerId.NE.0 ) THEN
237     IF ( tracerId.GE. 1 ) THEN
238 jmc 1.23 C-- Set diagnostic suffix for the current tracer
239     #ifdef ALLOW_GENERIC_ADVDIFF
240 jmc 1.25 diagSufx = GAD_DIAG_SUFX( tracerId, myThid )
241 jmc 1.23 #else
242 jmc 1.25 diagSufx = 'aaaa'
243 jmc 1.23 #endif
244 jmc 1.25 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 jmc 1.23 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 jmc 1.25 ELSEIF ( tracerId.GE.1 ) THEN
263 jmc 1.23 DO j=1,sNy
264     DO i=1,sNx
265     df(i,j) =
266 jmc 1.26 & -rA(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
267 jmc 1.25 & * 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 jmc 1.26 & -rAw(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
276 jmc 1.25 & * 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 jmc 1.26 & -rAs(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
287 jmc 1.23 & * KappaRX(i,j,k)*recip_drC(k)
288 jmc 1.25 & * (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 jmc 1.23 ENDDO
292     ENDDO
293     ENDIF
294 jmc 1.24 CALL DIAGNOSTICS_FILL(df,diagName, k,1, 2,bi,bj, myThid)
295 jmc 1.23 ENDDO
296     ENDIF
297     ENDIF
298     #endif /* ALLOW_DIAGNOSTICS */
299    
300 adcroft 1.1 RETURN
301     END

  ViewVC Help
Powered by ViewVC 1.1.22