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

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

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


Revision 1.3 - (hide annotations) (download)
Thu Aug 30 00:40:37 2001 UTC (22 years, 9 months ago) by adcroft
Branch: MAIN
Changes since 1.2: +18 -17 lines
JMC pointed out these missing changes for the run-time advection
schemes. Oops.

We need a test that uses them...

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

  ViewVC Help
Powered by ViewVC 1.1.22