/[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.1 - (hide 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 jmc 1.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