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

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

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


Revision 1.74 - (hide annotations) (download)
Fri Apr 4 20:28:13 2014 UTC (10 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint65b, checkpoint65a, checkpoint65, checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64w, checkpoint64v
Changes since 1.73: +20 -17 lines
- Start to include explicitly AUTODIFF_OPTIONS.h, COST_OPTIONS.h,
  and CTRL_OPTIONS.h in src files (to enable to skip the ECCO_CPPOPTIONS.h)
  For now, only in pkgs used in verification/hs94.1x64x5.
- Replace ALLOW_AUTODIFF_TAMC by ALLOW_AUTODIFF (except for tape/storage
  which are specific to TAF/TAMC).

1 jmc 1.74 C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_advection.F,v 1.73 2013/11/19 16:59:33 jmc Exp $
2 adcroft 1.2 C $Name: $
3 adcroft 1.4
4 adcroft 1.1 #include "GAD_OPTIONS.h"
5 jmc 1.74 #ifdef ALLOW_AUTODIFF
6     # include "AUTODIFF_OPTIONS.h"
7     #endif
8 adcroft 1.1
9 edhill 1.19 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
10 adcroft 1.4 CBOP
11     C !ROUTINE: GAD_ADVECTION
12    
13     C !INTERFACE: ==========================================================
14 jmc 1.17 SUBROUTINE GAD_ADVECTION(
15 jmc 1.23 I implicitAdvection, advectionScheme, vertAdvecScheme,
16 jmc 1.71 I trIdentity, deltaTLev,
17 jmc 1.73 I uFld, vFld, wFld, tracer,
18 edhill 1.21 O gTracer,
19     I bi,bj, myTime,myIter,myThid)
20 adcroft 1.4
21     C !DESCRIPTION:
22 jmc 1.44 C Calculates the tendency of a tracer due to advection.
23 adcroft 1.4 C It uses the multi-dimensional method given in \ref{sect:multiDimAdvection}
24     C and can only be used for the non-linear advection schemes such as the
25 jmc 1.41 C direct-space-time method and flux-limiters.
26 adcroft 1.4 C
27     C The algorithm is as follows:
28     C \begin{itemize}
29     C \item{$\theta^{(n+1/3)} = \theta^{(n)}
30 adcroft 1.5 C - \Delta t \partial_x (u\theta^{(n)}) + \theta^{(n)} \partial_x u$}
31 adcroft 1.4 C \item{$\theta^{(n+2/3)} = \theta^{(n+1/3)}
32 adcroft 1.5 C - \Delta t \partial_y (v\theta^{(n+1/3)}) + \theta^{(n)} \partial_y v$}
33 adcroft 1.4 C \item{$\theta^{(n+3/3)} = \theta^{(n+2/3)}
34 adcroft 1.5 C - \Delta t \partial_r (w\theta^{(n+2/3)}) + \theta^{(n)} \partial_r w$}
35 adcroft 1.4 C \item{$G_\theta = ( \theta^{(n+3/3)} - \theta^{(n)} )/\Delta t$}
36     C \end{itemize}
37     C
38 jmc 1.44 C The tendency (output) is over-written by this routine.
39 adcroft 1.4
40     C !USES: ===============================================================
41 adcroft 1.1 IMPLICIT NONE
42     #include "SIZE.h"
43     #include "EEPARAMS.h"
44     #include "PARAMS.h"
45     #include "GRID.h"
46     #include "GAD.h"
47 jmc 1.74 #ifdef ALLOW_AUTODIFF
48 heimbach 1.6 # include "tamc.h"
49     # include "tamc_keys.h"
50 heimbach 1.27 # ifdef ALLOW_PTRACERS
51     # include "PTRACERS_SIZE.h"
52     # endif
53 heimbach 1.6 #endif
54 dimitri 1.24 #ifdef ALLOW_EXCH2
55 jmc 1.60 #include "W2_EXCH2_SIZE.h"
56 dimitri 1.24 #include "W2_EXCH2_TOPOLOGY.h"
57     #endif /* ALLOW_EXCH2 */
58 adcroft 1.1
59 adcroft 1.4 C !INPUT PARAMETERS: ===================================================
60 edhill 1.21 C implicitAdvection :: implicit vertical advection (later on)
61 jmc 1.23 C advectionScheme :: advection scheme to use (Horizontal plane)
62     C vertAdvecScheme :: advection scheme to use (vertical direction)
63 jmc 1.71 C trIdentity :: tracer identifier
64 jmc 1.73 C uFld :: Advection velocity field, zonal component
65     C vFld :: Advection velocity field, meridional component
66     C wFld :: Advection velocity field, vertical component
67 edhill 1.21 C tracer :: tracer field
68     C bi,bj :: tile indices
69     C myTime :: current time
70     C myIter :: iteration number
71     C myThid :: thread number
72 jmc 1.17 LOGICAL implicitAdvection
73 jmc 1.23 INTEGER advectionScheme, vertAdvecScheme
74 jmc 1.71 INTEGER trIdentity
75 jahn 1.61 _RL deltaTLev(Nr)
76 jmc 1.73 _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
77     _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
78     _RL wFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
79 jmc 1.71 _RL tracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
80 jmc 1.17 INTEGER bi,bj
81 adcroft 1.1 _RL myTime
82     INTEGER myIter
83     INTEGER myThid
84    
85 adcroft 1.4 C !OUTPUT PARAMETERS: ==================================================
86 jmc 1.44 C gTracer :: tendency array
87 jmc 1.71 _RL gTracer(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr,nSx,nSy)
88 adcroft 1.4
89 jmc 1.72 C !FUNCTIONS: ==========================================================
90     #ifdef ALLOW_DIAGNOSTICS
91     CHARACTER*4 GAD_DIAG_SUFX
92     EXTERNAL GAD_DIAG_SUFX
93     LOGICAL DIAGNOSTICS_IS_ON
94     EXTERNAL DIAGNOSTICS_IS_ON
95     #endif
96    
97 adcroft 1.4 C !LOCAL VARIABLES: ====================================================
98 edhill 1.21 C maskUp :: 2-D array for mask at W points
99 jmc 1.29 C maskLocW :: 2-D array for mask at West points
100     C maskLocS :: 2-D array for mask at South points
101 jmc 1.30 C [iMin,iMax]Upd :: loop range to update tracer field
102     C [jMin,jMax]Upd :: loop range to update tracer field
103 edhill 1.21 C i,j,k :: loop indices
104 jmc 1.41 C kUp :: index into 2 1/2D array, toggles between 1 and 2
105     C kDown :: index into 2 1/2D array, toggles between 2 and 1
106 edhill 1.21 C xA,yA :: areas of X and Y face of tracer cells
107     C uTrans,vTrans :: 2-D arrays of volume transports at U,V points
108     C rTrans :: 2-D arrays of volume transports at W points
109 jmc 1.72 C rTransKp :: vertical volume transport at interface k+1
110 jmc 1.30 C af :: 2-D array for horizontal advective flux
111 jmc 1.29 C afx :: 2-D array for horizontal advective flux, x direction
112     C afy :: 2-D array for horizontal advective flux, y direction
113 edhill 1.21 C fVerT :: 2 1/2D arrays for vertical advective flux
114 jmc 1.72 C localTij :: 2-D array, temporary local copy of tracer field
115     C localT3d :: 3-D array, temporary local copy of tracer field
116 edhill 1.21 C kp1Msk :: flag (0,1) for over-riding mask for W levels
117     C calc_fluxes_X :: logical to indicate to calculate fluxes in X dir
118     C calc_fluxes_Y :: logical to indicate to calculate fluxes in Y dir
119 jmc 1.30 C interiorOnly :: only update the interior of myTile, but not the edges
120     C overlapOnly :: only update the edges of myTile, but not the interior
121 jmc 1.55 C npass :: number of passes in multi-dimensional method
122 edhill 1.21 C ipass :: number of the current pass being made
123 jmc 1.41 C myTile :: variables used to determine which cube face
124 dimitri 1.24 C nCFace :: owns a tile for cube grid runs using
125     C :: multi-dim advection.
126 jmc 1.30 C [N,S,E,W]_edge :: true if N,S,E,W edge of myTile is an Edge of the cube
127 jmc 1.41 c _RS maskUp (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
128 jmc 1.29 _RS maskLocW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
129     _RS maskLocS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
130 jmc 1.30 INTEGER iMinUpd,iMaxUpd,jMinUpd,jMaxUpd
131 jmc 1.41 INTEGER i,j,k,kUp,kDown
132 adcroft 1.1 _RS xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
133     _RS yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
134     _RL uTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
135     _RL vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
136     _RL rTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
137 jmc 1.72 _RL rTransKp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
138 jmc 1.30 _RL af (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
139 jmc 1.29 _RL afx (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
140     _RL afy (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
141 adcroft 1.1 _RL fVerT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2)
142     _RL localTij(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
143 jmc 1.72 _RL localT3d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
144     #ifdef GAD_MULTIDIM_COMPRESSIBLE
145     _RL tmpTrac
146     _RL localVol(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
147     _RL locVol3d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
148     #endif
149 adcroft 1.1 _RL kp1Msk
150 jmc 1.29 LOGICAL calc_fluxes_X, calc_fluxes_Y, withSigns
151 jmc 1.30 LOGICAL interiorOnly, overlapOnly
152 jmc 1.55 INTEGER npass, ipass
153 jmc 1.38 INTEGER nCFace
154 jmc 1.30 LOGICAL N_edge, S_edge, E_edge, W_edge
155 jmc 1.69 #ifdef ALLOW_AUTODIFF_TAMC
156 heimbach 1.67 C msgBuf :: Informational/error message buffer
157     CHARACTER*(MAX_LEN_MBUF) msgBuf
158 jmc 1.69 #endif
159 jmc 1.38 #ifdef ALLOW_EXCH2
160     INTEGER myTile
161     #endif
162 jmc 1.33 #ifdef ALLOW_DIAGNOSTICS
163     CHARACTER*8 diagName
164 jmc 1.57 CHARACTER*4 diagSufx
165     LOGICAL doDiagAdvX, doDiagAdvY, doDiagAdvR
166 jmc 1.72 #endif /* ALLOW_DIAGNOSTICS */
167 adcroft 1.4 CEOP
168 adcroft 1.1
169 heimbach 1.6 #ifdef ALLOW_AUTODIFF_TAMC
170 jmc 1.71 act0 = trIdentity
171 heimbach 1.14 max0 = maxpass
172 heimbach 1.6 act1 = bi - myBxLo(myThid)
173     max1 = myBxHi(myThid) - myBxLo(myThid) + 1
174     act2 = bj - myByLo(myThid)
175     max2 = myByHi(myThid) - myByLo(myThid) + 1
176     act3 = myThid - 1
177     max3 = nTx*nTy
178     act4 = ikey_dynamics - 1
179 heimbach 1.51 igadkey = act0
180 heimbach 1.14 & + act1*max0
181     & + act2*max0*max1
182     & + act3*max0*max1*max2
183     & + act4*max0*max1*max2*max3
184 jmc 1.71 IF (trIdentity.GT.maxpass) THEN
185 jmc 1.68 WRITE(msgBuf,'(A,2I3)')
186 jmc 1.71 & 'GAD_ADVECTION: maxpass < trIdentity ',
187     & maxpass, trIdentity
188 heimbach 1.67 CALL PRINT_ERROR( msgBuf, myThid )
189     STOP 'ABNORMAL END: S/R GAD_ADVECTION'
190 jmc 1.57 ENDIF
191 heimbach 1.6 #endif /* ALLOW_AUTODIFF_TAMC */
192    
193 jmc 1.33 #ifdef ALLOW_DIAGNOSTICS
194 jmc 1.57 C-- Set diagnostics flags and suffix for the current tracer
195     doDiagAdvX = .FALSE.
196     doDiagAdvY = .FALSE.
197     doDiagAdvR = .FALSE.
198 jmc 1.33 IF ( useDiagnostics ) THEN
199 jmc 1.71 diagSufx = GAD_DIAG_SUFX( trIdentity, myThid )
200 jmc 1.57 diagName = 'ADVx'//diagSufx
201     doDiagAdvX = DIAGNOSTICS_IS_ON( diagName, myThid )
202     diagName = 'ADVy'//diagSufx
203     doDiagAdvY = DIAGNOSTICS_IS_ON( diagName, myThid )
204     diagName = 'ADVr'//diagSufx
205     doDiagAdvR = DIAGNOSTICS_IS_ON( diagName, myThid )
206 jmc 1.33 ENDIF
207 jmc 1.72 #endif /* ALLOW_DIAGNOSTICS */
208 jmc 1.33
209 adcroft 1.1 C-- Set up work arrays with valid (i.e. not NaN) values
210     C These inital values do not alter the numerical results. They
211     C just ensure that all memory references are to valid floating
212     C point numbers. This prevents spurious hardware signals due to
213     C uninitialised but inert locations.
214     DO j=1-OLy,sNy+OLy
215     DO i=1-OLx,sNx+OLx
216 jmc 1.73 C- xA,yA,vFld,uTrans,vTrans are set over the full domain
217     C => no need for extra initialisation
218     c xA(i,j) = 0. _d 0
219     c yA(i,j) = 0. _d 0
220     c uTrans(i,j) = 0. _d 0
221     c vTrans(i,j) = 0. _d 0
222     C- rTransKp is set over the full domain: no need for extra initialisation
223     c rTransKp(i,j)= 0. _d 0
224     C- rTrans and fVerT need to be initialised to zero:
225 adcroft 1.1 rTrans(i,j) = 0. _d 0
226     fVerT(i,j,1) = 0. _d 0
227     fVerT(i,j,2) = 0. _d 0
228 jmc 1.74 #ifdef ALLOW_AUTODIFF
229 jmc 1.72 # ifdef GAD_MULTIDIM_COMPRESSIBLE
230     localVol(i,j) = 0. _d 0
231     # endif
232 heimbach 1.39 localTij(i,j) = 0. _d 0
233 jmc 1.74 #endif /* ALLOW_AUTODIFF */
234 adcroft 1.1 ENDDO
235     ENDDO
236    
237 jmc 1.30 C-- Set tile-specific parameters for horizontal fluxes
238     IF (useCubedSphereExchange) THEN
239 jmc 1.55 npass = 3
240 jmc 1.30 #ifdef ALLOW_AUTODIFF_TAMC
241 jmc 1.55 IF ( npass.GT.maxcube ) STOP 'maxcube needs to be = 3'
242 jmc 1.30 #endif
243     #ifdef ALLOW_EXCH2
244 jmc 1.62 myTile = W2_myTileList(bi,bj)
245 jmc 1.30 nCFace = exch2_myFace(myTile)
246     N_edge = exch2_isNedge(myTile).EQ.1
247     S_edge = exch2_isSedge(myTile).EQ.1
248     E_edge = exch2_isEedge(myTile).EQ.1
249     W_edge = exch2_isWedge(myTile).EQ.1
250     #else
251     nCFace = bi
252     N_edge = .TRUE.
253     S_edge = .TRUE.
254     E_edge = .TRUE.
255     W_edge = .TRUE.
256     #endif
257     ELSE
258 jmc 1.55 npass = 2
259     nCFace = 0
260 jmc 1.30 N_edge = .FALSE.
261     S_edge = .FALSE.
262     E_edge = .FALSE.
263     W_edge = .FALSE.
264     ENDIF
265    
266 adcroft 1.1 C-- Start of k loop for horizontal fluxes
267     DO k=1,Nr
268 jmc 1.55 #ifdef ALLOW_AUTODIFF_TAMC
269 heimbach 1.14 kkey = (igadkey-1)*Nr + k
270 jmc 1.55 CADJ STORE tracer(:,:,k,bi,bj) =
271 heimbach 1.59 CADJ & comlev1_bibj_k_gad, key=kkey, kind=isbyte
272 heimbach 1.6 #endif /* ALLOW_AUTODIFF_TAMC */
273 adcroft 1.1
274     C-- Get temporary terms used by tendency routines
275 jmc 1.73 DO j=1-OLy,sNy+OLy
276     DO i=1-OLx,sNx+OLx
277     xA(i,j) = _dyG(i,j,bi,bj)*deepFacC(k)
278     & *drF(k)*_hFacW(i,j,k,bi,bj)
279     yA(i,j) = _dxG(i,j,bi,bj)*deepFacC(k)
280     & *drF(k)*_hFacS(i,j,k,bi,bj)
281     ENDDO
282     ENDDO
283     C-- Calculate "volume transports" through tracer cell faces.
284     C anelastic: scaled by rhoFacC (~ mass transport)
285     DO j=1-OLy,sNy+OLy
286     DO i=1-OLx,sNx+OLx
287     uTrans(i,j) = uFld(i,j,k)*xA(i,j)*rhoFacC(k)
288     vTrans(i,j) = vFld(i,j,k)*yA(i,j)*rhoFacC(k)
289     ENDDO
290     ENDDO
291 jmc 1.11
292 jmc 1.29 C-- Make local copy of tracer array and mask West & South
293 adcroft 1.1 DO j=1-OLy,sNy+OLy
294     DO i=1-OLx,sNx+OLx
295 jmc 1.71 localTij(i,j) = tracer(i,j,k,bi,bj)
296 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
297     localVol(i,j) = rA(i,j,bi,bj)*deepFac2C(k)
298     & *rhoFacC(k)*drF(k)*hFacC(i,j,k,bi,bj)
299     & + ( oneRS - maskC(i,j,k,bi,bj) )
300     #endif
301 jmc 1.64 #ifdef ALLOW_OBCS
302     maskLocW(i,j) = _maskW(i,j,k,bi,bj)*maskInW(i,j,bi,bj)
303     maskLocS(i,j) = _maskS(i,j,k,bi,bj)*maskInS(i,j,bi,bj)
304     #else /* ALLOW_OBCS */
305     maskLocW(i,j) = _maskW(i,j,k,bi,bj)
306     maskLocS(i,j) = _maskS(i,j,k,bi,bj)
307     #endif /* ALLOW_OBCS */
308 adcroft 1.1 ENDDO
309     ENDDO
310    
311 jmc 1.29 IF (useCubedSphereExchange) THEN
312     withSigns = .FALSE.
313 jmc 1.41 CALL FILL_CS_CORNER_UV_RS(
314 jmc 1.29 & withSigns, maskLocW,maskLocS, bi,bj, myThid )
315     ENDIF
316 adcroft 1.3
317     C-- Multiple passes for different directions on different tiles
318 dimitri 1.24 C-- For cube need one pass for each of red, green and blue axes.
319 jmc 1.55 DO ipass=1,npass
320 heimbach 1.6 #ifdef ALLOW_AUTODIFF_TAMC
321 jmc 1.55 passkey = ipass
322 heimbach 1.52 & + (k-1) *maxpass
323     & + (igadkey-1)*maxpass*Nr
324 jmc 1.55 IF (npass .GT. maxpass) THEN
325     STOP 'GAD_ADVECTION: npass > maxcube. check tamc.h'
326 heimbach 1.6 ENDIF
327     #endif /* ALLOW_AUTODIFF_TAMC */
328 adcroft 1.3
329 jmc 1.30 interiorOnly = .FALSE.
330     overlapOnly = .FALSE.
331     IF (useCubedSphereExchange) THEN
332     C- CubedSphere : pass 3 times, with partial update of local tracer field
333     IF (ipass.EQ.1) THEN
334     overlapOnly = MOD(nCFace,3).EQ.0
335     interiorOnly = MOD(nCFace,3).NE.0
336     calc_fluxes_X = nCFace.EQ.6 .OR. nCFace.EQ.1 .OR. nCFace.EQ.2
337     calc_fluxes_Y = nCFace.EQ.3 .OR. nCFace.EQ.4 .OR. nCFace.EQ.5
338     ELSEIF (ipass.EQ.2) THEN
339     overlapOnly = MOD(nCFace,3).EQ.2
340 jmc 1.55 interiorOnly = MOD(nCFace,3).EQ.1
341 jmc 1.30 calc_fluxes_X = nCFace.EQ.2 .OR. nCFace.EQ.3 .OR. nCFace.EQ.4
342     calc_fluxes_Y = nCFace.EQ.5 .OR. nCFace.EQ.6 .OR. nCFace.EQ.1
343     ELSE
344 jmc 1.55 interiorOnly = .TRUE.
345 jmc 1.30 calc_fluxes_X = nCFace.EQ.5 .OR. nCFace.EQ.6
346     calc_fluxes_Y = nCFace.EQ.2 .OR. nCFace.EQ.3
347 adcroft 1.3 ENDIF
348     ELSE
349 jmc 1.30 C- not CubedSphere
350     calc_fluxes_X = MOD(ipass,2).EQ.1
351     calc_fluxes_Y = .NOT.calc_fluxes_X
352 adcroft 1.3 ENDIF
353 jmc 1.41
354 jmc 1.29 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
355 adcroft 1.3 C-- X direction
356 jmc 1.72
357 jmc 1.74 #ifdef ALLOW_AUTODIFF
358 jmc 1.72 C- Always reset advective flux in X
359 jmc 1.71 DO j=1-OLy,sNy+OLy
360     DO i=1-OLx,sNx+OLx
361 heimbach 1.39 af(i,j) = 0.
362     ENDDO
363     ENDDO
364 heimbach 1.40 # ifndef DISABLE_MULTIDIM_ADVECTION
365 jmc 1.55 CADJ STORE localTij(:,:) =
366 heimbach 1.59 CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
367 jmc 1.55 CADJ STORE af(:,:) =
368 heimbach 1.59 CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
369 heimbach 1.40 # endif
370 jmc 1.74 #endif /* ALLOW_AUTODIFF */
371 jmc 1.72
372 adcroft 1.3 IF (calc_fluxes_X) THEN
373    
374 jmc 1.30 C- Do not compute fluxes if
375 jmc 1.41 C a) needed in overlap only
376 jmc 1.30 C and b) the overlap of myTile are not cube-face Edges
377     IF ( .NOT.overlapOnly .OR. N_edge .OR. S_edge ) THEN
378    
379     C- Internal exchange for calculations in X
380 jmc 1.55 IF ( overlapOnly ) THEN
381 jmc 1.58 CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
382 jmc 1.50 & localTij, bi,bj, myThid )
383 jmc 1.30 ENDIF
384 adcroft 1.3
385 jmc 1.72 C- Advective flux in X
386 jmc 1.74 #ifndef ALLOW_AUTODIFF
387 jmc 1.72 DO j=1-OLy,sNy+OLy
388     DO i=1-OLx,sNx+OLx
389     af(i,j) = 0.
390     ENDDO
391     ENDDO
392 jmc 1.74 #else /* ALLOW_AUTODIFF */
393 heimbach 1.39 # ifndef DISABLE_MULTIDIM_ADVECTION
394 jmc 1.55 CADJ STORE localTij(:,:) =
395 heimbach 1.59 CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
396 heimbach 1.39 # endif
397 jmc 1.74 #endif /* ALLOW_AUTODIFF */
398 heimbach 1.6
399 jmc 1.37 IF ( advectionScheme.EQ.ENUM_UPWIND_1RST
400     & .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
401 jmc 1.71 CALL GAD_DST2U1_ADV_X( bi,bj,k, advectionScheme, .TRUE.,
402 jmc 1.73 I deltaTLev(k),uTrans,uFld(1-OLx,1-OLy,k), localTij,
403     O af, myThid )
404 jmc 1.37 ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
405 jahn 1.61 CALL GAD_FLUXLIMIT_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
406 jmc 1.73 I uTrans, uFld(1-OLx,1-OLy,k), maskLocW, localTij,
407     O af, myThid )
408 jmc 1.30 ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN
409 jahn 1.61 CALL GAD_DST3_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
410 jmc 1.73 I uTrans, uFld(1-OLx,1-OLy,k), maskLocW, localTij,
411     O af, myThid )
412 jmc 1.30 ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
413 jahn 1.61 CALL GAD_DST3FL_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
414 jmc 1.73 I uTrans, uFld(1-OLx,1-OLy,k), maskLocW, localTij,
415     O af, myThid )
416 jmc 1.74 #ifndef ALLOW_AUTODIFF
417 adcroft 1.46 ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN
418 jahn 1.61 CALL GAD_OS7MP_ADV_X( bi,bj,k, .TRUE., deltaTLev(k),
419 jmc 1.73 I uTrans, uFld(1-OLx,1-OLy,k), maskLocW, localTij,
420     O af, myThid )
421 jmc 1.47 #endif
422 jmc 1.30 ELSE
423     STOP 'GAD_ADVECTION: adv. scheme incompatibale with multi-dim'
424     ENDIF
425    
426 jmc 1.71 #ifdef ALLOW_OBCS
427     IF ( useOBCS ) THEN
428     C- replace advective flux with 1st order upwind scheme estimate
429     CALL OBCS_U1_ADV_TRACER( .TRUE., trIdentity, bi, bj, k,
430     I maskLocW, uTrans, localTij,
431     U af, myThid )
432     ENDIF
433     #endif /* ALLOW_OBCS */
434    
435 jmc 1.30 C- Internal exchange for next calculations in Y
436 jmc 1.55 IF ( overlapOnly .AND. ipass.EQ.1 ) THEN
437 jmc 1.58 CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
438 jmc 1.50 & localTij, bi,bj, myThid )
439 jmc 1.55 ENDIF
440    
441     C- Advective flux in X : done
442 jmc 1.30 ENDIF
443    
444     C- Update the local tracer field where needed:
445 jmc 1.63 C use "maksInC" to prevent updating tracer field in OB regions
446 jmc 1.72 #ifdef ALLOW_AUTODIFF_TAMC
447     # ifdef GAD_MULTIDIM_COMPRESSIBLE
448     CADJ STORE localVol(:,:) =
449     CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
450     CADJ STORE localTij(:,:) =
451     CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
452     # endif
453     #endif /* ALLOW_AUTODIFF_TAMC */
454 jmc 1.30
455     C update in overlap-Only
456     IF ( overlapOnly ) THEN
457 jmc 1.71 iMinUpd = 1-OLx+1
458     iMaxUpd = sNx+OLx-1
459 jmc 1.41 C- notes: these 2 lines below have no real effect (because recip_hFac=0
460 jmc 1.30 C in corner region) but safer to keep them.
461     IF ( W_edge ) iMinUpd = 1
462     IF ( E_edge ) iMaxUpd = sNx
463    
464     IF ( S_edge ) THEN
465 jmc 1.71 DO j=1-OLy,0
466 jmc 1.30 DO i=iMinUpd,iMaxUpd
467 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
468     tmpTrac = localTij(i,j)*localVol(i,j)
469     & -deltaTLev(k)*( af(i+1,j) - af(i,j) )
470     & *maskInC(i,j,bi,bj)
471     localVol(i,j) = localVol(i,j)
472     & -deltaTLev(k)*( uTrans(i+1,j) - uTrans(i,j) )
473     & *maskInC(i,j,bi,bj)
474     localTij(i,j) = tmpTrac/localVol(i,j)
475     #else /* GAD_MULTIDIM_COMPRESSIBLE */
476 jmc 1.43 localTij(i,j) = localTij(i,j)
477 jahn 1.61 & -deltaTLev(k)*recip_rhoFacC(k)
478 jmc 1.43 & *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
479     & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
480 jmc 1.30 & *( af(i+1,j)-af(i,j)
481     & -tracer(i,j,k,bi,bj)*(uTrans(i+1,j)-uTrans(i,j))
482 jmc 1.63 & )*maskInC(i,j,bi,bj)
483 jmc 1.72 #endif /* GAD_MULTIDIM_COMPRESSIBLE */
484 jmc 1.30 ENDDO
485     ENDDO
486     ENDIF
487     IF ( N_edge ) THEN
488 jmc 1.71 DO j=sNy+1,sNy+OLy
489 jmc 1.30 DO i=iMinUpd,iMaxUpd
490 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
491     tmpTrac = localTij(i,j)*localVol(i,j)
492     & -deltaTLev(k)*( af(i+1,j) - af(i,j) )
493     & *maskInC(i,j,bi,bj)
494     localVol(i,j) = localVol(i,j)
495     & -deltaTLev(k)*( uTrans(i+1,j) - uTrans(i,j) )
496     & *maskInC(i,j,bi,bj)
497     localTij(i,j) = tmpTrac/localVol(i,j)
498     #else /* GAD_MULTIDIM_COMPRESSIBLE */
499 jmc 1.43 localTij(i,j) = localTij(i,j)
500 jahn 1.61 & -deltaTLev(k)*recip_rhoFacC(k)
501 jmc 1.43 & *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
502     & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
503 jmc 1.30 & *( af(i+1,j)-af(i,j)
504     & -tracer(i,j,k,bi,bj)*(uTrans(i+1,j)-uTrans(i,j))
505 jmc 1.63 & )*maskInC(i,j,bi,bj)
506 jmc 1.72 #endif /* GAD_MULTIDIM_COMPRESSIBLE */
507 jmc 1.30 ENDDO
508     ENDDO
509     ENDIF
510 heimbach 1.6
511 jmc 1.30 ELSE
512     C do not only update the overlap
513 jmc 1.71 jMinUpd = 1-OLy
514     jMaxUpd = sNy+OLy
515 jmc 1.30 IF ( interiorOnly .AND. S_edge ) jMinUpd = 1
516     IF ( interiorOnly .AND. N_edge ) jMaxUpd = sNy
517     DO j=jMinUpd,jMaxUpd
518 jmc 1.71 DO i=1-OLx+1,sNx+OLx-1
519 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
520     tmpTrac = localTij(i,j)*localVol(i,j)
521     & -deltaTLev(k)*( af(i+1,j) - af(i,j) )
522     & *maskInC(i,j,bi,bj)
523     localVol(i,j) = localVol(i,j)
524     & -deltaTLev(k)*( uTrans(i+1,j) - uTrans(i,j) )
525     & *maskInC(i,j,bi,bj)
526     localTij(i,j) = tmpTrac/localVol(i,j)
527     #else /* GAD_MULTIDIM_COMPRESSIBLE */
528 jmc 1.43 localTij(i,j) = localTij(i,j)
529 jahn 1.61 & -deltaTLev(k)*recip_rhoFacC(k)
530 jmc 1.43 & *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
531     & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
532 jmc 1.30 & *( af(i+1,j)-af(i,j)
533     & -tracer(i,j,k,bi,bj)*(uTrans(i+1,j)-uTrans(i,j))
534 jmc 1.63 & )*maskInC(i,j,bi,bj)
535 jmc 1.72 #endif /* GAD_MULTIDIM_COMPRESSIBLE */
536 jmc 1.30 ENDDO
537     ENDDO
538     C- keep advective flux (for diagnostics)
539 jmc 1.71 DO j=1-OLy,sNy+OLy
540     DO i=1-OLx,sNx+OLx
541 jmc 1.30 afx(i,j) = af(i,j)
542     ENDDO
543     ENDDO
544 adcroft 1.1
545 jmc 1.30 C- end if/else update overlap-Only
546     ENDIF
547 jmc 1.41
548 adcroft 1.3 C-- End of X direction
549     ENDIF
550    
551 jmc 1.29 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
552 adcroft 1.3 C-- Y direction
553 jmc 1.72
554 jmc 1.74 #ifdef ALLOW_AUTODIFF
555 jmc 1.72 C- Always reset advective flux in Y
556 jmc 1.71 DO j=1-OLy,sNy+OLy
557     DO i=1-OLx,sNx+OLx
558 heimbach 1.39 af(i,j) = 0.
559     ENDDO
560     ENDDO
561 heimbach 1.40 # ifndef DISABLE_MULTIDIM_ADVECTION
562 jmc 1.55 CADJ STORE localTij(:,:) =
563 heimbach 1.59 CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
564 jmc 1.55 CADJ STORE af(:,:) =
565 heimbach 1.59 CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
566 heimbach 1.40 # endif
567 jmc 1.74 #endif /* ALLOW_AUTODIFF */
568 jmc 1.72
569 adcroft 1.3 IF (calc_fluxes_Y) THEN
570    
571 jmc 1.30 C- Do not compute fluxes if
572     C a) needed in overlap only
573     C and b) the overlap of myTile are not cube-face edges
574     IF ( .NOT.overlapOnly .OR. E_edge .OR. W_edge ) THEN
575    
576     C- Internal exchange for calculations in Y
577 jmc 1.55 IF ( overlapOnly ) THEN
578 jmc 1.58 CALL FILL_CS_CORNER_TR_RL( 2, .FALSE.,
579 jmc 1.50 & localTij, bi,bj, myThid )
580 jmc 1.30 ENDIF
581 adcroft 1.3
582 jmc 1.30 C- Advective flux in Y
583 jmc 1.74 #ifndef ALLOW_AUTODIFF
584 jmc 1.71 DO j=1-OLy,sNy+OLy
585     DO i=1-OLx,sNx+OLx
586 jmc 1.30 af(i,j) = 0.
587     ENDDO
588     ENDDO
589 jmc 1.74 #else /* ALLOW_AUTODIFF */
590 adcroft 1.7 #ifndef DISABLE_MULTIDIM_ADVECTION
591 jmc 1.55 CADJ STORE localTij(:,:) =
592 heimbach 1.59 CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
593 heimbach 1.6 #endif
594 jmc 1.74 #endif /* ALLOW_AUTODIFF */
595 heimbach 1.6
596 jmc 1.37 IF ( advectionScheme.EQ.ENUM_UPWIND_1RST
597     & .OR. advectionScheme.EQ.ENUM_DST2 ) THEN
598 jmc 1.71 CALL GAD_DST2U1_ADV_Y( bi,bj,k, advectionScheme, .TRUE.,
599 jmc 1.73 I deltaTLev(k),vTrans,vFld(1-OLx,1-OLy,k), localTij,
600     O af, myThid )
601 jmc 1.37 ELSEIF (advectionScheme.EQ.ENUM_FLUX_LIMIT) THEN
602 jahn 1.61 CALL GAD_FLUXLIMIT_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
603 jmc 1.73 I vTrans, vFld(1-OLx,1-OLy,k), maskLocS, localTij,
604     O af, myThid )
605 jmc 1.30 ELSEIF (advectionScheme.EQ.ENUM_DST3 ) THEN
606 jahn 1.61 CALL GAD_DST3_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
607 jmc 1.73 I vTrans, vFld(1-OLx,1-OLy,k), maskLocS, localTij,
608     O af, myThid )
609 jmc 1.30 ELSEIF (advectionScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
610 jahn 1.61 CALL GAD_DST3FL_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
611 jmc 1.73 I vTrans, vFld(1-OLx,1-OLy,k), maskLocS, localTij,
612     O af, myThid )
613 jmc 1.74 #ifndef ALLOW_AUTODIFF
614 adcroft 1.46 ELSEIF (advectionScheme.EQ.ENUM_OS7MP ) THEN
615 jahn 1.61 CALL GAD_OS7MP_ADV_Y( bi,bj,k, .TRUE., deltaTLev(k),
616 jmc 1.73 I vTrans, vFld(1-OLx,1-OLy,k), maskLocS, localTij,
617     O af, myThid )
618 jmc 1.47 #endif
619 jmc 1.30 ELSE
620     STOP 'GAD_ADVECTION: adv. scheme incompatibale with mutli-dim'
621     ENDIF
622    
623 jmc 1.71 #ifdef ALLOW_OBCS
624     IF ( useOBCS ) THEN
625     C- replace advective flux with 1st order upwind scheme estimate
626     CALL OBCS_U1_ADV_TRACER( .FALSE., trIdentity, bi, bj, k,
627     I maskLocS, vTrans, localTij,
628     U af, myThid )
629     ENDIF
630     #endif /* ALLOW_OBCS */
631    
632 jmc 1.30 C- Internal exchange for next calculations in X
633 jmc 1.56 IF ( overlapOnly .AND. ipass.EQ.1 ) THEN
634 jmc 1.58 CALL FILL_CS_CORNER_TR_RL( 1, .FALSE.,
635 jmc 1.50 & localTij, bi,bj, myThid )
636 jmc 1.56 ENDIF
637 jmc 1.55
638     C- Advective flux in Y : done
639     ENDIF
640 jmc 1.30
641     C- Update the local tracer field where needed:
642 jmc 1.63 C use "maksInC" to prevent updating tracer field in OB regions
643 jmc 1.72 #ifdef ALLOW_AUTODIFF_TAMC
644     # ifdef GAD_MULTIDIM_COMPRESSIBLE
645     CADJ STORE localVol(:,:) =
646     CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
647     CADJ STORE localTij(:,:) =
648     CADJ & comlev1_bibj_k_gad_pass, key=passkey, kind=isbyte
649     # endif
650     #endif /* ALLOW_AUTODIFF_TAMC */
651 jmc 1.30
652     C update in overlap-Only
653     IF ( overlapOnly ) THEN
654 jmc 1.71 jMinUpd = 1-OLy+1
655     jMaxUpd = sNy+OLy-1
656 jmc 1.41 C- notes: these 2 lines below have no real effect (because recip_hFac=0
657 jmc 1.30 C in corner region) but safer to keep them.
658     IF ( S_edge ) jMinUpd = 1
659     IF ( N_edge ) jMaxUpd = sNy
660    
661     IF ( W_edge ) THEN
662     DO j=jMinUpd,jMaxUpd
663 jmc 1.71 DO i=1-OLx,0
664 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
665     tmpTrac = localTij(i,j)*localVol(i,j)
666     & -deltaTLev(k)*( af(i,j+1) - af(i,j) )
667     & *maskInC(i,j,bi,bj)
668     localVol(i,j) = localVol(i,j)
669     & -deltaTLev(k)*( vTrans(i,j+1) - vTrans(i,j) )
670     & *maskInC(i,j,bi,bj)
671     localTij(i,j) = tmpTrac/localVol(i,j)
672     #else /* GAD_MULTIDIM_COMPRESSIBLE */
673 jmc 1.43 localTij(i,j) = localTij(i,j)
674 jahn 1.61 & -deltaTLev(k)*recip_rhoFacC(k)
675 jmc 1.43 & *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
676     & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
677 jmc 1.30 & *( af(i,j+1)-af(i,j)
678     & -tracer(i,j,k,bi,bj)*(vTrans(i,j+1)-vTrans(i,j))
679 jmc 1.63 & )*maskInC(i,j,bi,bj)
680 jmc 1.72 #endif /* GAD_MULTIDIM_COMPRESSIBLE */
681 jmc 1.30 ENDDO
682     ENDDO
683     ENDIF
684     IF ( E_edge ) THEN
685     DO j=jMinUpd,jMaxUpd
686 jmc 1.71 DO i=sNx+1,sNx+OLx
687 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
688     tmpTrac = localTij(i,j)*localVol(i,j)
689     & -deltaTLev(k)*( af(i,j+1) - af(i,j) )
690     & *maskInC(i,j,bi,bj)
691     localVol(i,j) = localVol(i,j)
692     & -deltaTLev(k)*( vTrans(i,j+1) - vTrans(i,j) )
693     & *maskInC(i,j,bi,bj)
694     localTij(i,j) = tmpTrac/localVol(i,j)
695     #else /* GAD_MULTIDIM_COMPRESSIBLE */
696 jmc 1.43 localTij(i,j) = localTij(i,j)
697 jahn 1.61 & -deltaTLev(k)*recip_rhoFacC(k)
698 jmc 1.43 & *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
699     & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
700 jmc 1.30 & *( af(i,j+1)-af(i,j)
701     & -tracer(i,j,k,bi,bj)*(vTrans(i,j+1)-vTrans(i,j))
702 jmc 1.63 & )*maskInC(i,j,bi,bj)
703 jmc 1.72 #endif /* GAD_MULTIDIM_COMPRESSIBLE */
704 jmc 1.30 ENDDO
705     ENDDO
706     ENDIF
707 heimbach 1.6
708 jmc 1.30 ELSE
709     C do not only update the overlap
710 jmc 1.71 iMinUpd = 1-OLx
711     iMaxUpd = sNx+OLx
712 jmc 1.30 IF ( interiorOnly .AND. W_edge ) iMinUpd = 1
713     IF ( interiorOnly .AND. E_edge ) iMaxUpd = sNx
714 jmc 1.71 DO j=1-OLy+1,sNy+OLy-1
715 jmc 1.30 DO i=iMinUpd,iMaxUpd
716 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
717     tmpTrac = localTij(i,j)*localVol(i,j)
718     & -deltaTLev(k)*( af(i,j+1) - af(i,j) )
719     & *maskInC(i,j,bi,bj)
720     localVol(i,j) = localVol(i,j)
721     & -deltaTLev(k)*( vTrans(i,j+1) - vTrans(i,j) )
722     & *maskInC(i,j,bi,bj)
723     localTij(i,j) = tmpTrac/localVol(i,j)
724     #else /* GAD_MULTIDIM_COMPRESSIBLE */
725 jmc 1.43 localTij(i,j) = localTij(i,j)
726 jahn 1.61 & -deltaTLev(k)*recip_rhoFacC(k)
727 jmc 1.43 & *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
728     & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
729 jmc 1.30 & *( af(i,j+1)-af(i,j)
730     & -tracer(i,j,k,bi,bj)*(vTrans(i,j+1)-vTrans(i,j))
731 jmc 1.63 & )*maskInC(i,j,bi,bj)
732 jmc 1.72 #endif /* GAD_MULTIDIM_COMPRESSIBLE */
733 jmc 1.30 ENDDO
734     ENDDO
735     C- keep advective flux (for diagnostics)
736 jmc 1.71 DO j=1-OLy,sNy+OLy
737     DO i=1-OLx,sNx+OLx
738 jmc 1.30 afy(i,j) = af(i,j)
739     ENDDO
740     ENDDO
741 adcroft 1.3
742 jmc 1.30 C end if/else update overlap-Only
743     ENDIF
744    
745 adcroft 1.3 C-- End of Y direction
746     ENDIF
747    
748 jmc 1.18 C-- End of ipass loop
749 adcroft 1.1 ENDDO
750    
751 jmc 1.18 IF ( implicitAdvection ) THEN
752     C- explicit advection is done ; store tendency in gTracer:
753 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
754     STOP 'GAD_ADVECTION: missing code for implicitAdvection'
755     #endif /* GAD_MULTIDIM_COMPRESSIBLE */
756 jmc 1.71 DO j=1-OLy,sNy+OLy
757     DO i=1-OLx,sNx+OLx
758 jmc 1.18 gTracer(i,j,k,bi,bj)=
759 jahn 1.61 & (localTij(i,j)-tracer(i,j,k,bi,bj))/deltaTLev(k)
760 jmc 1.18 ENDDO
761     ENDDO
762     ELSE
763     C- horizontal advection done; store intermediate result in 3D array:
764 jmc 1.71 DO j=1-OLy,sNy+OLy
765     DO i=1-OLx,sNx+OLx
766 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
767     locVol3d(i,j,k) = localVol(i,j)
768     #endif /* GAD_MULTIDIM_COMPRESSIBLE */
769     localT3d(i,j,k) = localTij(i,j)
770 jmc 1.43 ENDDO
771 jmc 1.18 ENDDO
772     ENDIF
773 adcroft 1.1
774 jmc 1.33 #ifdef ALLOW_DIAGNOSTICS
775 jmc 1.57 IF ( doDiagAdvX ) THEN
776 jmc 1.33 diagName = 'ADVx'//diagSufx
777 jmc 1.71 CALL DIAGNOSTICS_FILL( afx, diagName, k,1, 2,bi,bj, myThid )
778 jmc 1.57 ENDIF
779     IF ( doDiagAdvY ) THEN
780 jmc 1.33 diagName = 'ADVy'//diagSufx
781 jmc 1.71 CALL DIAGNOSTICS_FILL( afy, diagName, k,1, 2,bi,bj, myThid )
782 jmc 1.33 ENDIF
783 jmc 1.72 #endif /* ALLOW_DIAGNOSTICS */
784 jmc 1.33
785 jmc 1.29 #ifdef ALLOW_DEBUG
786 jmc 1.66 IF ( debugLevel .GE. debLevC
787 jmc 1.71 & .AND. trIdentity.EQ.GAD_TEMPERATURE
788 jmc 1.30 & .AND. k.LE.3 .AND. myIter.EQ.1+nIter0
789 jmc 1.29 & .AND. nPx.EQ.1 .AND. nPy.EQ.1
790     & .AND. useCubedSphereExchange ) THEN
791     CALL DEBUG_CS_CORNER_UV( ' afx,afy from GAD_ADVECTION',
792     & afx,afy, k, standardMessageUnit,bi,bj,myThid )
793     ENDIF
794     #endif /* ALLOW_DEBUG */
795    
796 adcroft 1.1 C-- End of K loop for horizontal fluxes
797     ENDDO
798    
799 jmc 1.29 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
800    
801 jmc 1.18 IF ( .NOT.implicitAdvection ) THEN
802 adcroft 1.1 C-- Start of k loop for vertical flux
803 jmc 1.18 DO k=Nr,1,-1
804 jmc 1.55 #ifdef ALLOW_AUTODIFF_TAMC
805 heimbach 1.51 kkey = (igadkey-1)*Nr + (Nr-k+1)
806 heimbach 1.6 #endif /* ALLOW_AUTODIFF_TAMC */
807 jmc 1.41 C-- kUp Cycles through 1,2 to point to w-layer above
808 adcroft 1.1 C-- kDown Cycles through 2,1 to point to w-layer below
809 jmc 1.41 kUp = 1+MOD(k+1,2)
810 jmc 1.18 kDown= 1+MOD(k,2)
811     kp1Msk=1.
812 jmc 1.73 IF (k.EQ.Nr) kp1Msk=0.
813 heimbach 1.6
814 jmc 1.55 #ifdef ALLOW_AUTODIFF_TAMC
815     CADJ STORE rtrans(:,:) =
816 heimbach 1.59 CADJ & comlev1_bibj_k_gad, key=kkey, kind=isbyte
817 heimbach 1.51 #endif
818    
819 jmc 1.11 C-- Compute Vertical transport
820 jmc 1.22 #ifdef ALLOW_AIM
821     C- a hack to prevent Water-Vapor vert.transport into the stratospheric level Nr
822     IF ( k.EQ.1 .OR.
823 jmc 1.71 & (useAIM .AND. trIdentity.EQ.GAD_SALINITY .AND. k.EQ.Nr)
824 jmc 1.22 & ) THEN
825     #else
826     IF ( k.EQ.1 ) THEN
827     #endif
828 jmc 1.11
829     C- Surface interface :
830 jmc 1.71 DO j=1-OLy,sNy+OLy
831     DO i=1-OLx,sNx+OLx
832 jmc 1.72 rTransKp(i,j) = kp1Msk*rTrans(i,j)
833 jmc 1.18 rTrans(i,j) = 0.
834     fVerT(i,j,kUp) = 0.
835     ENDDO
836     ENDDO
837 jmc 1.11
838 jmc 1.18 ELSE
839 heimbach 1.42
840 jmc 1.18 C- Interior interface :
841 jmc 1.71 DO j=1-OLy,sNy+OLy
842     DO i=1-OLx,sNx+OLx
843 jmc 1.72 rTransKp(i,j) = kp1Msk*rTrans(i,j)
844 jmc 1.73 rTrans(i,j) = wFld(i,j,k)*rA(i,j,bi,bj)
845 jmc 1.43 & *deepFac2F(k)*rhoFacF(k)
846 jmc 1.18 & *maskC(i,j,k-1,bi,bj)
847 jmc 1.29 fVerT(i,j,kUp) = 0.
848 jmc 1.18 ENDDO
849     ENDDO
850 jmc 1.11
851 jmc 1.55 #ifdef ALLOW_AUTODIFF_TAMC
852 jmc 1.72 cphmultiCADJ STORE localT3d(:,:,k)
853 heimbach 1.59 cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte
854 jmc 1.55 cphmultiCADJ STORE rTrans(:,:)
855 heimbach 1.59 cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte
856 heimbach 1.16 #endif /* ALLOW_AUTODIFF_TAMC */
857    
858 adcroft 1.1 C- Compute vertical advective flux in the interior:
859 jmc 1.45 IF ( vertAdvecScheme.EQ.ENUM_UPWIND_1RST
860     & .OR. vertAdvecScheme.EQ.ENUM_DST2 ) THEN
861 jmc 1.71 CALL GAD_DST2U1_ADV_R( bi,bj,k, advectionScheme,
862 jmc 1.73 I deltaTLev(k),rTrans,wFld(1-OLx,1-OLy,k),localT3d,
863     O fVerT(1-OLx,1-OLy,kUp), myThid )
864 jmc 1.45 ELSEIF( vertAdvecScheme.EQ.ENUM_FLUX_LIMIT) THEN
865 jahn 1.61 CALL GAD_FLUXLIMIT_ADV_R( bi,bj,k, deltaTLev(k),
866 jmc 1.73 I rTrans, wFld(1-OLx,1-OLy,k), localT3d,
867     O fVerT(1-OLx,1-OLy,kUp), myThid )
868 jmc 1.45 ELSEIF( vertAdvecScheme.EQ.ENUM_DST3 ) THEN
869 jahn 1.61 CALL GAD_DST3_ADV_R( bi,bj,k, deltaTLev(k),
870 jmc 1.73 I rTrans, wFld(1-OLx,1-OLy,k), localT3d,
871     O fVerT(1-OLx,1-OLy,kUp), myThid )
872 jmc 1.45 ELSEIF( vertAdvecScheme.EQ.ENUM_DST3_FLUX_LIMIT ) THEN
873 jahn 1.61 CALL GAD_DST3FL_ADV_R( bi,bj,k, deltaTLev(k),
874 jmc 1.73 I rTrans, wFld(1-OLx,1-OLy,k), localT3d,
875     O fVerT(1-OLx,1-OLy,kUp), myThid )
876 jmc 1.74 #ifndef ALLOW_AUTODIFF
877 adcroft 1.46 ELSEIF (vertAdvecScheme.EQ.ENUM_OS7MP ) THEN
878 jahn 1.61 CALL GAD_OS7MP_ADV_R( bi,bj,k, deltaTLev(k),
879 jmc 1.73 I rTrans, wFld(1-OLx,1-OLy,k), localT3d,
880     O fVerT(1-OLx,1-OLy,kUp), myThid )
881 jmc 1.47 #endif
882 jmc 1.18 ELSE
883     STOP 'GAD_ADVECTION: adv. scheme incompatibale with mutli-dim'
884     ENDIF
885 jmc 1.11
886     C- end Surface/Interior if bloc
887 jmc 1.18 ENDIF
888 heimbach 1.16
889 jmc 1.55 #ifdef ALLOW_AUTODIFF_TAMC
890     cphmultiCADJ STORE rTrans(:,:)
891 heimbach 1.59 cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte
892 jmc 1.72 cphmultiCADJ STORE rTranskp(:,:)
893 heimbach 1.59 cphmultiCADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte
894 heimbach 1.53 cph --- following storing of fVerT is critical for correct
895     cph --- gradient with multiDimAdvection
896     cph --- Without it, kDown component is not properly recomputed
897     cph --- This is a TAF bug (and no warning available)
898 jmc 1.55 CADJ STORE fVerT(:,:,:)
899 heimbach 1.59 CADJ & = comlev1_bibj_k_gad, key=kkey, kind=isbyte
900 heimbach 1.16 #endif /* ALLOW_AUTODIFF_TAMC */
901 adcroft 1.1
902 jmc 1.18 C-- Divergence of vertical fluxes
903 jmc 1.72 #ifdef GAD_MULTIDIM_COMPRESSIBLE
904 jmc 1.71 DO j=1-OLy,sNy+OLy
905     DO i=1-OLx,sNx+OLx
906 jmc 1.72 tmpTrac = localT3d(i,j,k)*locVol3d(i,j,k)
907     & -deltaTLev(k)*( fVerT(i,j,kDown)-fVerT(i,j,kUp) )
908     & *rkSign*maskInC(i,j,bi,bj)
909     localVol(i,j) = locVol3d(i,j,k)
910     & -deltaTLev(k)*( rTransKp(i,j) - rTrans(i,j) )
911     & *rkSign*maskInC(i,j,bi,bj)
912     C- localTij only needed for Variance Bugget: can be move there
913     localTij(i,j) = tmpTrac/localVol(i,j)
914     C-- without rescaling of tendencies:
915     c gTracer(i,j,k,bi,bj)=
916     c & (localTij(i,j)-tracer(i,j,k,bi,bj))/deltaTLev(k)
917     C-- Non-Lin Free-Surf: consistent with rescaling of tendencies
918     C (in FREESURF_RESCALE_G) and RealFreshFlux/addMass.
919     C Also valid for linear Free-Surf (r & r* coords) w/wout RealFreshFlux
920     C and consistent with linFSConserveTr and "surfExpan_" monitor.
921     gTracer(i,j,k,bi,bj) =
922     & ( tmpTrac - tracer(i,j,k,bi,bj)*localVol(i,j) )
923     & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
924     & *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
925     & *recip_rhoFacC(k)
926     & /deltaTLev(k)
927     ENDDO
928     ENDDO
929     #else /* GAD_MULTIDIM_COMPRESSIBLE */
930     DO j=1-OLy,sNy+OLy
931     DO i=1-OLx,sNx+OLx
932     localTij(i,j) = localT3d(i,j,k)
933 jahn 1.61 & -deltaTLev(k)*recip_rhoFacC(k)
934 jmc 1.43 & *_recip_hFacC(i,j,k,bi,bj)*recip_drF(k)
935     & *recip_rA(i,j,bi,bj)*recip_deepFac2C(k)
936     & *( fVerT(i,j,kDown)-fVerT(i,j,kUp)
937 jmc 1.72 & -tracer(i,j,k,bi,bj)*(rTransKp(i,j)-rTrans(i,j))
938 mlosch 1.70 & )*rkSign*maskInC(i,j,bi,bj)
939 jmc 1.18 gTracer(i,j,k,bi,bj)=
940 jahn 1.61 & (localTij(i,j)-tracer(i,j,k,bi,bj))/deltaTLev(k)
941 jmc 1.18 ENDDO
942     ENDDO
943 jmc 1.72 #endif /* GAD_MULTIDIM_COMPRESSIBLE */
944 jmc 1.41
945 jmc 1.33 #ifdef ALLOW_DIAGNOSTICS
946 jmc 1.57 IF ( doDiagAdvR ) THEN
947 jmc 1.33 diagName = 'ADVr'//diagSufx
948 jmc 1.71 CALL DIAGNOSTICS_FILL( fVerT(1-OLx,1-OLy,kUp),
949     & diagName, k,1, 2,bi,bj, myThid )
950 jmc 1.33 ENDIF
951 jmc 1.72 #endif /* ALLOW_DIAGNOSTICS */
952 jmc 1.33
953 adcroft 1.1 C-- End of K loop for vertical flux
954 jmc 1.18 ENDDO
955     C-- end of if not.implicitAdvection block
956 jmc 1.41 ENDIF
957 adcroft 1.1
958     RETURN
959     END

  ViewVC Help
Powered by ViewVC 1.1.22