/[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.44 - (hide annotations) (download)
Sat Jan 20 21:20:11 2007 UTC (17 years, 4 months ago) by adcroft
Branch: MAIN
Changes since 1.43: +13 -1 lines
Added new advection scheme, OS7MP, which is seventh order and monotonicity preserving (note: not the same as monotonic!)
 o enabled with advScheme set to "7". (Who chose 77 for Superbee? Oh, that was me ...)
 o scheme requires a halo of 4
   - no error checking for this at the moment
 o scheme is coded for convenience rather than efficiency
   - can easily switch down order or select the TVD limiter by commenting lines
   - the y direction is coded with invert do i; do j loops (for now)

1 adcroft 1.44 C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_calc_rhs.F,v 1.43 2006/12/05 05:26:46 jmc Exp $
2 jmc 1.2 C $Name: $
3 adcroft 1.1
4     #include "GAD_OPTIONS.h"
5    
6 adcroft 1.11 CBOP
7     C !ROUTINE: GAD_CALC_RHS
8    
9     C !INTERFACE: ==========================================================
10 jmc 1.41 SUBROUTINE GAD_CALC_RHS(
11 adcroft 1.1 I bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
12 jmc 1.41 I xA, yA, maskUp, uFld, vFld, wFld,
13     I uTrans, vTrans, rTrans, rTransKp1,
14 jmc 1.40 I diffKh, diffK4, KappaR, TracerN, TracAB,
15 jmc 1.26 I tracerIdentity, advectionScheme, vertAdvecScheme,
16 jmc 1.40 I calcAdvection, implicitAdvection, applyAB_onTracer,
17 adcroft 1.1 U fVerT, gTracer,
18 jmc 1.27 I myTime, myIter, myThid )
19 adcroft 1.11
20     C !DESCRIPTION:
21 jmc 1.38 C Calculates the tendency of a tracer due to advection and diffusion.
22 adcroft 1.11 C It calculates the fluxes in each direction indepentently and then
23 jmc 1.38 C sets the tendency to the divergence of these fluxes. The advective
24 adcroft 1.11 C fluxes are only calculated here when using the linear advection schemes
25     C otherwise only the diffusive and parameterized fluxes are calculated.
26     C
27     C Contributions to the flux are calculated and added:
28     C \begin{equation*}
29     C {\bf F} = {\bf F}_{adv} + {\bf F}_{diff} +{\bf F}_{GM} + {\bf F}_{KPP}
30     C \end{equation*}
31     C
32 jmc 1.38 C The tendency is the divergence of the fluxes:
33 adcroft 1.11 C \begin{equation*}
34     C G_\theta = G_\theta + \nabla \cdot {\bf F}
35     C \end{equation*}
36     C
37 jmc 1.38 C The tendency is assumed to contain data on entry.
38 adcroft 1.11
39     C !USES: ===============================================================
40 adcroft 1.1 IMPLICIT NONE
41     #include "SIZE.h"
42     #include "EEPARAMS.h"
43     #include "PARAMS.h"
44     #include "GRID.h"
45 jmc 1.16 #include "SURFACE.h"
46 adcroft 1.1 #include "GAD.h"
47    
48 heimbach 1.13 #ifdef ALLOW_AUTODIFF_TAMC
49     #include "tamc.h"
50     #include "tamc_keys.h"
51     #endif /* ALLOW_AUTODIFF_TAMC */
52    
53 adcroft 1.11 C !INPUT PARAMETERS: ===================================================
54 edhill 1.24 C bi,bj :: tile indices
55     C iMin,iMax :: loop range for called routines
56     C jMin,jMax :: loop range for called routines
57 jmc 1.41 C k :: vertical index
58     C kM1 :: =k-1 for k>1, =1 for k=1
59     C kUp :: index into 2 1/2D array, toggles between 1|2
60     C kDown :: index into 2 1/2D array, toggles between 2|1
61 edhill 1.24 C xA,yA :: areas of X and Y face of tracer cells
62 jmc 1.41 C maskUp :: 2-D array for mask at W points
63     C uFld,vFld,wFld :: Local copy of velocity field (3 components)
64 edhill 1.24 C uTrans,vTrans :: 2-D arrays of volume transports at U,V points
65     C rTrans :: 2-D arrays of volume transports at W points
66     C rTransKp1 :: 2-D array of volume trans at W pts, interf k+1
67     C diffKh :: horizontal diffusion coefficient
68     C diffK4 :: bi-harmonic diffusion coefficient
69 jmc 1.30 C KappaR :: 2-D array for vertical diffusion coefficient, interf k
70 jmc 1.40 C TracerN :: tracer field @ time-step n (Note: only used
71     C if applying AB on tracer field rather than on tendency gTr)
72     C TracAB :: current tracer field (@ time-step n if applying AB on gTr
73 jmc 1.39 C or extrapolated fwd in time to n+1/2 if applying AB on Tr)
74 edhill 1.24 C tracerIdentity :: tracer identifier (required for KPP,GM)
75 jmc 1.26 C advectionScheme :: advection scheme to use (Horizontal plane)
76     C vertAdvecScheme :: advection scheme to use (Vertical direction)
77 edhill 1.24 C calcAdvection :: =False if Advec computed with multiDim scheme
78     C implicitAdvection:: =True if vertical Advec computed implicitly
79 jmc 1.40 C applyAB_onTracer :: apply Adams-Bashforth on Tracer (rather than on gTr)
80 jmc 1.27 C myTime :: current time
81     C myIter :: iteration number
82 edhill 1.24 C myThid :: thread number
83 adcroft 1.11 INTEGER bi,bj,iMin,iMax,jMin,jMax
84 adcroft 1.1 INTEGER k,kUp,kDown,kM1
85     _RS xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
86     _RS yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
87 jmc 1.41 _RS maskUp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
88     _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
89     _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
90     _RL wFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
91 adcroft 1.1 _RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
92     _RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
93     _RL rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
94 jmc 1.23 _RL rTransKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
95 adcroft 1.1 _RL diffKh, diffK4
96 jmc 1.30 _RL KappaR(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
97 jmc 1.40 _RL TracerN(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
98     _RL TracAB (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
99 adcroft 1.1 INTEGER tracerIdentity
100 jmc 1.26 INTEGER advectionScheme, vertAdvecScheme
101 jmc 1.14 LOGICAL calcAdvection
102 jmc 1.40 LOGICAL implicitAdvection, applyAB_onTracer
103 jmc 1.27 _RL myTime
104     INTEGER myIter, myThid
105 adcroft 1.11
106     C !OUTPUT PARAMETERS: ==================================================
107 jmc 1.38 C gTracer :: tendency array
108 edhill 1.24 C fVerT :: 2 1/2D arrays for vertical advective flux
109 adcroft 1.11 _RL gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
110 adcroft 1.1 _RL fVerT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
111    
112 adcroft 1.11 C !LOCAL VARIABLES: ====================================================
113 edhill 1.24 C i,j :: loop indices
114     C df4 :: used for storing del^2 T for bi-harmonic term
115     C fZon :: zonal flux
116 jmc 1.32 C fMer :: meridional flux
117 edhill 1.24 C af :: advective flux
118     C df :: diffusive flux
119     C localT :: local copy of tracer field
120 jmc 1.38 C locABT :: local copy of (AB-extrapolated) tracer field
121 jmc 1.32 #ifdef ALLOW_DIAGNOSTICS
122     CHARACTER*8 diagName
123 jmc 1.41 CHARACTER*4 GAD_DIAG_SUFX, diagSufx
124 jmc 1.32 EXTERNAL GAD_DIAG_SUFX
125     #endif
126 adcroft 1.1 INTEGER i,j
127     _RL df4 (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
128     _RL fZon (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
129     _RL fMer (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
130     _RL af (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
131     _RL df (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
132     _RL localT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
133 jmc 1.38 _RL locABT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
134 jmc 1.23 _RL advFac, rAdvFac
135 adcroft 1.11 CEOP
136 adcroft 1.1
137     #ifdef ALLOW_AUTODIFF_TAMC
138     C-- only the kUp part of fverT is set in this subroutine
139     C-- the kDown is still required
140     fVerT(1,1,kDown) = fVerT(1,1,kDown)
141     #endif
142 heimbach 1.13
143 jmc 1.32 #ifdef ALLOW_DIAGNOSTICS
144     C-- Set diagnostic suffix for the current tracer
145     IF ( useDiagnostics ) THEN
146     diagSufx = GAD_DIAG_SUFX( tracerIdentity, myThid )
147     ENDIF
148     #endif
149    
150 jmc 1.23 advFac = 0. _d 0
151     IF (calcAdvection) advFac = 1. _d 0
152 jmc 1.36 rAdvFac = rkSign*advFac
153 jmc 1.23 IF (implicitAdvection) rAdvFac = 0. _d 0
154    
155 adcroft 1.1 DO j=1-OLy,sNy+OLy
156     DO i=1-OLx,sNx+OLx
157 heimbach 1.12 fZon(i,j) = 0. _d 0
158     fMer(i,j) = 0. _d 0
159     fVerT(i,j,kUp) = 0. _d 0
160 heimbach 1.13 df(i,j) = 0. _d 0
161     df4(i,j) = 0. _d 0
162 adcroft 1.1 ENDDO
163     ENDDO
164    
165     C-- Make local copy of tracer array
166 jmc 1.40 IF ( applyAB_onTracer ) THEN
167     DO j=1-OLy,sNy+OLy
168     DO i=1-OLx,sNx+OLx
169     localT(i,j)=TracerN(i,j,k,bi,bj)
170     locABT(i,j)= TracAB(i,j,k,bi,bj)
171     ENDDO
172     ENDDO
173     ELSE
174     DO j=1-OLy,sNy+OLy
175     DO i=1-OLx,sNx+OLx
176     localT(i,j)= TracAB(i,j,k,bi,bj)
177     locABT(i,j)= TracAB(i,j,k,bi,bj)
178     ENDDO
179     ENDDO
180     ENDIF
181 adcroft 1.1
182 adcroft 1.8 C-- Unless we have already calculated the advection terms we initialize
183     C the tendency to zero.
184 jmc 1.20 C <== now done earlier at the beginning of thermodynamics.
185     c IF (calcAdvection) THEN
186     c DO j=1-Oly,sNy+Oly
187     c DO i=1-Olx,sNx+Olx
188     c gTracer(i,j,k,bi,bj)=0. _d 0
189     c ENDDO
190     c ENDDO
191     c ENDIF
192 adcroft 1.1
193     C-- Pre-calculate del^2 T if bi-harmonic coefficient is non-zero
194     IF (diffK4 .NE. 0.) THEN
195     CALL GAD_GRAD_X(bi,bj,k,xA,localT,fZon,myThid)
196     CALL GAD_GRAD_Y(bi,bj,k,yA,localT,fMer,myThid)
197     CALL GAD_DEL2(bi,bj,k,fZon,fMer,df4,myThid)
198     ENDIF
199    
200     C-- Initialize net flux in X direction
201     DO j=1-Oly,sNy+Oly
202     DO i=1-Olx,sNx+Olx
203 heimbach 1.12 fZon(i,j) = 0. _d 0
204 adcroft 1.1 ENDDO
205     ENDDO
206    
207     C- Advective flux in X
208 jmc 1.14 IF (calcAdvection) THEN
209 jmc 1.32 IF (advectionScheme.EQ.ENUM_CENTERED_2ND) THEN
210 jmc 1.38 CALL GAD_C2_ADV_X(bi,bj,k,uTrans,locABT,af,myThid)
211 jmc 1.41 ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_1RST
212 jmc 1.37 & .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
213 jmc 1.41 CALL GAD_DST2U1_ADV_X( bi,bj,k, advectionScheme,
214     I dTtracerLev(k), uTrans, uFld, locABT,
215 jmc 1.37 O af, myThid )
216 jmc 1.32 ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
217     CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, dTtracerLev(k),
218 jmc 1.41 I uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
219 jmc 1.32 O af, myThid )
220     ELSEIF (advectionScheme.EQ.ENUM_UPWIND_3RD ) THEN
221 jmc 1.38 CALL GAD_U3_ADV_X(bi,bj,k,uTrans,locABT,af,myThid)
222 jmc 1.32 ELSEIF (advectionScheme.EQ.ENUM_CENTERED_4TH) THEN
223 jmc 1.38 CALL GAD_C4_ADV_X(bi,bj,k,uTrans,locABT,af,myThid)
224 jmc 1.32 ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN
225     CALL GAD_DST3_ADV_X( bi,bj,k, dTtracerLev(k),
226 jmc 1.41 I uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
227 jmc 1.32 O af, myThid )
228     ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
229 heimbach 1.35 IF ( inAdMode ) THEN
230     cph This block is to trick the adjoint:
231 jmc 1.41 cph IF inAdExact=.FALSE., we want to use DST3
232 heimbach 1.35 cph with limiters in forward, but without limiters in reverse.
233     CALL GAD_DST3_ADV_X( bi,bj,k, dTtracerLev(k),
234 jmc 1.41 I uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
235 heimbach 1.35 O af, myThid )
236     ELSE
237 jmc 1.32 CALL GAD_DST3FL_ADV_X( bi,bj,k, dTtracerLev(k),
238 jmc 1.41 I uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
239 heimbach 1.35 O af, myThid )
240     ENDIF
241 adcroft 1.44 ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN
242     CALL GAD_OS7MP_ADV_X( bi,bj,k, dTtracerLev(k),
243     I uTrans, uFld, maskW(1-Olx,1-Oly,k,bi,bj), locABT,
244     O af, myThid )
245 jmc 1.32 ELSE
246     STOP 'GAD_CALC_RHS: Bad advectionScheme (X)'
247     ENDIF
248     DO j=1-Oly,sNy+Oly
249     DO i=1-Olx,sNx+Olx
250     fZon(i,j) = fZon(i,j) + af(i,j)
251     ENDDO
252     ENDDO
253     #ifdef ALLOW_DIAGNOSTICS
254     IF ( useDiagnostics ) THEN
255     diagName = 'ADVx'//diagSufx
256 jmc 1.33 CALL DIAGNOSTICS_FILL(af,diagName, k,1, 2,bi,bj, myThid)
257 jmc 1.32 ENDIF
258     #endif
259 adcroft 1.8 ENDIF
260 adcroft 1.1
261     C- Diffusive flux in X
262     IF (diffKh.NE.0.) THEN
263     CALL GAD_DIFF_X(bi,bj,k,xA,diffKh,localT,df,myThid)
264     ELSE
265 adcroft 1.5 DO j=1-Oly,sNy+Oly
266     DO i=1-Olx,sNx+Olx
267 heimbach 1.12 df(i,j) = 0. _d 0
268 adcroft 1.1 ENDDO
269     ENDDO
270     ENDIF
271    
272 jmc 1.32 C- Add bi-harmonic diffusive flux in X
273     IF (diffK4 .NE. 0.) THEN
274     CALL GAD_BIHARM_X(bi,bj,k,xA,df4,diffK4,df,myThid)
275     ENDIF
276    
277 adcroft 1.1 #ifdef ALLOW_GMREDI
278     C- GM/Redi flux in X
279     IF (useGMRedi) THEN
280 jmc 1.38 C *note* should update GMREDI_XTRANSPORT to set df *aja*
281 jmc 1.40 IF ( applyAB_onTracer ) THEN
282     CALL GMREDI_XTRANSPORT(
283     I iMin,iMax,jMin,jMax,bi,bj,k,
284     I xA,TracerN,tracerIdentity,
285     U df,
286     I myThid)
287     ELSE
288     CALL GMREDI_XTRANSPORT(
289     I iMin,iMax,jMin,jMax,bi,bj,k,
290     I xA,TracAB, tracerIdentity,
291     U df,
292     I myThid)
293     ENDIF
294 adcroft 1.1 ENDIF
295     #endif
296 jmc 1.43 C anelastic: advect.fluxes are scaled by rhoFac but hor.diff. flx are not
297 adcroft 1.5 DO j=1-Oly,sNy+Oly
298     DO i=1-Olx,sNx+Olx
299 jmc 1.43 fZon(i,j) = fZon(i,j) + df(i,j)*rhoFacC(k)
300 adcroft 1.1 ENDDO
301     ENDDO
302    
303 jmc 1.32 #ifdef ALLOW_DIAGNOSTICS
304     C- Diagnostics of Tracer flux in X dir (mainly Diffusive term),
305     C excluding advective terms:
306     IF ( useDiagnostics .AND.
307     & (diffKh.NE.0. .OR. diffK4 .NE.0. .OR. useGMRedi) ) THEN
308 jmc 1.42 diagName = 'DFxE'//diagSufx
309 jmc 1.33 CALL DIAGNOSTICS_FILL(df,diagName, k,1, 2,bi,bj, myThid)
310 adcroft 1.1 ENDIF
311 jmc 1.32 #endif
312 adcroft 1.1
313     C-- Initialize net flux in Y direction
314     DO j=1-Oly,sNy+Oly
315     DO i=1-Olx,sNx+Olx
316 heimbach 1.12 fMer(i,j) = 0. _d 0
317 adcroft 1.1 ENDDO
318     ENDDO
319    
320     C- Advective flux in Y
321 jmc 1.14 IF (calcAdvection) THEN
322 jmc 1.32 IF (advectionScheme.EQ.ENUM_CENTERED_2ND) THEN
323 jmc 1.38 CALL GAD_C2_ADV_Y(bi,bj,k,vTrans,locABT,af,myThid)
324 jmc 1.41 ELSEIF ( advectionScheme.EQ.ENUM_UPWIND_1RST
325 jmc 1.37 & .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
326 jmc 1.41 CALL GAD_DST2U1_ADV_Y( bi,bj,k, advectionScheme,
327     I dTtracerLev(k), vTrans, vFld, locABT,
328 jmc 1.37 O af, myThid )
329 jmc 1.32 ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
330     CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, dTtracerLev(k),
331 jmc 1.41 I vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
332 jmc 1.32 O af, myThid )
333     ELSEIF (advectionScheme.EQ.ENUM_UPWIND_3RD ) THEN
334 jmc 1.38 CALL GAD_U3_ADV_Y(bi,bj,k,vTrans,locABT,af,myThid)
335 jmc 1.32 ELSEIF (advectionScheme.EQ.ENUM_CENTERED_4TH) THEN
336 jmc 1.38 CALL GAD_C4_ADV_Y(bi,bj,k,vTrans,locABT,af,myThid)
337 jmc 1.32 ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN
338     CALL GAD_DST3_ADV_Y( bi,bj,k, dTtracerLev(k),
339 jmc 1.41 I vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
340 jmc 1.32 O af, myThid )
341     ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
342 heimbach 1.35 IF ( inAdMode ) THEN
343     cph This block is to trick the adjoint:
344 jmc 1.41 cph IF inAdExact=.FALSE., we want to use DST3
345 heimbach 1.35 cph with limiters in forward, but without limiters in reverse.
346     CALL GAD_DST3_ADV_Y( bi,bj,k, dTtracerLev(k),
347 jmc 1.41 I vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
348 heimbach 1.35 O af, myThid )
349     ELSE
350 jmc 1.32 CALL GAD_DST3FL_ADV_Y( bi,bj,k, dTtracerLev(k),
351 jmc 1.41 I vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
352 heimbach 1.35 O af, myThid )
353     ENDIF
354 adcroft 1.44 ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN
355     CALL GAD_OS7MP_ADV_Y( bi,bj,k, dTtracerLev(k),
356     I vTrans, vFld, maskS(1-Olx,1-Oly,k,bi,bj), locABT,
357     O af, myThid )
358 jmc 1.32 ELSE
359     STOP 'GAD_CALC_RHS: Bad advectionScheme (Y)'
360     ENDIF
361     DO j=1-Oly,sNy+Oly
362     DO i=1-Olx,sNx+Olx
363     fMer(i,j) = fMer(i,j) + af(i,j)
364     ENDDO
365     ENDDO
366     #ifdef ALLOW_DIAGNOSTICS
367     IF ( useDiagnostics ) THEN
368     diagName = 'ADVy'//diagSufx
369 jmc 1.33 CALL DIAGNOSTICS_FILL(af,diagName, k,1, 2,bi,bj, myThid)
370 jmc 1.32 ENDIF
371     #endif
372 adcroft 1.8 ENDIF
373 adcroft 1.1
374     C- Diffusive flux in Y
375     IF (diffKh.NE.0.) THEN
376     CALL GAD_DIFF_Y(bi,bj,k,yA,diffKh,localT,df,myThid)
377     ELSE
378     DO j=1-Oly,sNy+Oly
379     DO i=1-Olx,sNx+Olx
380 heimbach 1.12 df(i,j) = 0. _d 0
381 adcroft 1.1 ENDDO
382     ENDDO
383     ENDIF
384    
385 jmc 1.32 C- Add bi-harmonic flux in Y
386     IF (diffK4 .NE. 0.) THEN
387     CALL GAD_BIHARM_Y(bi,bj,k,yA,df4,diffK4,df,myThid)
388     ENDIF
389    
390 adcroft 1.1 #ifdef ALLOW_GMREDI
391     C- GM/Redi flux in Y
392     IF (useGMRedi) THEN
393 jmc 1.38 C *note* should update GMREDI_YTRANSPORT to set df *aja*
394 jmc 1.40 IF ( applyAB_onTracer ) THEN
395     CALL GMREDI_YTRANSPORT(
396     I iMin,iMax,jMin,jMax,bi,bj,k,
397     I yA,TracerN,tracerIdentity,
398     U df,
399     I myThid)
400     ELSE
401     CALL GMREDI_YTRANSPORT(
402     I iMin,iMax,jMin,jMax,bi,bj,k,
403     I yA,TracAB, tracerIdentity,
404     U df,
405     I myThid)
406     ENDIF
407 adcroft 1.1 ENDIF
408     #endif
409 jmc 1.43 C anelastic: advect.fluxes are scaled by rhoFac but hor.diff. flx are not
410 adcroft 1.1 DO j=1-Oly,sNy+Oly
411     DO i=1-Olx,sNx+Olx
412 jmc 1.43 fMer(i,j) = fMer(i,j) + df(i,j)*rhoFacC(k)
413 adcroft 1.1 ENDDO
414     ENDDO
415    
416 jmc 1.32 #ifdef ALLOW_DIAGNOSTICS
417     C- Diagnostics of Tracer flux in Y dir (mainly Diffusive terms),
418     C excluding advective terms:
419     IF ( useDiagnostics .AND.
420     & (diffKh.NE.0. .OR. diffK4 .NE.0. .OR. useGMRedi) ) THEN
421 jmc 1.42 diagName = 'DFyE'//diagSufx
422 jmc 1.33 CALL DIAGNOSTICS_FILL(df,diagName, k,1, 2,bi,bj, myThid)
423 adcroft 1.1 ENDIF
424 jmc 1.32 #endif
425 adcroft 1.1
426 jmc 1.16 C-- Compute vertical flux fVerT(kUp) at interface k (between k-1 & k):
427 adcroft 1.1 C- Advective flux in R
428 jmc 1.25 #ifdef ALLOW_AIM
429     C- a hack to prevent Water-Vapor vert.transport into the stratospheric level Nr
430 jmc 1.40 IF (calcAdvection .AND. .NOT.implicitAdvection .AND. k.GE.2 .AND.
431     & (.NOT.useAIM .OR.tracerIdentity.NE.GAD_SALINITY .OR.k.LT.Nr)
432 jmc 1.25 & ) THEN
433     #else
434 jmc 1.40 IF (calcAdvection .AND. .NOT.implicitAdvection .AND. k.GE.2) THEN
435 jmc 1.25 #endif
436 jmc 1.2 C- Compute vertical advective flux in the interior:
437 jmc 1.32 IF (vertAdvecScheme.EQ.ENUM_CENTERED_2ND) THEN
438 jmc 1.38 CALL GAD_C2_ADV_R(bi,bj,k,rTrans,TracAB,af,myThid)
439 jmc 1.41 ELSEIF ( vertAdvecScheme.EQ.ENUM_UPWIND_1RST
440 jmc 1.37 & .OR. vertAdvecScheme.EQ.ENUM_DST2 ) THEN
441 jmc 1.41 CALL GAD_DST2U1_ADV_R( bi,bj,k, vertAdvecScheme,
442     I dTtracerLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
443 jmc 1.37 O af, myThid )
444 jmc 1.32 ELSEIF (vertAdvecScheme.EQ.ENUM_FLUX_LIMIT) THEN
445 jmc 1.37 CALL GAD_FLUXLIMIT_ADV_R( bi,bj,k,
446 jmc 1.41 I dTtracerLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
447 jmc 1.37 O af, myThid )
448 jmc 1.32 ELSEIF (vertAdvecScheme.EQ.ENUM_UPWIND_3RD ) THEN
449 jmc 1.38 CALL GAD_U3_ADV_R(bi,bj,k,rTrans,TracAB,af,myThid)
450 jmc 1.32 ELSEIF (vertAdvecScheme.EQ.ENUM_CENTERED_4TH) THEN
451 jmc 1.38 CALL GAD_C4_ADV_R(bi,bj,k,rTrans,TracAB,af,myThid)
452 jmc 1.32 ELSEIF (vertAdvecScheme.EQ.ENUM_DST3 ) THEN
453 jmc 1.37 CALL GAD_DST3_ADV_R( bi,bj,k,
454 jmc 1.41 I dTtracerLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
455 jmc 1.37 O af, myThid )
456 jmc 1.32 ELSEIF (vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
457 heimbach 1.35 cph This block is to trick the adjoint:
458 jmc 1.41 cph IF inAdExact=.FALSE., we want to use DST3
459 heimbach 1.35 cph with limiters in forward, but without limiters in reverse.
460     IF ( inAdMode ) THEN
461 jmc 1.37 CALL GAD_DST3_ADV_R( bi,bj,k,
462 jmc 1.41 I dTtracerLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
463 jmc 1.37 O af, myThid )
464 heimbach 1.35 ELSE
465 jmc 1.37 CALL GAD_DST3FL_ADV_R( bi,bj,k,
466 jmc 1.41 I dTtracerLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
467 jmc 1.37 O af, myThid )
468 heimbach 1.35 ENDIF
469 adcroft 1.44 ELSEIF (vertAdvecScheme.EQ.ENUM_OS7MP ) THEN
470     CALL GAD_OS7MP_ADV_R( bi,bj,k,
471     I dTtracerLev(k),rTrans,wFld,TracAB(1-Olx,1-Oly,1,bi,bj),
472     O af, myThid )
473 jmc 1.32 ELSE
474     STOP 'GAD_CALC_RHS: Bad vertAdvecScheme (R)'
475     ENDIF
476 jmc 1.23 C- add the advective flux to fVerT
477 jmc 1.32 DO j=1-Oly,sNy+Oly
478     DO i=1-Olx,sNx+Olx
479     fVerT(i,j,kUp) = fVerT(i,j,kUp) + af(i,j)
480     ENDDO
481 jmc 1.2 ENDDO
482 jmc 1.32 #ifdef ALLOW_DIAGNOSTICS
483     IF ( useDiagnostics ) THEN
484     diagName = 'ADVr'//diagSufx
485 jmc 1.33 CALL DIAGNOSTICS_FILL(af,diagName, k,1, 2,bi,bj, myThid)
486 jmc 1.34 C- note: needs to explicitly increment the counter since DIAGNOSTICS_FILL
487     C does it only if k=1 (never the case here)
488     IF ( k.EQ.2 ) CALL DIAGNOSTICS_COUNT(diagName,bi,bj,myThid)
489 jmc 1.32 ENDIF
490     #endif
491 adcroft 1.8 ENDIF
492 adcroft 1.1
493     C- Diffusive flux in R
494     C Note: For K=1 then KM1=1 and this gives a dT/dr = 0 upper
495     C boundary condition.
496     IF (implicitDiffusion) THEN
497 adcroft 1.5 DO j=1-Oly,sNy+Oly
498     DO i=1-Olx,sNx+Olx
499 heimbach 1.12 df(i,j) = 0. _d 0
500 adcroft 1.1 ENDDO
501     ENDDO
502     ELSE
503 jmc 1.40 IF ( applyAB_onTracer ) THEN
504     CALL GAD_DIFF_R(bi,bj,k,KappaR,TracerN,df,myThid)
505     ELSE
506     CALL GAD_DIFF_R(bi,bj,k,KappaR,TracAB, df,myThid)
507     ENDIF
508 adcroft 1.1 ENDIF
509    
510     #ifdef ALLOW_GMREDI
511     C- GM/Redi flux in R
512     IF (useGMRedi) THEN
513     C *note* should update GMREDI_RTRANSPORT to set df *aja*
514 jmc 1.40 IF ( applyAB_onTracer ) THEN
515     CALL GMREDI_RTRANSPORT(
516     I iMin,iMax,jMin,jMax,bi,bj,k,
517     I TracerN,tracerIdentity,
518     U df,
519     I myThid)
520     ELSE
521     CALL GMREDI_RTRANSPORT(
522     I iMin,iMax,jMin,jMax,bi,bj,k,
523     I TracAB, tracerIdentity,
524     U df,
525     I myThid)
526     ENDIF
527 adcroft 1.1 ENDIF
528     #endif
529    
530 adcroft 1.5 DO j=1-Oly,sNy+Oly
531     DO i=1-Olx,sNx+Olx
532 adcroft 1.11 fVerT(i,j,kUp) = fVerT(i,j,kUp) + df(i,j)*maskUp(i,j)
533 adcroft 1.1 ENDDO
534     ENDDO
535    
536 jmc 1.32 #ifdef ALLOW_DIAGNOSTICS
537 jmc 1.41 C- Diagnostics of Tracer flux in R dir (mainly Diffusive terms),
538 jmc 1.32 C Explicit terms only & excluding advective terms:
539     IF ( useDiagnostics .AND.
540     & (.NOT.implicitDiffusion .OR. useGMRedi) ) THEN
541     diagName = 'DFrE'//diagSufx
542 jmc 1.33 CALL DIAGNOSTICS_FILL(df,diagName, k,1, 2,bi,bj, myThid)
543 jmc 1.32 ENDIF
544     #endif
545    
546 adcroft 1.1 #ifdef ALLOW_KPP
547 jmc 1.29 C- Set non local KPP transport term (ghat):
548     IF ( useKPP .AND. k.GE.2 ) THEN
549 adcroft 1.5 DO j=1-Oly,sNy+Oly
550     DO i=1-Olx,sNx+Olx
551 heimbach 1.12 df(i,j) = 0. _d 0
552 adcroft 1.1 ENDDO
553     ENDDO
554     IF (tracerIdentity.EQ.GAD_TEMPERATURE) THEN
555     CALL KPP_TRANSPORT_T(
556     I iMin,iMax,jMin,jMax,bi,bj,k,km1,
557 jmc 1.29 O df )
558 adcroft 1.1 ELSEIF (tracerIdentity.EQ.GAD_SALINITY) THEN
559     CALL KPP_TRANSPORT_S(
560     I iMin,iMax,jMin,jMax,bi,bj,k,km1,
561 jmc 1.29 O df )
562 mlosch 1.18 #ifdef ALLOW_PTRACERS
563 dimitri 1.22 ELSEIF (tracerIdentity .GE. GAD_TR1) THEN
564 mlosch 1.18 CALL KPP_TRANSPORT_PTR(
565     I iMin,iMax,jMin,jMax,bi,bj,k,km1,
566 jmc 1.29 I tracerIdentity-GAD_TR1+1,
567     O df )
568 mlosch 1.18 #endif
569 adcroft 1.1 ELSE
570 mlosch 1.18 PRINT*,'invalid tracer indentity: ', tracerIdentity
571 adcroft 1.1 STOP 'GAD_CALC_RHS: Ooops'
572     ENDIF
573 adcroft 1.5 DO j=1-Oly,sNy+Oly
574     DO i=1-Olx,sNx+Olx
575 jmc 1.43 fVerT(i,j,kUp) = fVerT(i,j,kUp)
576     & + df(i,j)*maskUp(i,j)*rhoFacF(k)
577 adcroft 1.1 ENDDO
578     ENDDO
579     ENDIF
580     #endif
581    
582     C-- Divergence of fluxes
583 jmc 1.43 C Anelastic: scale vertical fluxes by rhoFac and leave Horizontal fluxes unchanged
584 adcroft 1.10 DO j=1-Oly,sNy+Oly-1
585     DO i=1-Olx,sNx+Olx-1
586 adcroft 1.8 gTracer(i,j,k,bi,bj)=gTracer(i,j,k,bi,bj)
587 jmc 1.43 & -_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
588     & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)*recip_rhoFacC(k)
589 jmc 1.23 & *( (fZon(i+1,j)-fZon(i,j))
590     & +(fMer(i,j+1)-fMer(i,j))
591 jmc 1.36 & +(fVerT(i,j,kDown)-fVerT(i,j,kUp))*rkSign
592 jmc 1.23 & -localT(i,j)*( (uTrans(i+1,j)-uTrans(i,j))
593     & +(vTrans(i,j+1)-vTrans(i,j))
594 jmc 1.36 & +(rTransKp1(i,j)-rTrans(i,j))*rAdvFac
595 jmc 1.23 & )*advFac
596 adcroft 1.1 & )
597     ENDDO
598     ENDDO
599    
600 jmc 1.27 #ifdef ALLOW_DEBUG
601     IF ( debugLevel .GE. debLevB
602 jmc 1.28 & .AND. tracerIdentity.EQ.GAD_TEMPERATURE
603 jmc 1.27 & .AND. k.EQ.2 .AND. myIter.EQ.1+nIter0
604     & .AND. nPx.EQ.1 .AND. nPy.EQ.1
605     & .AND. useCubedSphereExchange ) THEN
606     CALL DEBUG_CS_CORNER_UV( ' fZon,fMer from GAD_CALC_RHS',
607     & fZon,fMer, k, standardMessageUnit,bi,bj,myThid )
608     ENDIF
609     #endif /* ALLOW_DEBUG */
610 jmc 1.41
611 adcroft 1.1 RETURN
612     END

  ViewVC Help
Powered by ViewVC 1.1.22