/[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.2 - (show annotations) (download)
Wed Jan 7 21:35:00 2004 UTC (20 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint52e_post
Changes since 1.1: +100 -28 lines
rewrite (as in MultiDimAdvec) explicit tracer stepping (gad_calc_rhs.F)
 to work with implicit vertical advection and AB.

1 C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_implicit_r.F,v 1.1 2004/01/03 00:43:01 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 LOGICAL implicitAdvection
35 INTEGER advectionScheme
36 INTEGER tracerIdentity
37 _RL kappaRX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
38 _RL wVel (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
39 _RL tracer (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
40 _RL gTracer(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
41 INTEGER bi, bj
42 _RL myTime
43 INTEGER myIter, myThid
44
45 C !LOCAL VARIABLES:
46 C == Local variables ==
47 INTEGER iMin,iMax,jMin,jMax
48 INTEGER i,j,k
49 INTEGER diagonalNumber, errCode
50 _RL a5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
51 _RL b5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
52 _RL c5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
53 _RL d5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
54 _RL e5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
55 _RL rTrans(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
56 _RL rTransKp1(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
57 _RL localTijk(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
58 _RL limitDf (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
59 _RL rFlx
60 CEOP
61
62 IF (Nr.LE.1) RETURN
63
64 C-- Initialise
65 iMin = 1
66 jMin = 1
67 iMax = sNx
68 jMax = sNy
69 DO k=1,Nr
70 DO j=1-Oly,sNy+Oly
71 DO i=1-Olx,sNx+Olx
72 a5d(i,j,k) = 0. _d 0
73 b5d(i,j,k) = 0. _d 0
74 c5d(i,j,k) = 1. _d 0
75 d5d(i,j,k) = 0. _d 0
76 e5d(i,j,k) = 0. _d 0
77 ENDDO
78 ENDDO
79 ENDDO
80 diagonalNumber = 1
81
82 C-- Non-Linear Advection scheme: keep a local copy of tracer field
83 IF ( advectionScheme.EQ.ENUM_FLUX_LIMIT .OR.
84 & advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
85 IF ( multiDimAdvection ) THEN
86 DO k=1,Nr
87 DO j=1-Oly,sNy+Oly
88 DO i=1-Olx,sNx+Olx
89 localTijk(i,j,k) = gTracer(i,j,k,bi,bj)
90 ENDDO
91 ENDDO
92 ENDDO
93 ELSE
94 DO k=1,Nr
95 DO j=1-Oly,sNy+Oly
96 DO i=1-Olx,sNx+Olx
97 localTijk(i,j,k) = tracer(i,j,k,bi,bj)
98 ENDDO
99 ENDDO
100 ENDDO
101 ENDIF
102 ENDIF
103
104 IF (implicitDiffusion) THEN
105 C-- set the tri-diagonal matrix to solve the implicit diffusion problem
106 diagonalNumber = 3
107 C- 1rst lower diagonal :
108 DO k=2,Nr
109 DO j=jMin,jMax
110 DO i=iMin,iMax
111 IF (maskC(i,j,k-1,bi,bj).EQ.1.)
112 & b5d(i,j,k) = -deltaTtracer
113 & *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
114 & *kappaRX(i,j, k )*recip_drC( k )
115 ENDDO
116 ENDDO
117 ENDDO
118 C- 1rst upper diagonal :
119 DO k=1,Nr-1
120 DO j=jMin,jMax
121 DO i=iMin,iMax
122 IF (maskC(i,j,k+1,bi,bj).EQ.1.)
123 & d5d(i,j,k) = -deltaTtracer
124 & *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
125 & *KappaRX(i,j,k+1)*recip_drC(k+1)
126 ENDDO
127 ENDDO
128 ENDDO
129 C- Main diagonal :
130 DO k=1,Nr
131 DO j=jMin,jMax
132 DO i=iMin,iMax
133 c5d(i,j,k) = 1. _d 0 - b5d(i,j,k) - d5d(i,j,k)
134 ENDDO
135 ENDDO
136 ENDDO
137
138 C-- end if implicitDiffusion
139 ENDIF
140
141 IF (implicitAdvection) THEN
142
143 DO k=Nr,1,-1
144
145 C-- Compute transport
146 IF (k.EQ.Nr) THEN
147 DO j=1-Oly,sNy+Oly
148 DO i=1-Olx,sNx+Olx
149 rTransKp1(i,j) = 0.
150 ENDDO
151 ENDDO
152 ELSE
153 DO j=1-Oly,sNy+Oly
154 DO i=1-Olx,sNx+Olx
155 rTransKp1(i,j) = rTrans(i,j)
156 ENDDO
157 ENDDO
158 ENDIF
159
160 IF (k.EQ.1) THEN
161 DO j=1-Oly,sNy+Oly
162 DO i=1-Olx,sNx+Olx
163 rTrans(i,j) = 0.
164 ENDDO
165 ENDDO
166 ELSE
167 DO j=1-Oly,sNy+Oly
168 DO i=1-Olx,sNx+Olx
169 rTrans(i,j) = wVel(i,j,k,bi,bj)*rA(i,j,bi,bj)
170 & *maskC(i,j,k-1,bi,bj)
171 ENDDO
172 ENDDO
173 #ifdef ALLOW_GMREDI
174 C-- Residual transp = Bolus transp + Eulerian transp
175 IF (useGMRedi)
176 & CALL GMREDI_CALC_WFLOW(
177 & rTrans, bi, bj, k, myThid)
178 #endif /* ALLOW_GMREDI */
179 ENDIF
180 DO j=jMin,jMax
181 DO i=iMin,iMax
182 c localTijk(i,j,k) = gTracer(i,j,k,bi,bj)
183 gTracer(i,j,k,bi,bj) = gTracer(i,j,k,bi,bj)
184 & + deltaTtracer*recip_rA(i,j,bi,bj)
185 & *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
186 & *tracer(i,j,k,bi,bj)*(rTrans(i,j)-rTransKp1(i,j))*rkFac
187 ENDDO
188 ENDDO
189
190 IF (K.GE.2) THEN
191
192 IF ( advectionScheme.EQ.ENUM_CENTERED_2ND ) THEN
193 diagonalNumber = 3
194 CALL GAD_C2_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
195 I deltaTtracer, rTrans,
196 U b5d, c5d, d5d,
197 I myThid)
198 ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
199 diagonalNumber = 3
200 CALL GAD_FLUXLIMIT_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
201 I deltaTtracer, rTrans, localTijk,
202 U b5d, c5d, d5d,
203 I myThid)
204 ELSEIF (advectionScheme.EQ.ENUM_UPWIND_3RD .OR.
205 & advectionScheme.EQ.ENUM_CENTERED_4TH) THEN
206 diagonalNumber = 5
207 CALL GAD_U3C4_IMPL_R( bi,bj,k, iMin,iMax,jMin,jMax,
208 I advectionScheme, deltaTtracer, rTrans,
209 U a5d, b5d, c5d, d5d, e5d,
210 I myThid)
211 ELSE
212 STOP 'GAD_IMPLICIT_R: Adv.Scheme in Impl form not yet coded'
213 ENDIF
214
215 ENDIF
216
217 C-- end k loop
218 ENDDO
219
220 C-- end if implicitAdvection
221 ENDIF
222
223 IF ( diagonalNumber .EQ. 3 ) THEN
224 C-- Solve tri-diagonal system :
225 CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
226 I b5d, c5d, d5d,
227 U gTracer,
228 O errCode,
229 I bi, bj, myThid )
230 IF (errCode.GE.1) THEN
231 STOP 'GAD_IMPLICIT_R: error when solving 3-Diag problem'
232 ENDIF
233 ELSEIF ( diagonalNumber .EQ. 5 ) THEN
234 C-- Solve penta-diagonal system :
235 CALL SOLVE_PENTADIAGONAL( iMin,iMax, jMin,jMax,
236 I a5d, b5d, c5d, d5d, e5d,
237 U gTracer,
238 O errCode,
239 I bi, bj, myThid )
240 IF (errCode.GE.1) THEN
241 STOP 'GAD_IMPLICIT_R: error when solving 5-Diag problem'
242 ENDIF
243 ELSEIF ( diagonalNumber .NE. 1 ) THEN
244 STOP 'GAD_IMPLICIT_R: no solver available'
245 ENDIF
246
247 RETURN
248 END

  ViewVC Help
Powered by ViewVC 1.1.22