/[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.13 - (show annotations) (download)
Wed Jan 7 21:21:26 2004 UTC (20 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint52l_pre, hrcube4, hrcube5, checkpoint52j_pre, checkpoint52k_post, checkpoint53, checkpoint52f_post, checkpoint52i_pre, hrcube_1, hrcube_2, hrcube_3, checkpoint52e_post, checkpoint53d_post, checkpoint52m_post, checkpoint52f_pre, checkpoint53c_post, checkpoint53a_post, checkpoint52i_post, checkpoint52h_pre, checkpoint53f_post, checkpoint52j_post, checkpoint52l_post, checkpoint52n_post, checkpoint53b_pre, checkpoint53b_post, checkpoint53d_pre
Changes since 1.12: +21 -15 lines
rewrite (as in MultiDimAdvec) explicit tracer stepping (gad_calc_rhs.F)
 to work with implicit vertical advection and AB

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

  ViewVC Help
Powered by ViewVC 1.1.22