/[MITgcm]/MITgcm/pkg/generic_advdiff/gad_implicit_r.F
ViewVC logotype

Contents of /MITgcm/pkg/generic_advdiff/gad_implicit_r.F

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


Revision 1.3 - (show annotations) (download)
Thu Jan 8 16:13:23 2004 UTC (20 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint52l_pre, hrcube4, checkpoint52j_post, hrcube_1, checkpoint52l_post, checkpoint52k_post, checkpoint52f_post, hrcube5, checkpoint52i_post, checkpoint52j_pre, checkpoint52i_pre, checkpoint52h_pre, checkpoint52f_pre, hrcube_2, hrcube_3
Changes since 1.2: +24 -3 lines
add description of arguments.

1 C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_implicit_r.F,v 1.2 2004/01/07 21:35:00 jmc Exp $
2 C $Name: $
3
4 #include "GAD_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: GAD_IMPLICIT_R
8 C !INTERFACE:
9 SUBROUTINE GAD_IMPLICIT_R(
10 I implicitAdvection, advectionScheme, tracerIdentity,
11 I kappaRX, wVel, tracer,
12 U gTracer,
13 I bi, bj, myTime, myIter, myThid )
14 C !DESCRIPTION: \bv
15 C *==========================================================*
16 C | S/R GAD_IMPLICIT_R
17 C | o Solve implicitly vertical advection & diffusion
18 C | for one tracer
19 C *==========================================================*
20 C *==========================================================*
21 C \ev
22
23 C !USES:
24 IMPLICIT NONE
25 C == Global data ==
26 #include "SIZE.h"
27 #include "EEPARAMS.h"
28 #include "PARAMS.h"
29 #include "GRID.h"
30 #include "GAD.h"
31
32 C !INPUT/OUTPUT PARAMETERS:
33 C == Routine Arguments ==
34 C implicitAdvection :: if True, treat vertical advection implicitly
35 C advectionScheme :: advection scheme to use
36 C tracerIdentity :: Identifier for the tracer
37 C kappaRX :: 3-D array for vertical diffusion coefficient
38 C wVel :: vertical component of the velcity field
39 C tracer :: tracer field at current time step
40 C gTracer :: future tracer field
41 C bi,bj :: tile indices
42 C myTime :: current time
43 C myIter :: current iteration number
44 C myThid :: thread number
45 LOGICAL implicitAdvection
46 INTEGER advectionScheme
47 INTEGER tracerIdentity
48 _RL kappaRX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
49 _RL wVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
50 _RL tracer (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
51 _RL gTracer(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
52 INTEGER bi, bj
53 _RL myTime
54 INTEGER myIter, myThid
55
56 C !LOCAL VARIABLES:
57 C == Local variables ==
58 C iMin,iMax,jMin,jMax :: computational domain
59 C i,j,k :: loop indices
60 C a5d :: 2nd lower diagonal of the pentadiagonal matrix
61 C b5d :: 1rst lower diagonal of the pentadiagonal matrix
62 C c5d :: main diagonal of the pentadiagonal matrix
63 C d5d :: 1rst upper diagonal of the pentadiagonal matrix
64 C e5d :: 2nd upper diagonal of the pentadiagonal matrix
65 C rTrans :: vertical volume transport at inteface k
66 C rTransKp1 :: vertical volume transport at inteface k+1
67 C localTijk :: local copy of the tracer field (for Non-Lin Adv.Scheme)
68 C diagonalNumber :: number of non-zero diagonals in the matrix
69 C errCode :: > 0 if singular matrix
70 INTEGER iMin,iMax,jMin,jMax
71 INTEGER i,j,k
72 INTEGER diagonalNumber, errCode
73 _RL a5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
74 _RL b5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
75 _RL c5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
76 _RL d5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
77 _RL e5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
78 _RL rTrans(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
79 _RL rTransKp1(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
80 _RL localTijk(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
81 CEOP
82
83 IF (Nr.LE.1) RETURN
84
85 C-- Initialise
86 iMin = 1
87 jMin = 1
88 iMax = sNx
89 jMax = sNy
90 DO k=1,Nr
91 DO j=1-Oly,sNy+Oly
92 DO i=1-Olx,sNx+Olx
93 a5d(i,j,k) = 0. _d 0
94 b5d(i,j,k) = 0. _d 0
95 c5d(i,j,k) = 1. _d 0
96 d5d(i,j,k) = 0. _d 0
97 e5d(i,j,k) = 0. _d 0
98 ENDDO
99 ENDDO
100 ENDDO
101 diagonalNumber = 1
102
103 C-- Non-Linear Advection scheme: keep a local copy of tracer field
104 IF ( advectionScheme.EQ.ENUM_FLUX_LIMIT .OR.
105 & advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
106 IF ( multiDimAdvection ) THEN
107 DO k=1,Nr
108 DO j=1-Oly,sNy+Oly
109 DO i=1-Olx,sNx+Olx
110 localTijk(i,j,k) = gTracer(i,j,k,bi,bj)
111 ENDDO
112 ENDDO
113 ENDDO
114 ELSE
115 DO k=1,Nr
116 DO j=1-Oly,sNy+Oly
117 DO i=1-Olx,sNx+Olx
118 localTijk(i,j,k) = tracer(i,j,k,bi,bj)
119 ENDDO
120 ENDDO
121 ENDDO
122 ENDIF
123 ENDIF
124
125 IF (implicitDiffusion) THEN
126 C-- set the tri-diagonal matrix to solve the implicit diffusion problem
127 diagonalNumber = 3
128 C- 1rst lower diagonal :
129 DO k=2,Nr
130 DO j=jMin,jMax
131 DO i=iMin,iMax
132 IF (maskC(i,j,k-1,bi,bj).EQ.1.)
133 & b5d(i,j,k) = -deltaTtracer
134 & *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
135 & *kappaRX(i,j, k )*recip_drC( k )
136 ENDDO
137 ENDDO
138 ENDDO
139 C- 1rst upper diagonal :
140 DO k=1,Nr-1
141 DO j=jMin,jMax
142 DO i=iMin,iMax
143 IF (maskC(i,j,k+1,bi,bj).EQ.1.)
144 & d5d(i,j,k) = -deltaTtracer
145 & *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
146 & *KappaRX(i,j,k+1)*recip_drC(k+1)
147 ENDDO
148 ENDDO
149 ENDDO
150 C- Main diagonal :
151 DO k=1,Nr
152 DO j=jMin,jMax
153 DO i=iMin,iMax
154 c5d(i,j,k) = 1. _d 0 - b5d(i,j,k) - d5d(i,j,k)
155 ENDDO
156 ENDDO
157 ENDDO
158
159 C-- end if implicitDiffusion
160 ENDIF
161
162 IF (implicitAdvection) THEN
163
164 DO k=Nr,1,-1
165
166 C-- Compute transport
167 IF (k.EQ.Nr) THEN
168 DO j=1-Oly,sNy+Oly
169 DO i=1-Olx,sNx+Olx
170 rTransKp1(i,j) = 0.
171 ENDDO
172 ENDDO
173 ELSE
174 DO j=1-Oly,sNy+Oly
175 DO i=1-Olx,sNx+Olx
176 rTransKp1(i,j) = rTrans(i,j)
177 ENDDO
178 ENDDO
179 ENDIF
180
181 IF (k.EQ.1) THEN
182 DO j=1-Oly,sNy+Oly
183 DO i=1-Olx,sNx+Olx
184 rTrans(i,j) = 0.
185 ENDDO
186 ENDDO
187 ELSE
188 DO j=1-Oly,sNy+Oly
189 DO i=1-Olx,sNx+Olx
190 rTrans(i,j) = wVel(i,j,k,bi,bj)*rA(i,j,bi,bj)
191 & *maskC(i,j,k-1,bi,bj)
192 ENDDO
193 ENDDO
194 #ifdef ALLOW_GMREDI
195 C-- Residual transp = Bolus transp + Eulerian transp
196 IF (useGMRedi)
197 & CALL GMREDI_CALC_WFLOW(
198 & rTrans, bi, bj, k, myThid)
199 #endif /* ALLOW_GMREDI */
200 ENDIF
201 DO j=jMin,jMax
202 DO i=iMin,iMax
203 c localTijk(i,j,k) = gTracer(i,j,k,bi,bj)
204 gTracer(i,j,k,bi,bj) = gTracer(i,j,k,bi,bj)
205 & + deltaTtracer*recip_rA(i,j,bi,bj)
206 & *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
207 & *tracer(i,j,k,bi,bj)*(rTrans(i,j)-rTransKp1(i,j))*rkFac
208 ENDDO
209 ENDDO
210
211 IF (K.GE.2) THEN
212
213 IF ( advectionScheme.EQ.ENUM_CENTERED_2ND ) THEN
214 diagonalNumber = 3
215 CALL GAD_C2_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
216 I deltaTtracer, rTrans,
217 U b5d, c5d, d5d,
218 I myThid)
219 ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
220 diagonalNumber = 3
221 CALL GAD_FLUXLIMIT_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
222 I deltaTtracer, rTrans, localTijk,
223 U b5d, c5d, d5d,
224 I myThid)
225 ELSEIF (advectionScheme.EQ.ENUM_UPWIND_3RD .OR.
226 & advectionScheme.EQ.ENUM_CENTERED_4TH) THEN
227 diagonalNumber = 5
228 CALL GAD_U3C4_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
229 I advectionScheme, deltaTtracer, rTrans,
230 U a5d, b5d, c5d, d5d, e5d,
231 I myThid)
232 ELSE
233 STOP 'GAD_IMPLICIT_R: Adv.Scheme in Impl form not yet coded'
234 ENDIF
235
236 ENDIF
237
238 C-- end k loop
239 ENDDO
240
241 C-- end if implicitAdvection
242 ENDIF
243
244 IF ( diagonalNumber .EQ. 3 ) THEN
245 C-- Solve tri-diagonal system :
246 CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
247 I b5d, c5d, d5d,
248 U gTracer,
249 O errCode,
250 I bi, bj, myThid )
251 IF (errCode.GE.1) THEN
252 STOP 'GAD_IMPLICIT_R: error when solving 3-Diag problem'
253 ENDIF
254 ELSEIF ( diagonalNumber .EQ. 5 ) THEN
255 C-- Solve penta-diagonal system :
256 CALL SOLVE_PENTADIAGONAL( iMin,iMax, jMin,jMax,
257 I a5d, b5d, c5d, d5d, e5d,
258 U gTracer,
259 O errCode,
260 I bi, bj, myThid )
261 IF (errCode.GE.1) THEN
262 STOP 'GAD_IMPLICIT_R: error when solving 5-Diag problem'
263 ENDIF
264 ELSEIF ( diagonalNumber .NE. 1 ) THEN
265 STOP 'GAD_IMPLICIT_R: no solver available'
266 ENDIF
267
268 RETURN
269 END

  ViewVC Help
Powered by ViewVC 1.1.22