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

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

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


Revision 1.4 - (hide annotations) (download)
Mon Mar 29 03:33:51 2004 UTC (20 years, 1 month ago) by edhill
Branch: MAIN
CVS Tags: checkpoint52n_post, checkpoint53d_post, checkpoint54a_pre, checkpoint55c_post, checkpoint54e_post, checkpoint54a_post, checkpoint53c_post, checkpoint55d_pre, checkpoint55j_post, checkpoint55h_post, checkpoint53b_post, checkpoint54b_post, checkpoint53b_pre, checkpoint55b_post, checkpoint54d_post, checkpoint52m_post, checkpoint55, checkpoint53a_post, checkpoint54, checkpoint54f_post, checkpoint55g_post, checkpoint55f_post, checkpoint55i_post, checkpoint53, checkpoint53g_post, checkpoint55e_post, checkpoint53f_post, checkpoint55a_post, checkpoint53d_pre, checkpoint54c_post, checkpoint55d_post
Changes since 1.3: +30 -36 lines
 o new "poster children" for the API reference:
   - generic_advdiff
   - mnc

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

  ViewVC Help
Powered by ViewVC 1.1.22