25 |
#include "EEPARAMS.h" |
#include "EEPARAMS.h" |
26 |
#include "PARAMS.h" |
#include "PARAMS.h" |
27 |
#include "DYNVARS.h" |
#include "DYNVARS.h" |
28 |
|
#ifdef ALLOW_LONGSTEP |
29 |
|
#include "LONGSTEP_PARAMS.h" |
30 |
|
#endif |
31 |
#include "PTRACERS_SIZE.h" |
#include "PTRACERS_SIZE.h" |
32 |
#include "PTRACERS_PARAMS.h" |
#include "PTRACERS_PARAMS.h" |
33 |
#include "PTRACERS_RESTART.h" |
#include "PTRACERS_RESTART.h" |
88 |
INTEGER GAD_TR |
INTEGER GAD_TR |
89 |
LOGICAL calcAdvection |
LOGICAL calcAdvection |
90 |
INTEGER iterNb |
INTEGER iterNb |
91 |
|
_RL gTr_AB (1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
92 |
|
#ifdef ALLOW_DIAGNOSTICS |
93 |
|
CHARACTER*8 diagName |
94 |
|
CHARACTER*4 diagSufx |
95 |
|
C- Functions: |
96 |
|
CHARACTER*4 GAD_DIAG_SUFX |
97 |
|
EXTERNAL GAD_DIAG_SUFX |
98 |
|
#endif /* ALLOW_DIAGNOSTICS */ |
99 |
CEOP |
CEOP |
100 |
|
|
101 |
C Loop ranges for daughter routines |
C Loop ranges for daughter routines |
130 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
131 |
|
|
132 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
133 |
rFlx(1,1,kDown,iTracer) = rFlx(1,1,kDown,iTracer) |
rFlx(1,1,kDown,iTracer) = rFlx(1,1,kDown,iTracer) |
134 |
c |
c |
135 |
CADJ STORE pTracer(:,:,k,bi,bj,iTracer) |
CADJ STORE pTracer(:,:,k,bi,bj,iTracer) |
136 |
CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte |
CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte |
137 |
CADJ STORE gpTrNm1(:,:,k,bi,bj,iTracer) |
CADJ STORE gpTrNm1(:,:,k,bi,bj,iTracer) |
138 |
CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte |
CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte |
139 |
|
# ifdef NONLIN_FRSURF |
140 |
|
CADJ STORE gpTr(:,:,k,bi,bj,iTracer) |
141 |
|
CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte |
142 |
|
CADJ STORE rFlx(:,:,:,iTracer) |
143 |
|
CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte |
144 |
|
# endif |
145 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
146 |
|
|
147 |
C Calculate active tracer tendencies (gPtr) due to internal processes |
C Calculate active tracer tendencies (gPtr) due to internal processes |
157 |
I KappaRtr(1-Olx,1-Oly,iTracer), |
I KappaRtr(1-Olx,1-Oly,iTracer), |
158 |
I gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer), |
I gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer), |
159 |
I pTracer(1-Olx,1-Oly,1,1,1,iTracer), |
I pTracer(1-Olx,1-Oly,1,1,1,iTracer), |
160 |
I GAD_TR, |
I PTRACERS_dTLev, GAD_TR, |
161 |
I PTRACERS_advScheme(iTracer), |
I PTRACERS_advScheme(iTracer), |
162 |
I PTRACERS_advScheme(iTracer), |
I PTRACERS_advScheme(iTracer), |
163 |
I calcAdvection, PTRACERS_ImplVertAdv(iTracer), |
I calcAdvection, PTRACERS_ImplVertAdv(iTracer), |
178 |
|
|
179 |
C If using Adams-Bashforth II, then extrapolate tendencies |
C If using Adams-Bashforth II, then extrapolate tendencies |
180 |
C gPtr is now the tracer tendency for explicit advection/diffusion |
C gPtr is now the tracer tendency for explicit advection/diffusion |
|
IF ( PTRACERS_AdamsBashGtr(iTracer) ) THEN |
|
181 |
#ifdef ALLOW_MATRIX |
#ifdef ALLOW_MATRIX |
182 |
C If matrix is being computed, block call to S/R ADAMS_BASHFORTH2 to |
C If matrix is being computed, skip call to S/R ADAMS_BASHFORTH2 to |
183 |
C prevent gPtr from being replaced by the average of gPtr and gpTrNm1. |
C prevent gPtr from being replaced by the average of gPtr and gpTrNm1. |
184 |
IF (.NOT.useMATRIX) THEN |
IF ( .NOT.useMATRIX .AND. |
185 |
#endif |
& PTRACERS_AdamsBashGtr(iTracer) ) THEN |
186 |
|
#else /* ALLOW_MATRIX */ |
187 |
|
IF ( PTRACERS_AdamsBashGtr(iTracer) ) THEN |
188 |
|
#endif /* ALLOW_MATRIX */ |
189 |
|
C compute iter at beginning of ptracer time step |
190 |
|
#ifdef ALLOW_LONGSTEP |
191 |
|
iterNb = myIter - LS_nIter + 1 |
192 |
|
IF (LS_whenToSample.GE.2) iterNb = myIter - LS_nIter |
193 |
|
#else |
194 |
iterNb = myIter |
iterNb = myIter |
195 |
IF (staggerTimeStep) iterNb = myIter - 1 |
IF (staggerTimeStep) iterNb = myIter - 1 |
196 |
|
#endif |
197 |
CALL ADAMS_BASHFORTH2( |
CALL ADAMS_BASHFORTH2( |
198 |
I bi,bj,K, |
I bi,bj,k, |
199 |
U gPtr(1-Olx,1-Oly,1,1,1,iTracer), |
U gPtr(1-Olx,1-Oly,1,1,1,iTracer), |
200 |
U gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer), |
U gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer), |
201 |
|
U gTr_AB, |
202 |
I PTRACERS_startAB(iTracer), iterNb, myThid ) |
I PTRACERS_startAB(iTracer), iterNb, myThid ) |
203 |
#ifdef ALLOW_MATRIX |
#ifdef ALLOW_DIAGNOSTICS |
204 |
|
IF ( useDiagnostics ) THEN |
205 |
|
diagSufx = GAD_DIAG_SUFX( GAD_TR, myThid ) |
206 |
|
diagName = 'AB_g'//diagSufx |
207 |
|
CALL DIAGNOSTICS_FILL(gTr_AB,diagName,k,1,2,bi,bj,myThid) |
208 |
ENDIF |
ENDIF |
209 |
#endif |
#endif /* ALLOW_DIAGNOSTICS */ |
210 |
ENDIF |
ENDIF |
211 |
|
|
212 |
C External forcing term(s) |
C External forcing term(s) |
213 |
IF ( tracForcingOutAB.EQ.1 ) |
IF ( tracForcingOutAB.EQ.1 ) |
221 |
C Account for change in level thickness |
C Account for change in level thickness |
222 |
IF (nonlinFreeSurf.GT.0) THEN |
IF (nonlinFreeSurf.GT.0) THEN |
223 |
CALL FREESURF_RESCALE_G( |
CALL FREESURF_RESCALE_G( |
224 |
I bi,bj,K, |
I bi,bj,k, |
225 |
U gPtr(1-Olx,1-Oly,1,1,1,iTracer), |
U gPtr(1-Olx,1-Oly,1,1,1,iTracer), |
226 |
I myThid ) |
I myThid ) |
227 |
IF ( PTRACERS_AdamsBashGtr(iTracer) ) |
IF ( PTRACERS_AdamsBashGtr(iTracer) ) |
228 |
& CALL FREESURF_RESCALE_G( |
& CALL FREESURF_RESCALE_G( |
229 |
I bi,bj,K, |
I bi,bj,k, |
230 |
U gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer), |
U gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer), |
231 |
I myThid ) |
I myThid ) |
232 |
ENDIF |
ENDIF |
234 |
|
|
235 |
C Integrate forward in time, storing in gPtr: G=T+dt*G |
C Integrate forward in time, storing in gPtr: G=T+dt*G |
236 |
CALL TIMESTEP_TRACER( |
CALL TIMESTEP_TRACER( |
237 |
I bi,bj,iMin,iMax,jMin,jMax,k, |
I bi, bj, k, PTRACERS_dTLev(k), |
|
I PTRACERS_advScheme(iTracer), |
|
238 |
I pTracer(1-Olx,1-Oly,1,1,1,iTracer), |
I pTracer(1-Olx,1-Oly,1,1,1,iTracer), |
239 |
I gPtr(1-Olx,1-Oly,1,1,1,iTracer), |
U gPtr(1-Olx,1-Oly,1,1,1,iTracer), |
240 |
I myIter,myThid ) |
I myIter, myThid ) |
241 |
|
|
|
#ifdef ALLOW_OBCS |
|
|
C Apply open boundary conditions |
|
|
IF (useOBCS) THEN |
|
|
CALL OBCS_APPLY_PTRACER( |
|
|
I bi, bj, k, iTracer, |
|
|
U gPtr(1-Olx,1-Oly,k,bi,bj,iTracer), |
|
|
I myThid ) |
|
|
ENDIF |
|
|
#endif /* ALLOW_OBCS */ |
|
242 |
C end of tracer loop |
C end of tracer loop |
243 |
ENDDO |
ENDDO |
244 |
|
|