/[MITgcm]/MITgcm/pkg/ptracers/ptracers_integrate.F
ViewVC logotype

Annotation of /MITgcm/pkg/ptracers/ptracers_integrate.F

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


Revision 1.35 - (hide annotations) (download)
Mon Nov 5 18:48:04 2007 UTC (16 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint59k, checkpoint59j
Changes since 1.34: +11 -10 lines
split PTRACERS.h in 2 header files: PTRACERS_FIELDS.h & PTRACERS_PARAMS.h

1 jmc 1.35 C $Header: /u/gcmpack/MITgcm/pkg/ptracers/ptracers_integrate.F,v 1.34 2007/10/19 14:43:50 jmc Exp $
2 adcroft 1.2 C $Name: $
3 adcroft 1.1
4     #include "PTRACERS_OPTIONS.h"
5    
6     CBOP
7 heimbach 1.7 C !ROUTINE: PTRACERS_INTEGRATE
8 adcroft 1.1
9     C !INTERFACE: ==========================================================
10 heimbach 1.7 SUBROUTINE PTRACERS_INTEGRATE(
11 jmc 1.32 I bi,bj,k,
12     I xA, yA, maskUp, uFld, vFld, wFld,
13     I uTrans, vTrans, rTrans, rTransKp1,
14     I KappaRtr,
15     U rFlx,
16     I myTime,myIter,myThid )
17 adcroft 1.1
18     C !DESCRIPTION:
19 jmc 1.26 C Calculates tendency for passive tracers and integrates forward
20 adcroft 1.1 C in time.
21    
22     C !USES: ===============================================================
23     IMPLICIT NONE
24     #include "SIZE.h"
25     #include "EEPARAMS.h"
26 adcroft 1.5 #include "PARAMS.h"
27 jmc 1.13 #include "DYNVARS.h"
28 jmc 1.15 #include "PTRACERS_SIZE.h"
29 jmc 1.35 #include "PTRACERS_PARAMS.h"
30     #include "PTRACERS_FIELDS.h"
31 adcroft 1.1 #include "GAD.h"
32 heimbach 1.31 #ifdef ALLOW_AUTODIFF_TAMC
33     # include "tamc.h"
34     # include "tamc_keys.h"
35     #endif
36 adcroft 1.1
37     C !INPUT PARAMETERS: ===================================================
38     C bi,bj :: tile indices
39     C k :: vertical level number
40     C xA :: face area at U points in level k
41     C yA :: face area at V points in level k
42 jmc 1.32 C maskUp :: mask for vertical transport
43     C uFld,vFld,wFld :: Local copy of velocity field (3 components)
44 adcroft 1.1 C uTrans :: zonal transport in level k
45     C vTrans :: meridional transport in level k
46 jmc 1.13 C rTrans :: vertical volume transport at interface k
47     C rTransKp1 :: vertical volume transport at interface k+1
48 jmc 1.32 C KappaRtr :: vertical diffusion of passive tracers, interf k
49 jmc 1.12 C rFlx :: vertical flux
50 jmc 1.32 C myTime :: model time
51 adcroft 1.1 C myIter :: time-step number
52     C myThid :: thread number
53     INTEGER bi,bj,k
54     _RS xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
55     _RS yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
56 jmc 1.32 _RS maskUp (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
57     _RL uFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
58     _RL vFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
59     _RL wFld (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
60 adcroft 1.1 _RL uTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
61     _RL vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
62     _RL rTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
63 jmc 1.13 _RL rTransKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
64 jmc 1.19 _RL KappaRtr(1-Olx:sNx+Olx,1-Oly:sNy+Oly,PTRACERS_num)
65 jmc 1.32 _RL rFlx (1-OLx:sNx+OLx,1-OLy:sNy+OLy,2,PTRACERS_num)
66     _RL myTime
67 adcroft 1.1 INTEGER myIter
68     INTEGER myThid
69    
70     C !OUTPUT PARAMETERS: ==================================================
71     C none
72    
73     #ifdef ALLOW_PTRACERS
74    
75     C !LOCAL VARIABLES: ====================================================
76 jmc 1.27 C iTracer :: tracer index
77 adcroft 1.1 C iMin,iMax,jMin,jMax :: loop ranges
78     C kUp,kDown :: toggle indices for even/odd level fluxes
79     C km1 :: =min(1,k-1)
80 dimitri 1.8 C GAD_TR :: passive tracer id (GAD_TR1+iTracer-1)
81 jmc 1.27 INTEGER iTracer
82 adcroft 1.1 INTEGER iMin,iMax,jMin,jMax
83     INTEGER kUp,kDown,km1
84 dimitri 1.8 INTEGER GAD_TR
85 jmc 1.3 LOGICAL calcAdvection
86 jmc 1.34 INTEGER iterNb, startAB
87 adcroft 1.1 CEOP
88    
89 heimbach 1.31 C Loop ranges for daughter routines
90     iMin = 1-OLx+2
91     iMax = sNx+OLx-1
92     jMin = 1-OLy+2
93     jMax = sNy+OLy-1
94 jmc 1.32
95 heimbach 1.31 km1 = MAX(1,k-1)
96     kUp = 1+MOD(k+1,2)
97     kDown= 1+MOD(k,2)
98    
99 adcroft 1.1 C Loop over tracers
100     DO iTracer=1,PTRACERS_numInUse
101    
102 heimbach 1.31 #ifdef ALLOW_AUTODIFF_TAMC
103     act0 = iTracer - 1
104     max0 = PTRACERS_num
105     act1 = bi - myBxLo(myThid)
106     max1 = myBxHi(myThid) - myBxLo(myThid) + 1
107     act2 = bj - myByLo(myThid)
108     max2 = myByHi(myThid) - myByLo(myThid) + 1
109     act3 = myThid - 1
110     max3 = nTx*nTy
111     act4 = ikey_dynamics - 1
112     iptrkey = (act0 + 1)
113     & + act1*max0
114     & + act2*max0*max1
115     & + act3*max0*max1*max2
116     & + act4*max0*max1*max2*max3
117     kkey = (iptrkey-1)*Nr + k
118     #endif /* ALLOW_AUTODIFF_TAMC */
119    
120     #ifdef ALLOW_AUTODIFF_TAMC
121     rFlx(1,1,kDown,iTracer) = rFlx(1,1,kDown,iTracer)
122     c
123 jmc 1.35 CADJ STORE pTracer(:,:,k,bi,bj,iTracer)
124 heimbach 1.31 CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte
125 jmc 1.35 CADJ STORE gpTrNm1(:,:,k,bi,bj,iTracer)
126 heimbach 1.31 CADJ & = comlev1_bibj_k_ptracers, key=kkey, byte=isbyte
127     #endif /* ALLOW_AUTODIFF_TAMC */
128 jmc 1.32
129 adcroft 1.1 C Calculate active tracer tendencies (gPtr) due to internal processes
130     C (advection, [explicit] diffusion, parameterizations,...)
131 jmc 1.3 calcAdvection = .NOT.multiDimAdvection
132     & .OR. PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND
133     & .OR. PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD
134     & .OR. PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH
135 dimitri 1.8 GAD_TR = GAD_TR1 + iTracer - 1
136 jmc 1.13 CALL GAD_CALC_RHS(
137     I bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
138 jmc 1.32 I xA, yA, maskUp, uFld, vFld, wFld,
139     I uTrans, vTrans, rTrans, rTransKp1,
140 jmc 1.13 I PTRACERS_diffKh(iTracer),
141     I PTRACERS_diffK4(iTracer),
142 jmc 1.19 I KappaRtr(1-Olx,1-Oly,iTracer),
143 jmc 1.35 I gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
144 jmc 1.26 I pTracer(1-Olx,1-Oly,1,1,1,iTracer),
145 jmc 1.13 I GAD_TR,
146     I PTRACERS_advScheme(iTracer),
147 jmc 1.14 I PTRACERS_advScheme(iTracer),
148 jmc 1.22 I calcAdvection, PTRACERS_ImplVertAdv(iTracer),
149 jmc 1.29 I .FALSE.,
150 jmc 1.33 I PTRACERS_useGMRedi(iTracer),
151     I PTRACERS_useKPP(iTracer),
152 jmc 1.13 U rFlx(1-Olx,1-Oly,1,iTracer),
153     U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
154 jmc 1.17 I myTime, myIter, myThid )
155 adcroft 1.1
156     C External forcing term(s)
157 jmc 1.30 IF ( tracForcingOutAB.NE.1 )
158 jmc 1.3 & CALL PTRACERS_FORCING(
159 mlosch 1.21 I bi,bj,iMin,iMax,jMin,jMax,k,iTracer,
160 heimbach 1.11 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
161 jmc 1.35 I surfaceForcingPTr(1-Olx,1-Oly,1,1,iTracer),
162 heimbach 1.11 I myIter,myTime,myThid)
163 adcroft 1.1
164 jmc 1.27 C If using Adams-Bashforth II, then extrapolate tendencies
165 spk 1.24 C gPtr is now the tracer tendency for explicit advection/diffusion
166 adcroft 1.1 IF ( PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND
167     & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD
168     & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH ) THEN
169 spk 1.24 #ifdef ALLOW_MATRIX
170 jmc 1.32 C If matrix is being computed, block call to S/R ADAMS_BASHFORTH2 to
171 jmc 1.35 C prevent gPtr from being replaced by the average of gPtr and gpTrNm1.
172 spk 1.24 IF (.NOT.useMATRIX) THEN
173 jmc 1.32 #endif
174 jmc 1.23 iterNb = myIter
175     IF (staggerTimeStep) iterNb = myIter - 1
176 jmc 1.34 startAB = nIter0 - PTRACERS_Iter0
177 adcroft 1.1 CALL ADAMS_BASHFORTH2(
178     I bi,bj,K,
179     U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
180 jmc 1.35 U gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
181 jmc 1.34 I startAB, iterNb, myThid )
182 spk 1.24 #ifdef ALLOW_MATRIX
183     ENDIF
184 jmc 1.32 #endif
185 adcroft 1.1 ENDIF
186 jmc 1.3
187     C External forcing term(s)
188 jmc 1.30 IF ( tracForcingOutAB.EQ.1 )
189 jmc 1.3 & CALL PTRACERS_FORCING(
190 mlosch 1.21 I bi,bj,iMin,iMax,jMin,jMax,k,iTracer,
191 heimbach 1.11 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
192 jmc 1.35 I surfaceForcingPTr(1-Olx,1-Oly,1,1,iTracer),
193 heimbach 1.11 I myIter,myTime,myThid)
194 adcroft 1.1
195     #ifdef NONLIN_FRSURF
196     C Account for change in level thickness
197     IF (nonlinFreeSurf.GT.0) THEN
198     CALL FREESURF_RESCALE_G(
199     I bi,bj,K,
200     U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
201 jmc 1.4 I myThid )
202     IF ( PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND
203     & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD
204     & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH )
205     & CALL FREESURF_RESCALE_G(
206     I bi,bj,K,
207 jmc 1.35 U gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
208 adcroft 1.1 I myThid )
209     ENDIF
210     #endif /* NONLIN_FRSURF */
211    
212     C Integrate forward in time, storing in gPtr: G=T+dt*G
213     CALL TIMESTEP_TRACER(
214     I bi,bj,iMin,iMax,jMin,jMax,k,
215     I PTRACERS_advScheme(iTracer),
216     I pTracer(1-Olx,1-Oly,1,1,1,iTracer),
217     I gPtr(1-Olx,1-Oly,1,1,1,iTracer),
218     I myIter,myThid )
219    
220 mlosch 1.25 #ifdef ALLOW_OBCS
221     C Apply open boundary conditions
222     IF (useOBCS) THEN
223 jmc 1.32 CALL OBCS_APPLY_PTRACER(
224     I bi, bj, k, iTracer,
225 mlosch 1.25 U gPtr(1-Olx,1-Oly,k,bi,bj,iTracer),
226     I myThid )
227     END IF
228     #endif /* ALLOW_OBCS */
229 adcroft 1.1 C end of tracer loop
230     ENDDO
231    
232     #endif /* ALLOW_PTRACERS */
233    
234     RETURN
235     END

  ViewVC Help
Powered by ViewVC 1.1.22