/[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.3 - (hide 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 jmc 1.3 C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_implicit_r.F,v 1.2 2004/01/07 21:35:00 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     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 jmc 1.3 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 jmc 1.1 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 jmc 1.3 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 jmc 1.1 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 jmc 1.2 _RL rTransKp1(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
80     _RL localTijk(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
81 jmc 1.1 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 jmc 1.2 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 jmc 1.1 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 jmc 1.2 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 jmc 1.1
181 jmc 1.2 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 jmc 1.1 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 jmc 1.2 ENDDO
194 jmc 1.1 #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 jmc 1.2 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 jmc 1.1
213 jmc 1.2 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 jmc 1.1
238 jmc 1.2 C-- end k loop
239     ENDDO
240 jmc 1.1
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 jmc 1.2 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 jmc 1.1 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