/[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.1 - (show annotations) (download)
Sat Jan 3 00:43:01 2004 UTC (20 years, 5 months ago) by jmc
Branch: MAIN
new S/R to solve vertical direction implicitly.

1 C $Header: $
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 rFlx
57 CEOP
58
59 IF (Nr.LE.1) RETURN
60
61 C-- Initialise
62 iMin = 1
63 jMin = 1
64 iMax = sNx
65 jMax = sNy
66 DO k=1,Nr
67 DO j=1-Oly,sNy+Oly
68 DO i=1-Olx,sNx+Olx
69 a5d(i,j,k) = 0. _d 0
70 b5d(i,j,k) = 0. _d 0
71 c5d(i,j,k) = 1. _d 0
72 d5d(i,j,k) = 0. _d 0
73 e5d(i,j,k) = 0. _d 0
74 ENDDO
75 ENDDO
76 ENDDO
77 diagonalNumber = 1
78
79 IF (implicitDiffusion) THEN
80 C-- set the tri-diagonal matrix to solve the implicit diffusion problem
81 diagonalNumber = 3
82 C- 1rst lower diagonal :
83 DO k=2,Nr
84 DO j=jMin,jMax
85 DO i=iMin,iMax
86 IF (maskC(i,j,k-1,bi,bj).EQ.1.)
87 & b5d(i,j,k) = -deltaTtracer
88 & *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
89 & *kappaRX(i,j, k )*recip_drC( k )
90 ENDDO
91 ENDDO
92 ENDDO
93 C- 1rst upper diagonal :
94 DO k=1,Nr-1
95 DO j=jMin,jMax
96 DO i=iMin,iMax
97 IF (maskC(i,j,k+1,bi,bj).EQ.1.)
98 & d5d(i,j,k) = -deltaTtracer
99 & *recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
100 & *KappaRX(i,j,k+1)*recip_drC(k+1)
101 ENDDO
102 ENDDO
103 ENDDO
104 C- Main diagonal :
105 DO k=1,Nr
106 DO j=jMin,jMax
107 DO i=iMin,iMax
108 c5d(i,j,k) = 1. _d 0 - b5d(i,j,k) - d5d(i,j,k)
109 ENDDO
110 ENDDO
111 ENDDO
112
113 C-- end if implicitDiffusion
114 ENDIF
115
116 IF (implicitAdvection) THEN
117
118 IF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
119 diagonalNumber = 3
120 C note: a) this should go into a separated gad_ S/R
121 DO k=2,Nr
122
123 DO j=1-Oly,sNy+Oly
124 DO i=1-Olx,sNx+Olx
125 rTrans(i,j) = wVel(i,j,k,bi,bj)*rA(i,j,bi,bj)
126 & *maskC(i,j,k-1,bi,bj)
127 ENDDO
128 ENDDO
129 #ifdef ALLOW_GMREDI
130 C-- Residual transp = Bolus transp + Eulerian transp
131 IF (useGMRedi)
132 & CALL GMREDI_CALC_WFLOW(
133 & rTrans, bi, bj, k, myThid)
134 #endif /* ALLOW_GMREDI */
135
136 C- space Centered advection scheme, Flux form:
137 DO j=jMin,jMax
138 DO i=iMin,iMax
139 rFlx = 0.5 _d 0 *deltaTtracer*rTrans(i,j)
140 & *recip_rA(i,j,bi,bj)*rkFac
141 b5d(i,j,k) = b5d(i,j,k)
142 & + rFlx*recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
143 c5d(i,j,k) = c5d(i,j,k)
144 & + rFlx*recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
145 c5d(i,j,k-1) = c5d(i,j,k-1)
146 & - rFlx*recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
147 d5d(i,j,k-1) = d5d(i,j,k-1)
148 & - rFlx*recip_hFacC(i,j,k-1,bi,bj)*recip_drF(k-1)
149 ENDDO
150 ENDDO
151
152 C-- end k loop
153 ENDDO
154 ELSE
155 STOP 'GAD_IMPLICIT_R: Adv.Scheme in Impl form not yet coded'
156 ENDIF
157
158 C-- end if implicitAdvection
159 ENDIF
160
161 IF ( diagonalNumber .EQ. 3 ) THEN
162 C-- Solve tri-diagonal system :
163 CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
164 I b5d, c5d, d5d,
165 U gTracer,
166 O errCode,
167 I bi, bj, myThid )
168 IF (errCode.GE.1) THEN
169 STOP 'GAD_IMPLICIT_R: error when solving 3-Diag problem'
170 ENDIF
171 ELSEIF ( diagonalNumber .NE. 1 ) THEN
172 STOP 'GAD_IMPLICIT_R: no solver available'
173 ENDIF
174
175 RETURN
176 END

  ViewVC Help
Powered by ViewVC 1.1.22