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

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

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


Revision 1.15 - (show annotations) (download)
Tue Jul 13 16:47:49 2004 UTC (19 years, 10 months ago) by jmc
Branch: MAIN
Changes since 1.14: +2 -1 lines
max number of passive tracers is now defined in PTRACERS_SIZE.h

1 C $Header: /u/gcmpack/MITgcm/pkg/ptracers/ptracers_integrate.F,v 1.14 2004/06/26 02:39:31 jmc Exp $
2 C $Name: $
3
4 #include "PTRACERS_OPTIONS.h"
5 cswdptr -- add ---
6 #ifdef ALLOW_GCHEM
7 # include "GCHEM_OPTIONS.h"
8 #endif
9 cswdptr -- end add ---
10
11 CBOP
12 C !ROUTINE: PTRACERS_INTEGRATE
13
14 C !INTERFACE: ==========================================================
15 SUBROUTINE PTRACERS_INTEGRATE(
16 I bi,bj,k,
17 I xA,yA,uTrans,vTrans,rTrans,
18 I rTransKp1,maskUp,
19 X rFlx,KappaRtr,
20 I myIter,myTime,myThid )
21
22 C !DESCRIPTION:
23 C Calculates tendancy for passive tracers and integrates forward
24 C in time.
25
26 C !USES: ===============================================================
27 IMPLICIT NONE
28 #include "SIZE.h"
29 #include "EEPARAMS.h"
30 #include "PARAMS.h"
31 #include "DYNVARS.h"
32 #include "PTRACERS_SIZE.h"
33 #include "PTRACERS.h"
34 #include "GAD.h"
35
36 C !INPUT PARAMETERS: ===================================================
37 C bi,bj :: tile indices
38 C k :: vertical level number
39 C xA :: face area at U points in level k
40 C yA :: face area at V points in level k
41 C uTrans :: zonal transport in level k
42 C vTrans :: meridional transport in level k
43 C rTrans :: vertical volume transport at interface k
44 C rTransKp1 :: vertical volume transport at interface k+1
45 C maskUp :: mask for vertical transport
46 C rFlx :: vertical flux
47 C KappaRtr :: vertical diffusion of passive tracers
48 C NOTE! This is infact KappaRS from thermodynamics()
49 C and is being used only temporarily
50 C until we removed the need to store
51 C a "3D" diffusivity
52 C myIter :: time-step number
53 C myTime :: model time
54 C myThid :: thread number
55 INTEGER bi,bj,k
56 _RS xA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
57 _RS yA (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
58 _RL uTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
59 _RL vTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
60 _RL rTrans (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
61 _RL rTransKp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
62 _RS maskUp (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
63 _RL rFlx(1-OLx:sNx+OLx,1-OLy:sNy+OLy,2,PTRACERS_num)
64 _RL KappaRtr(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
65 INTEGER myIter
66 _RL myTime
67 INTEGER myThid
68
69 C !OUTPUT PARAMETERS: ==================================================
70 C none
71
72 #ifdef ALLOW_PTRACERS
73
74 C !LOCAL VARIABLES: ====================================================
75 C i,j,k,bi,bj,iTracer :: loop indices
76 C iMin,iMax,jMin,jMax :: loop ranges
77 C kUp,kDown :: toggle indices for even/odd level fluxes
78 C km1 :: =min(1,k-1)
79 C GAD_TR :: passive tracer id (GAD_TR1+iTracer-1)
80 INTEGER i,j,iTracer
81 INTEGER iMin,iMax,jMin,jMax
82 INTEGER kUp,kDown,km1
83 INTEGER GAD_TR
84 LOGICAL calcAdvection
85 CEOP
86
87 C Loop over tracers
88 DO iTracer=1,PTRACERS_numInUse
89
90 C Loop ranges for daughter routines
91 iMin = 1-OLx+2
92 iMax = sNx+OLx-1
93 jMin = 1-OLy+2
94 jMax = sNy+OLy-1
95
96 km1 = MAX(1,k-1)
97 kUp = 1+MOD(k+1,2)
98 kDown= 1+MOD(k,2)
99
100 C Calculate active tracer tendencies (gPtr) due to internal processes
101 C (advection, [explicit] diffusion, parameterizations,...)
102 calcAdvection = .NOT.multiDimAdvection
103 & .OR. PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND
104 & .OR. PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD
105 & .OR. PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH
106 GAD_TR = GAD_TR1 + iTracer - 1
107 CALL GAD_CALC_RHS(
108 I bi,bj,iMin,iMax,jMin,jMax,k,kM1,kUp,kDown,
109 I xA,yA,uTrans,vTrans,rTrans,rTransKp1,maskUp,
110 I uVel, vVel, wVel,
111 I PTRACERS_diffKh(iTracer),
112 I PTRACERS_diffK4(iTracer),
113 I KappaRtr,
114 I pTracer(1-Olx,1-Oly,1,1,1,iTracer),
115 I GAD_TR,
116 I PTRACERS_advScheme(iTracer),
117 I PTRACERS_advScheme(iTracer),
118 I calcAdvection, .FALSE.,
119 U rFlx(1-Olx,1-Oly,1,iTracer),
120 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
121 I myThid )
122
123 C External forcing term(s)
124 cswdptr --add --
125 #ifdef ALLOW_GCHEM
126 #ifndef PTRACERS_SEPARATE_FORCING
127 IF ( forcing_In_AB )
128 & CALL GCHEM_FORCING_INT(
129 I bi,bj,iMin,iMax,jMin,jMax,k,
130 I iTracer,
131 I myTime,myIter, myThid)
132 #endif
133 #else
134 cswdptr - end add ---
135 IF ( forcing_In_AB )
136 & CALL PTRACERS_FORCING(
137 I bi,bj,iMin,iMax,jMin,jMax,k,
138 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
139 I surfaceTendencyPtr(1-Olx,1-Oly,1,1,iTracer),
140 I myIter,myTime,myThid)
141 cswdptr --add---
142 #endif
143 cswdptr -- end add ---
144
145 C If using Adams-Bashforth II, then extrapolate tendancies
146 IF ( PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND
147 & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD
148 & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH ) THEN
149 CALL ADAMS_BASHFORTH2(
150 I bi,bj,K,
151 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
152 U gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer),
153 I myIter,myThid )
154 ENDIF
155
156 C External forcing term(s)
157 cswdptr - add--
158 #ifdef ALLOW_GCHEM
159 #ifndef PTRACERS_SEPARATE_FORCING
160 IF ( .NOT.forcing_In_AB )
161 & CALL GCHEM_FORCING_INT(
162 I bi,bj,iMin,iMax,jMin,jMax,k,
163 I iTracer,
164 I myTime,myIter, myThid)
165 #endif
166 #else
167 cswdptr - end add ---
168 IF ( .NOT.forcing_In_AB )
169 & CALL PTRACERS_FORCING(
170 I bi,bj,iMin,iMax,jMin,jMax,k,
171 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
172 I surfaceTendencyPtr(1-Olx,1-Oly,1,1,iTracer),
173 I myIter,myTime,myThid)
174 cswdptr - add--
175 #endif
176 cswdptr -- end add ---
177
178 #ifdef NONLIN_FRSURF
179 C Account for change in level thickness
180 IF (nonlinFreeSurf.GT.0) THEN
181 CALL FREESURF_RESCALE_G(
182 I bi,bj,K,
183 U gPtr(1-Olx,1-Oly,1,1,1,iTracer),
184 I myThid )
185 IF ( PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_2ND
186 & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_UPWIND_3RD
187 & .OR.PTRACERS_advScheme(iTracer).EQ.ENUM_CENTERED_4TH )
188 & CALL FREESURF_RESCALE_G(
189 I bi,bj,K,
190 U gPtrNm1(1-Olx,1-Oly,1,1,1,iTracer),
191 I myThid )
192 ENDIF
193 #endif /* NONLIN_FRSURF */
194
195 C Integrate forward in time, storing in gPtr: G=T+dt*G
196 CALL TIMESTEP_TRACER(
197 I bi,bj,iMin,iMax,jMin,jMax,k,
198 I PTRACERS_advScheme(iTracer),
199 I pTracer(1-Olx,1-Oly,1,1,1,iTracer),
200 I gPtr(1-Olx,1-Oly,1,1,1,iTracer),
201 I myIter,myThid )
202
203 C end of tracer loop
204 ENDDO
205
206 #endif /* ALLOW_PTRACERS */
207
208 RETURN
209 END

  ViewVC Help
Powered by ViewVC 1.1.22