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

Contents of /MITgcm/pkg/generic_advdiff/gad_calc_rhs.F

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


Revision 1.1 - (show annotations) (download)
Wed May 30 19:34:48 2001 UTC (23 years ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint40pre1
Added "gad" package. Needs generalizing to allow selection
of advection schemes at run-time and different schemes for
each tracer.

1 C $Header: $
2 C $Name: $
3
4 #include "GAD_OPTIONS.h"
5
6 SUBROUTINE GAD_CALC_RHS(
7 I bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
8 I xA,yA,uTrans,vTrans,rTrans,maskUp,
9 I diffKh, diffK4, KappaRT, Tracer,
10 I tracerIdentity,
11 U fVerT, gTracer,
12 I myThid )
13 C /==========================================================\
14 C | SUBROUTINE GAD_CALC_RHS |
15 C |==========================================================|
16 C \==========================================================/
17 IMPLICIT NONE
18
19 C == GLobal variables ==
20 #include "SIZE.h"
21 #include "EEPARAMS.h"
22 #include "PARAMS.h"
23 #include "GRID.h"
24 #include "DYNVARS.h"
25 #include "GAD.h"
26
27 C == Routine arguments ==
28 INTEGER k,kUp,kDown,kM1
29 INTEGER bi,bj,iMin,iMax,jMin,jMax
30 _RS xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
31 _RS yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
32 _RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
33 _RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
34 _RL rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
35 _RS maskUp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
36 _RL diffKh, diffK4
37 _RL KappaRT(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
38 _RL Tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
39 INTEGER tracerIdentity
40 _RL fVerT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
41 _RL gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
42 INTEGER myThid
43
44 C == Local variables ==
45 C I, J, K - Loop counters
46 INTEGER i,j
47 LOGICAL TOP_LAYER
48 _RL afFacT, dfFacT
49 _RL df4 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
50 _RL fZon (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
51 _RL fMer (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
52 _RL af (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
53 _RL df (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
54 _RL localT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
55
56 #ifdef ALLOW_AUTODIFF_TAMC
57 C-- only the kUp part of fverT is set in this subroutine
58 C-- the kDown is still required
59 fVerT(1,1,kDown) = fVerT(1,1,kDown)
60 #endif
61 DO j=1-OLy,sNy+OLy
62 DO i=1-OLx,sNx+OLx
63 fZon(i,j) = 0.0
64 fMer(i,j) = 0.0
65 fVerT(i,j,kUp) = 0.0
66 ENDDO
67 ENDDO
68
69 afFacT = 1. _d 0
70 dfFacT = 1. _d 0
71 TOP_LAYER = K .EQ. 1
72
73 C-- Make local copy of tracer array
74 DO j=1-OLy,sNy+OLy
75 DO i=1-OLx,sNx+OLx
76 localT(i,j)=tracer(i,j,k,bi,bj)
77 ENDDO
78 ENDDO
79
80
81 C-- Pre-calculate del^2 T if bi-harmonic coefficient is non-zero
82 IF (diffK4 .NE. 0.) THEN
83 CALL GAD_GRAD_X(bi,bj,k,xA,localT,fZon,myThid)
84 CALL GAD_GRAD_Y(bi,bj,k,yA,localT,fMer,myThid)
85 CALL GAD_DEL2(bi,bj,k,fZon,fMer,df4,myThid)
86 ENDIF
87
88 C-- Initialize net flux in X direction
89 DO j=1-Oly,sNy+Oly
90 DO i=1-Olx,sNx+Olx
91 fZon(i,j) = 0.
92 ENDDO
93 ENDDO
94
95 C- Advective flux in X
96 IF (gad_advection_scheme.EQ.ENUM_CENTERED_2ND) THEN
97 CALL GAD_C2_ADV_X(bi,bj,k,uTrans,localT,af,myThid)
98 ELSEIF (gad_advection_scheme.EQ.ENUM_FLUX_LIMIT) THEN
99 CALL GAD_FLUXLIMIT_ADV_X(
100 & bi,bj,k,deltaTtracer,uTrans,uVel,localT,af,myThid)
101 ELSEIF (gad_advection_scheme.EQ.ENUM_CENTERED_4TH) THEN
102 CALL GAD_C4_ADV_X(bi,bj,k,uTrans,localT,af,myThid)
103 ELSE
104 stop 'CALC_GTRACER: Bad gad_advection_scheme (X)'
105 ENDIF
106 DO j=jMin,jMax
107 DO i=iMin,iMax
108 fZon(i,j) = fZon(i,j) + af(i,j)
109 ENDDO
110 ENDDO
111
112 C- Diffusive flux in X
113 IF (diffKh.NE.0.) THEN
114 CALL GAD_DIFF_X(bi,bj,k,xA,diffKh,localT,df,myThid)
115 ELSE
116 DO j=jMin,jMax
117 DO i=iMin,iMax
118 df(i,j) = 0.
119 ENDDO
120 ENDDO
121 ENDIF
122
123 #ifdef ALLOW_GMREDI
124 C- GM/Redi flux in X
125 IF (useGMRedi) THEN
126 C *note* should update GMREDI_XTRANSPORT to use localT and set df *aja*
127 CALL GMREDI_XTRANSPORT(
128 I iMin,iMax,jMin,jMax,bi,bj,K,
129 I xA,Tracer,
130 U df,
131 I myThid)
132 ENDIF
133 #endif
134 DO j=jMin,jMax
135 DO i=iMin,iMax
136 fZon(i,j) = fZon(i,j) + df(i,j)
137 ENDDO
138 ENDDO
139
140 C- Bi-harmonic duffusive flux in X
141 IF (diffK4 .NE. 0.) THEN
142 CALL GAD_BIHARM_X(bi,bj,k,xA,df4,diffK4,df,myThid)
143 DO j=jMin,jMax
144 DO i=iMin,iMax
145 fZon(i,j) = fZon(i,j) + df(i,j)
146 ENDDO
147 ENDDO
148 ENDIF
149
150 C-- Initialize net flux in Y direction
151 DO j=1-Oly,sNy+Oly
152 DO i=1-Olx,sNx+Olx
153 fMer(i,j) = 0.
154 ENDDO
155 ENDDO
156
157 C- Advective flux in Y
158 IF (gad_advection_scheme.EQ.ENUM_CENTERED_2ND) THEN
159 CALL GAD_C2_ADV_Y(bi,bj,k,vTrans,localT,af,myThid)
160 ELSEIF (gad_advection_scheme.EQ.ENUM_FLUX_LIMIT) THEN
161 CALL GAD_FLUXLIMIT_ADV_Y(
162 & bi,bj,k,deltaTtracer,vTrans,vVel,localT,af,myThid)
163 ELSEIF (gad_advection_scheme.EQ.ENUM_CENTERED_4TH) THEN
164 CALL GAD_C4_ADV_Y(bi,bj,k,vTrans,localT,af,myThid)
165 ELSE
166 stop 'CALC_GTRACER: Bad gad_advection_scheme (Y)'
167 ENDIF
168 DO j=1-Oly,sNy+Oly
169 DO i=1-Olx,sNx+Olx
170 fMer(i,j) = fMer(i,j) + af(i,j)
171 ENDDO
172 ENDDO
173
174 C- Diffusive flux in Y
175 IF (diffKh.NE.0.) THEN
176 CALL GAD_DIFF_Y(bi,bj,k,yA,diffKh,localT,df,myThid)
177 ELSE
178 DO j=1-Oly,sNy+Oly
179 DO i=1-Olx,sNx+Olx
180 df(i,j) = 0.
181 ENDDO
182 ENDDO
183 ENDIF
184
185 #ifdef ALLOW_GMREDI
186 C- GM/Redi flux in Y
187 IF (useGMRedi) THEN
188 CALL GMREDI_YTRANSPORT(
189 C *note* should update GMREDI_YTRANSPORT to use localT and set df *aja*
190 I iMin,iMax,jMin,jMax,bi,bj,K,
191 I yA,Tracer,
192 U df,
193 I myThid)
194 ENDIF
195 #endif
196 DO j=1-Oly,sNy+Oly
197 DO i=1-Olx,sNx+Olx
198 fMer(i,j) = fMer(i,j) + df(i,j)
199 ENDDO
200 ENDDO
201
202 C- Bi-harmonic flux in Y
203 IF (diffK4 .NE. 0.) THEN
204 CALL GAD_BIHARM_Y(bi,bj,k,yA,df4,diffK4,df,myThid)
205 DO j=1-Oly,sNy+Oly
206 DO i=1-Olx,sNx+Olx
207 fMer(i,j) = fMer(i,j) + df(i,j)
208 ENDDO
209 ENDDO
210 ENDIF
211
212 C-- Initialize net flux in R
213 DO j=jMin,jMax
214 DO i=iMin,iMax
215 fVerT(i,j,kUp) = 0.
216 ENDDO
217 ENDDO
218
219 C- Advective flux in R
220 IF (gad_advection_scheme.EQ.ENUM_CENTERED_2ND) THEN
221 CALL GAD_C2_ADV_R(bi,bj,k,rTrans,tracer,af,myThid)
222 ELSEIF (gad_advection_scheme.EQ.ENUM_FLUX_LIMIT) THEN
223 CALL GAD_FLUXLIMIT_ADV_R(
224 & bi,bj,k,deltaTtracer,rTrans,wVel,tracer,af,myThid)
225 ELSEIF (gad_advection_scheme.EQ.ENUM_CENTERED_4TH) THEN
226 CALL GAD_C4_ADV_R(bi,bj,k,rTrans,tracer,af,myThid)
227 c CALL GAD_C2_ADV_R(bi,bj,k,rTrans,tracer,af,myThid)
228 ELSE
229 stop 'CALC_GTRACER: Bad gad_advection_scheme (R)'
230 ENDIF
231 DO j=jMin,jMax
232 DO i=iMin,iMax
233 fVerT(i,j,kUp) = fVerT(i,j,kUp) + afFacT*af(i,j)
234 ENDDO
235 ENDDO
236
237 C- Diffusive flux in R
238 C Note: For K=1 then KM1=1 and this gives a dT/dr = 0 upper
239 C boundary condition.
240 IF (implicitDiffusion) THEN
241 DO j=jMin,jMax
242 DO i=iMin,iMax
243 df(i,j) = 0.
244 ENDDO
245 ENDDO
246 ELSE
247 CALL GAD_DIFF_R(bi,bj,k,KappaRT,tracer,df,myThid)
248 ENDIF
249 c DO j=jMin,jMax
250 c DO i=iMin,iMax
251 c fVerT(i,j,kUp) = fVerT(i,j,kUp) + dfFacT*df(i,j)*maskUp(i,j)
252 c ENDDO
253 c ENDDO
254
255 #ifdef ALLOW_GMREDI
256 C- GM/Redi flux in R
257 IF (useGMRedi) THEN
258 C *note* should update GMREDI_RTRANSPORT to set df *aja*
259 CALL GMREDI_RTRANSPORT(
260 I iMin,iMax,jMin,jMax,bi,bj,K,
261 I maskUp,Tracer,
262 U df,
263 I myThid)
264 c DO j=jMin,jMax
265 c DO i=iMin,iMax
266 c fVerT(i,j,kUp) = fVerT(i,j,kUp) + dfFacT*df(i,j)*maskUp(i,j)
267 c ENDDO
268 c ENDDO
269 ENDIF
270 #endif
271
272 DO j=jMin,jMax
273 DO i=iMin,iMax
274 fVerT(i,j,kUp) = fVerT(i,j,kUp) + dfFacT*df(i,j)*maskUp(i,j)
275 ENDDO
276 ENDDO
277
278 #ifdef ALLOW_KPP
279 C- Add non local KPP transport term (ghat) to diffusive T flux.
280 IF (useKPP) THEN
281 DO j=jMin,jMax
282 DO i=iMin,iMax
283 df(i,j) = 0.
284 ENDDO
285 ENDDO
286 IF (tracerIdentity.EQ.GAD_TEMPERATURE) THEN
287 C *note* should update KPP_TRANSPORT_T to set df *aja*
288 CALL KPP_TRANSPORT_T(
289 I iMin,iMax,jMin,jMax,bi,bj,k,km1,
290 I KappaRT,
291 U df )
292 ELSEIF (tracerIdentity.EQ.GAD_SALINITY) THEN
293 CALL KPP_TRANSPORT_S(
294 I iMin,iMax,jMin,jMax,bi,bj,k,km1,
295 I KappaRT,
296 U df )
297 ELSE
298 STOP 'GAD_CALC_RHS: Ooops'
299 ENDIF
300 DO j=jMin,jMax
301 DO i=iMin,iMax
302 fVerT(i,j,kUp) = fVerT(i,j,kUp) + dfFacT*df(i,j)*maskUp(i,j)
303 ENDDO
304 ENDDO
305 ENDIF
306 #endif
307
308 C-- Divergence of fluxes
309 DO j=jMin,jMax
310 DO i=iMin,iMax
311 gTracer(i,j,k,bi,bj)=
312 & -_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
313 & *recip_rA(i,j,bi,bj)
314 & *(
315 & +( fZon(i+1,j)-fZon(i,j) )
316 & +( fMer(i,j+1)-fMer(i,j) )
317 & +( fVerT(i,j,kUp)-fVerT(i,j,kDown) )*rkFac
318 & )
319 ENDDO
320 ENDDO
321
322 RETURN
323 END

  ViewVC Help
Powered by ViewVC 1.1.22