/[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.23 - (show annotations) (download)
Thu Dec 16 23:20:06 2004 UTC (19 years, 5 months ago) by jmc
Branch: MAIN
Changes since 1.22: +67 -5 lines
change argument list of S/R impldiff.F: tracerIdentity replace deltaT
 - allow to implement deltaT function of level k
 - make diagnostics easier

1 C $Header: /u/gcmpack/MITgcm/model/src/impldiff.F,v 1.22 2004/10/22 20:14:46 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_AUTODIFF_TAMC
35 #include "tamc_keys.h"
36 #endif
37
38 C !INPUT/OUTPUT PARAMETERS:
39 C == Routine Arguments ==
40 C tracerId :: tracer Identificator (if > 0) ;
41 C = 0 or < 0 when solving vertical viscosity implicitly for U or V
42 INTEGER bi,bj,iMin,iMax,jMin,jMax
43 INTEGER tracerId
44 _RL KappaRX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
45 _RS recip_hFac(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
46 _RL gXnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
47 INTEGER myThid
48
49 C !LOCAL VARIABLES:
50 C == Local variables ==
51 INTEGER i,j,k
52 _RL deltaTX(Nr)
53 _RL gYnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
54 _RL a(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
55 _RL b(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
56 _RL c(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
57 _RL bet(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
58 _RL gam(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
59 #ifdef ALLOW_DIAGNOSTICS
60 INTEGER kk
61 CHARACTER*8 diagName
62 CHARACTER*4 diagSufx
63 #ifdef ALLOW_GENERIC_ADVDIFF
64 CHARACTER*4 GAD_DIAG_SUFX
65 EXTERNAL GAD_DIAG_SUFX
66 #endif
67 LOGICAL DIAGNOSTICS_IS_ON
68 EXTERNAL DIAGNOSTICS_IS_ON
69 _RL df (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
70 #endif /* ALLOW_DIAGNOSTICS */
71 CEOP
72
73 cph(
74 cph Not good for TAF: may create irreducible control flow graph
75 cph IF (Nr.LE.1) RETURN
76 cph)
77
78 IF ( tracerId.GE.1 ) THEN
79 DO k=1,Nr
80 deltaTX(k) = dTtracerLev(k)
81 ENDDO
82 ELSE
83 DO k=1,Nr
84 deltaTX(k) = deltaTmom
85 ENDDO
86 ENDIF
87
88 C-- Initialise
89 DO k=1,Nr
90 DO j=jMin,jMax
91 DO i=iMin,iMax
92 gYNm1(i,j,k,bi,bj) = 0. _d 0
93 ENDDO
94 ENDDO
95 ENDDO
96
97 C-- Old aLower
98 DO j=jMin,jMax
99 DO i=iMin,iMax
100 a(i,j,1) = 0. _d 0
101 ENDDO
102 ENDDO
103 DO k=2,Nr
104 DO j=jMin,jMax
105 DO i=iMin,iMax
106 a(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
107 & *KappaRX(i,j, k )*recip_drC( k )
108 IF (recip_hFac(i,j,k-1,bi,bj).EQ.0.) a(i,j,k)=0.
109 ENDDO
110 ENDDO
111 ENDDO
112
113 C-- Old aUpper
114 DO k=1,Nr-1
115 DO j=jMin,jMax
116 DO i=iMin,iMax
117 c(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
118 & *KappaRX(i,j,k+1)*recip_drC(k+1)
119 IF (recip_hFac(i,j,k+1,bi,bj).EQ.0.) c(i,j,k)=0.
120 ENDDO
121 ENDDO
122 ENDDO
123 DO j=jMin,jMax
124 DO i=iMin,iMax
125 c(i,j,Nr) = 0. _d 0
126 ENDDO
127 ENDDO
128
129 C-- Old aCenter
130 DO k=1,Nr
131 DO j=jMin,jMax
132 DO i=iMin,iMax
133 b(i,j,k) = 1. _d 0 - c(i,j,k) - a(i,j,k)
134 ENDDO
135 ENDDO
136 ENDDO
137
138 C-- Old and new gam, bet are the same
139 DO k=1,Nr
140 DO j=jMin,jMax
141 DO i=iMin,iMax
142 bet(i,j,k) = 1. _d 0
143 gam(i,j,k) = 0. _d 0
144 ENDDO
145 ENDDO
146 ENDDO
147
148 C-- Only need do anything if Nr>1
149 IF (Nr.GT.1) THEN
150
151 k = 1
152 C-- Beginning of forward sweep (top level)
153 DO j=jMin,jMax
154 DO i=iMin,iMax
155 IF (b(i,j,1).NE.0.) bet(i,j,1) = 1. _d 0 / b(i,j,1)
156 ENDDO
157 ENDDO
158
159 ENDIF
160
161 C-- Middle of forward sweep
162 IF (Nr.GE.2) THEN
163
164 CADJ loop = sequential
165 DO k=2,Nr
166
167 DO j=jMin,jMax
168 DO i=iMin,iMax
169 gam(i,j,k) = c(i,j,k-1)*bet(i,j,k-1)
170 IF ( ( b(i,j,k) - a(i,j,k)*gam(i,j,k) ) .NE. 0.)
171 & bet(i,j,k) = 1. _d 0 / ( b(i,j,k) - a(i,j,k)*gam(i,j,k) )
172 ENDDO
173 ENDDO
174
175 ENDDO
176
177 ENDIF
178
179
180 DO j=jMin,jMax
181 DO i=iMin,iMax
182 gYNm1(i,j,1,bi,bj) = gXNm1(i,j,1,bi,bj)*bet(i,j,1)
183 ENDDO
184 ENDDO
185 DO k=2,Nr
186 DO j=jMin,jMax
187 DO i=iMin,iMax
188 gYnm1(i,j,k,bi,bj) = bet(i,j,k)*
189 & (gXnm1(i,j,k,bi,bj) - a(i,j,k)*gYnm1(i,j,k-1,bi,bj))
190 ENDDO
191 ENDDO
192 ENDDO
193
194
195 C-- Backward sweep
196 CADJ loop = sequential
197 DO k=Nr-1,1,-1
198 DO j=jMin,jMax
199 DO i=iMin,iMax
200 gYnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
201 & -gam(i,j,k+1)*gYnm1(i,j,k+1,bi,bj)
202 ENDDO
203 ENDDO
204 ENDDO
205
206 DO k=1,Nr
207 DO j=jMin,jMax
208 DO i=iMin,iMax
209 gXnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
210 ENDDO
211 ENDDO
212 ENDDO
213
214 #ifdef ALLOW_DIAGNOSTICS
215 IF ( useDiagnostics .AND.tracerId.GE.1 ) THEN
216 C-- Set diagnostic suffix for the current tracer
217 #ifdef ALLOW_GENERIC_ADVDIFF
218 diagSufx = GAD_DIAG_SUFX( tracerId, myThid )
219 #else
220 diagSufx = 'aaaa'
221 #endif
222 diagName = 'DFrI'//diagSufx
223 IF ( DIAGNOSTICS_IS_ON(diagName,myThid) ) THEN
224 DO k= 1,Nr
225 IF ( k.EQ.1 ) THEN
226 C- Note: Needs to call DIAGNOSTICS_FILL at level k=1 even if array == 0
227 C otherwise counter is not incremented !!
228 DO j=1-OLy,sNy+OLy
229 DO i=1-OLx,sNx+OLx
230 df(i,j) = 0. _d 0
231 ENDDO
232 ENDDO
233 ELSE
234 DO j=1,sNy
235 DO i=1,sNx
236 df(i,j) =
237 & rA(i,j,bi,bj)
238 & * KappaRX(i,j,k)*recip_drC(k)
239 & * (gXnm1(i,j,k,bi,bj) - gXnm1(i,j,k-1,bi,bj))
240 ENDDO
241 ENDDO
242 ENDIF
243 kk = -k
244 CALL DIAGNOSTICS_FILL(df,diagName, kk,1, 2,bi,bj, myThid)
245 ENDDO
246 ENDIF
247 ENDIF
248 #endif /* ALLOW_DIAGNOSTICS */
249
250 RETURN
251 END

  ViewVC Help
Powered by ViewVC 1.1.22