8 |
|
|
9 |
C !INTERFACE: ========================================================== |
C !INTERFACE: ========================================================== |
10 |
SUBROUTINE PTRACERS_INTEGRATE( |
SUBROUTINE PTRACERS_INTEGRATE( |
11 |
I bi, bj, |
I bi, bj, recip_hFac, |
12 |
I uFld, vFld, wFld, |
I uFld, vFld, wFld, |
13 |
U KappaRk, |
U KappaRk, |
14 |
I myTime, myIter, myThid ) |
I myTime, myIter, myThid ) |
23 |
#include "SIZE.h" |
#include "SIZE.h" |
24 |
#include "EEPARAMS.h" |
#include "EEPARAMS.h" |
25 |
#include "PARAMS.h" |
#include "PARAMS.h" |
26 |
|
#include "GRID.h" |
27 |
#ifdef ALLOW_LONGSTEP |
#ifdef ALLOW_LONGSTEP |
28 |
#include "LONGSTEP_PARAMS.h" |
#include "LONGSTEP_PARAMS.h" |
29 |
#endif |
#endif |
38 |
#endif |
#endif |
39 |
|
|
40 |
C !INPUT PARAMETERS: =================================================== |
C !INPUT PARAMETERS: =================================================== |
41 |
C bi, bj :: tile indices |
C bi, bj :: tile indices |
42 |
C uFld, vFld, wFld :: Local copy of velocity field (3 components) |
C recip_hFac :: reciprocal of cell open-depth factor (@ next iter) |
43 |
C KappaRk :: vertical diffusion used for one passive tracer |
C uFld, vFld, wFld :: Local copy of velocity field (3 components) |
44 |
C myTime :: model time |
C KappaRk :: vertical diffusion used for one passive tracer |
45 |
C myIter :: time-step number |
C myTime :: model time |
46 |
C myThid :: thread number |
C myIter :: time-step number |
47 |
|
C myThid :: thread number |
48 |
INTEGER bi, bj |
INTEGER bi, bj |
49 |
_RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
_RS recip_hFac(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
50 |
_RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
_RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
51 |
_RL wFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
_RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
52 |
_RL KappaRk (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
_RL wFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
53 |
|
_RL KappaRk (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr) |
54 |
_RL myTime |
_RL myTime |
55 |
INTEGER myIter |
INTEGER myIter |
56 |
INTEGER myThid |
INTEGER myThid |
61 |
#ifdef ALLOW_PTRACERS |
#ifdef ALLOW_PTRACERS |
62 |
|
|
63 |
C !LOCAL VARIABLES: ==================================================== |
C !LOCAL VARIABLES: ==================================================== |
64 |
C iTracer :: tracer index |
C iTracer :: tracer index |
65 |
C iMin,iMax,jMin,jMax :: loop ranges |
C iMin, iMax :: 1rst index loop range |
66 |
C k :: vertical level number |
C jMin, jMax :: 2nd index loop range |
67 |
C kUp,kDown :: toggle indices for even/odd level fluxes |
C k :: vertical level number |
68 |
C kM1 :: =min(1,k-1) |
C kUp,kDown :: toggle indices for even/odd level fluxes |
69 |
C GAD_TR :: passive tracer id (GAD_TR1+iTracer-1) |
C kM1 :: =min(1,k-1) |
70 |
C xA :: face area at U points in level k |
C GAD_TR :: passive tracer id (GAD_TR1+iTracer-1) |
71 |
C yA :: face area at V points in level k |
C xA :: face area at U points in level k |
72 |
C maskUp :: mask for vertical transport |
C yA :: face area at V points in level k |
73 |
C uTrans :: zonal transport in level k |
C maskUp :: mask for vertical transport |
74 |
C vTrans :: meridional transport in level k |
C uTrans :: zonal transport in level k |
75 |
C rTrans :: vertical volume transport at interface k |
C vTrans :: meridional transport in level k |
76 |
C rTransKp :: vertical volume transport at interface k+1 |
C rTrans :: vertical volume transport at interface k |
77 |
C fVerT :: passive tracer vertical flux |
C rTransKp :: vertical volume transport at interface k+1 |
78 |
|
C fZon :: passive tracer zonal flux |
79 |
|
C fMer :: passive tracer meridional flux |
80 |
|
C fVer :: passive tracer vertical flux |
81 |
|
C gTr_AB :: Adams-Bashforth tracer tendency increment |
82 |
INTEGER iTracer |
INTEGER iTracer |
83 |
INTEGER iMin,iMax,jMin,jMax |
INTEGER iMin,iMax,jMin,jMax |
84 |
INTEGER i, j, k |
INTEGER i, j, k |
91 |
_RL vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
92 |
_RL rTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL rTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
93 |
_RL rTransKp(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL rTransKp(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
94 |
_RL fVerT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2) |
_RL fZon (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
95 |
|
_RL fMer (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
96 |
|
_RL fVer (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2) |
97 |
_RL gTr_AB (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL gTr_AB (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
98 |
LOGICAL calcAdvection |
LOGICAL calcAdvection |
99 |
INTEGER iterNb |
INTEGER iterNb |
109 |
|
|
110 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
111 |
|
|
|
C- Loop ranges for daughter routines |
|
|
iMin = 1-OLx+2 |
|
|
iMax = sNx+OLx-1 |
|
|
jMin = 1-OLy+2 |
|
|
jMax = sNy+OLy-1 |
|
|
|
|
112 |
C- Compute iter at beginning of ptracer time step |
C- Compute iter at beginning of ptracer time step |
113 |
#ifdef ALLOW_LONGSTEP |
#ifdef ALLOW_LONGSTEP |
114 |
iterNb = myIter - LS_nIter + 1 |
iterNb = myIter - LS_nIter + 1 |
132 |
IF ( PTRACERS_StepFwd(iTracer) ) THEN |
IF ( PTRACERS_StepFwd(iTracer) ) THEN |
133 |
GAD_TR = GAD_TR1 + iTracer - 1 |
GAD_TR = GAD_TR1 + iTracer - 1 |
134 |
|
|
135 |
|
C- Loop ranges for daughter routines |
136 |
|
iMin = 1-OLx+2 |
137 |
|
iMax = sNx+OLx-1 |
138 |
|
jMin = 1-OLy+2 |
139 |
|
jMax = sNy+OLy-1 |
140 |
|
|
141 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
142 |
act0 = iTracer - 1 |
act0 = iTracer - 1 |
143 |
max0 = PTRACERS_num |
max0 = PTRACERS_num |
157 |
|
|
158 |
DO j=1-OLy,sNy+OLy |
DO j=1-OLy,sNy+OLy |
159 |
DO i=1-OLx,sNx+OLx |
DO i=1-OLx,sNx+OLx |
160 |
fVerT(i,j,1) = 0. _d 0 |
fVer(i,j,1) = 0. _d 0 |
161 |
fVerT(i,j,2) = 0. _d 0 |
fVer(i,j,2) = 0. _d 0 |
162 |
ENDDO |
ENDDO |
163 |
ENDDO |
ENDDO |
164 |
#ifdef ALLOW_AUTODIFF |
#ifdef ALLOW_AUTODIFF |
171 |
ENDDO |
ENDDO |
172 |
#endif /* ALLOW_AUTODIFF */ |
#endif /* ALLOW_AUTODIFF */ |
173 |
|
|
174 |
IF ( .NOT.implicitDiffusion ) THEN |
CALL CALC_3D_DIFFUSIVITY( |
|
CALL CALC_3D_DIFFUSIVITY( |
|
175 |
I bi, bj, iMin,iMax,jMin,jMax, |
I bi, bj, iMin,iMax,jMin,jMax, |
176 |
I GAD_TR, |
I GAD_TR, |
177 |
I PTRACERS_useGMRedi(iTracer), PTRACERS_useKPP(iTracer), |
I PTRACERS_useGMRedi(iTracer), PTRACERS_useKPP(iTracer), |
178 |
O kappaRk, |
O kappaRk, |
179 |
I myThid) |
I myThid) |
|
ENDIF |
|
180 |
|
|
181 |
#ifndef DISABLE_MULTIDIM_ADVECTION |
#ifndef DISABLE_MULTIDIM_ADVECTION |
182 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
193 |
I PTRACERS_ImplVertAdv(iTracer), |
I PTRACERS_ImplVertAdv(iTracer), |
194 |
I PTRACERS_advScheme(iTracer), |
I PTRACERS_advScheme(iTracer), |
195 |
I PTRACERS_advScheme(iTracer), |
I PTRACERS_advScheme(iTracer), |
196 |
I GAD_TR1+iTracer-1, |
I GAD_TR, |
197 |
I PTRACERS_dTLev, |
I PTRACERS_dTLev, uFld, vFld, wFld, |
|
I uFld, vFld, wFld, |
|
198 |
I pTracer(1-OLx,1-OLy,1,1,1,iTracer), |
I pTracer(1-OLx,1-OLy,1,1,1,iTracer), |
199 |
U _Ptracers_som(:,:,:,:,:,:,iTracer), |
U _Ptracers_som(:,:,:,:,:,:,iTracer), |
200 |
O gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
O gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
210 |
I PTRACERS_ImplVertAdv(iTracer), |
I PTRACERS_ImplVertAdv(iTracer), |
211 |
I PTRACERS_advScheme(iTracer), |
I PTRACERS_advScheme(iTracer), |
212 |
I PTRACERS_advScheme(iTracer), |
I PTRACERS_advScheme(iTracer), |
213 |
I GAD_TR1+iTracer-1, |
I GAD_TR, |
214 |
I PTRACERS_dTLev, |
I PTRACERS_dTLev, uFld, vFld, wFld, |
|
I uFld, vFld, wFld, |
|
215 |
I pTracer(1-OLx,1-OLy,1,1,1,iTracer), |
I pTracer(1-OLx,1-OLy,1,1,1,iTracer), |
216 |
O gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
O gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
217 |
I bi, bj, myTime, myIter, myThid ) |
I bi, bj, myTime, myIter, myThid ) |
230 |
kDown= 1+MOD(k,2) |
kDown= 1+MOD(k,2) |
231 |
|
|
232 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
233 |
CADJ STORE fVerT(:,:,:) = comlev1_bibj_k_ptracers, |
CADJ STORE fVer(:,:,:) = comlev1_bibj_k_ptracers, |
234 |
CADJ & key = kkey, byte = isbyte, kind = isbyte |
CADJ & key = kkey, byte = isbyte, kind = isbyte |
235 |
CADJ STORE gPtr(:,:,k,bi,bj,iTracer) = comlev1_bibj_k_ptracers, |
CADJ STORE gPtr(:,:,k,bi,bj,iTracer) = comlev1_bibj_k_ptracers, |
236 |
CADJ & key = kkey, byte = isbyte, kind = isbyte |
CADJ & key = kkey, byte = isbyte, kind = isbyte |
263 |
I .FALSE., .FALSE., |
I .FALSE., .FALSE., |
264 |
I PTRACERS_useGMRedi(iTracer), |
I PTRACERS_useGMRedi(iTracer), |
265 |
I PTRACERS_useKPP(iTracer), |
I PTRACERS_useKPP(iTracer), |
266 |
U fVerT, gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
O fZon, fMer, |
267 |
|
U fVer, gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
268 |
I myTime, myIter, myThid ) |
I myTime, myIter, myThid ) |
269 |
|
|
270 |
C- External forcing term(s) |
C- External forcing term(s) |
271 |
IF ( tracForcingOutAB.NE.1 ) |
IF ( tracForcingOutAB.NE.1 ) |
272 |
& CALL PTRACERS_FORCING( |
& CALL PTRACERS_APPLY_FORCING( |
273 |
I bi,bj,iMin,iMax,jMin,jMax,k,iTracer, |
U gPtr(1-OLx,1-OLy,k,bi,bj,iTracer), |
274 |
U gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
I surfaceForcingPTr(1-OLx,1-OLy,bi,bj,iTracer), |
275 |
I surfaceForcingPTr(1-OLx,1-OLy,1,1,iTracer), |
I iMin,iMax,jMin,jMax, k, bi, bj, |
276 |
I myIter, myTime, myThid ) |
I iTracer, myTime, myIter, myThid ) |
277 |
|
|
278 |
C- If using Adams-Bashforth II, then extrapolate tendencies |
C- If using Adams-Bashforth II, then extrapolate tendencies |
279 |
C gPtr is now the tracer tendency for explicit advection/diffusion |
C gPtr is now the tracer tendency for explicit advection/diffusion |
300 |
|
|
301 |
C- External forcing term(s) |
C- External forcing term(s) |
302 |
IF ( tracForcingOutAB.EQ.1 ) |
IF ( tracForcingOutAB.EQ.1 ) |
303 |
& CALL PTRACERS_FORCING( |
& CALL PTRACERS_APPLY_FORCING( |
304 |
I bi,bj,iMin,iMax,jMin,jMax,k,iTracer, |
U gPtr(1-OLx,1-OLy,k,bi,bj,iTracer), |
305 |
U gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
I surfaceForcingPTr(1-OLx,1-OLy,bi,bj,iTracer), |
306 |
I surfaceForcingPTr(1-OLx,1-OLy,1,1,iTracer), |
I iMin,iMax,jMin,jMax, k, bi, bj, |
307 |
I myIter, myTime, myThid ) |
I iTracer, myTime, myIter, myThid ) |
308 |
|
|
309 |
#ifdef NONLIN_FRSURF |
#ifdef NONLIN_FRSURF |
310 |
C- Account for change in level thickness |
C- Account for change in level thickness |
331 |
C- end of vertical index (k) loop (Nr:1) |
C- end of vertical index (k) loop (Nr:1) |
332 |
ENDDO |
ENDDO |
333 |
|
|
334 |
|
#ifdef ALLOW_DOWN_SLOPE |
335 |
|
IF ( PTRACERS_useDWNSLP(iTracer) ) THEN |
336 |
|
IF ( usingPCoords ) THEN |
337 |
|
CALL DWNSLP_APPLY( |
338 |
|
I GAD_TR, bi, bj, kSurfC, |
339 |
|
I recip_drF, recip_hFac, recip_rA, |
340 |
|
I PTRACERS_dTLev, |
341 |
|
I pTracer(1-OLx,1-OLy,1,1,1,iTracer), |
342 |
|
O gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
343 |
|
I myTime, myIter, myThid ) |
344 |
|
ELSE |
345 |
|
CALL DWNSLP_APPLY( |
346 |
|
I GAD_TR, bi, bj, kLowC, |
347 |
|
I recip_drF, recip_hFac, recip_rA, |
348 |
|
I PTRACERS_dTLev, |
349 |
|
I pTracer(1-OLx,1-OLy,1,1,1,iTracer), |
350 |
|
O gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
351 |
|
I myTime, myIter, myThid ) |
352 |
|
ENDIF |
353 |
|
ENDIF |
354 |
|
#endif /* ALLOW_DOWN_SLOPE */ |
355 |
|
|
356 |
|
C All explicit advection/diffusion/sources should now be |
357 |
|
C done. The updated tracer field is in gPtr. |
358 |
|
#ifdef ALLOW_MATRIX |
359 |
|
C Accumalate explicit tendency and also reset gPtr to initial |
360 |
|
C tracer field for implicit matrix calculation |
361 |
|
IF ( useMATRIX ) CALL MATRIX_STORE_TENDENCY_EXP( |
362 |
|
I iTracer, bi, bj, |
363 |
|
I myTime, myIter, myThid ) |
364 |
|
#endif /* ALLOW_MATRIX */ |
365 |
|
|
366 |
|
C-- Vertical advection & diffusion (implicit) for passive tracers |
367 |
|
iMin = 0 |
368 |
|
iMax = sNx+1 |
369 |
|
jMin = 0 |
370 |
|
jMax = sNy+1 |
371 |
|
|
372 |
|
#ifdef ALLOW_AUTODIFF_TAMC |
373 |
|
CADJ STORE gPtr(:,:,:,bi,bj,iTracer) = comlev1_bibj_ptracers, |
374 |
|
CADJ & key=iptrkey, byte=isbyte |
375 |
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
376 |
|
|
377 |
|
#ifdef INCLUDE_IMPLVERTADV_CODE |
378 |
|
IF ( PTRACERS_ImplVertAdv(iTracer) ) THEN |
379 |
|
CALL GAD_IMPLICIT_R( |
380 |
|
I PTRACERS_ImplVertAdv(iTracer), |
381 |
|
I PTRACERS_advScheme(iTracer), GAD_TR, |
382 |
|
I PTRACERS_dTLev, kappaRk, recip_hFac, wFld, |
383 |
|
I pTracer(1-OLx,1-OLy,1,1,1,iTracer), |
384 |
|
U gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
385 |
|
I bi, bj, myTime, myIter, myThid ) |
386 |
|
|
387 |
|
ELSEIF ( implicitDiffusion ) THEN |
388 |
|
#else /* INCLUDE_IMPLVERTADV_CODE */ |
389 |
|
IF ( implicitDiffusion ) THEN |
390 |
|
#endif /* INCLUDE_IMPLVERTADV_CODE */ |
391 |
|
CALL IMPLDIFF( |
392 |
|
I bi, bj, iMin, iMax, jMin, jMax, |
393 |
|
I GAD_TR, kappaRk, recip_hFac, |
394 |
|
U gPtr(1-OLx,1-OLy,1,1,1,iTracer), |
395 |
|
I myThid ) |
396 |
|
ENDIF |
397 |
|
|
398 |
|
#ifdef ALLOW_OBCS |
399 |
|
C-- Apply open boundary conditions for each passive tracer |
400 |
|
IF ( useOBCS ) THEN |
401 |
|
CALL OBCS_APPLY_PTRACER( |
402 |
|
I bi, bj, 0, iTracer, |
403 |
|
U gPtr(1-OLx,1-OLy,1,bi,bj,iTracer), |
404 |
|
I myThid ) |
405 |
|
ENDIF |
406 |
|
#endif /* ALLOW_OBCS */ |
407 |
|
|
408 |
C-- end of tracer loop |
C-- end of tracer loop |
409 |
ENDIF |
ENDIF |
410 |
ENDDO |
ENDDO |