91
92
96
97
98
99
100 integer, intent(in) :: ng, tile
101 integer, intent(in) :: LBi, UBi, LBj, UBj
102 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
103 integer, intent(in) :: nstp, nnew
104
105# ifdef ASSUMED_SHAPE
106 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
107 real(r8), intent(in) :: z_w(LBi:,LBj:,0:)
108 real(r8), intent(inout) :: settling_flux(LBi:,LBj:,:)
109 real(r8), intent(inout) :: t(LBi:,LBj:,:,:,:)
110# else
111 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
112 real(r8), intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
113 real(r8), intent(inout) :: settling_flux(LBi:UBi,LBj:UBj,NST)
114 real(r8), intent(inout) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
115# endif
116
117
118
119 integer :: i, indx, ised, j, k, ks
120
121 real(r8) :: cff, cu, cffL, cffR, dltL, dltR
122
123 integer, dimension(IminS:ImaxS,N(ng)) :: ksource
124
125 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: FC
126
127 real(r8), dimension(IminS:ImaxS,N(ng)) :: Hz_inv
128 real(r8), dimension(IminS:ImaxS,N(ng)) :: Hz_inv2
129 real(r8), dimension(IminS:ImaxS,N(ng)) :: Hz_inv3
130 real(r8), dimension(IminS:ImaxS,N(ng)) :: qc
131 real(r8), dimension(IminS:ImaxS,N(ng)) :: qR
132 real(r8), dimension(IminS:ImaxS,N(ng)) :: qL
133 real(r8), dimension(IminS:ImaxS,N(ng)) :: WR
134 real(r8), dimension(IminS:ImaxS,N(ng)) :: WL
135
136# include "set_bounds.h"
137
138
139
140
141
142
143
144 j_loop : DO j=jstr,jend
146 DO i=istr,iend
147 hz_inv(i,k)=1.0_r8/hz(i,j,k)
148 END DO
149 END DO
151 DO i=istr,iend
152 hz_inv2(i,k)=1.0_r8/(hz(i,j,k)+hz(i,j,k+1))
153 END DO
154 END DO
156 DO i=istr,iend
157 hz_inv3(i,k)=1.0_r8/(hz(i,j,k-1)+hz(i,j,k)+hz(i,j,k+1))
158 END DO
159 END DO
160
161
162
163
164
165
166 sed_loop:
DO ised=1,
nst
169 DO i=istr,iend
170 qc(i,k)=t(i,j,k,nnew,indx)*hz_inv(i,k)
171 END DO
172 END DO
173
174
175
176
177
178
179
180
181
183 DO i=istr,iend
184 fc(i,k)=(qc(i,k+1)-qc(i,k))*hz_inv2(i,k)
185 END DO
186 END DO
188 DO i=istr,iend
189 dltr=hz(i,j,k)*fc(i,k)
190 dltl=hz(i,j,k)*fc(i,k-1)
191 cff=hz(i,j,k-1)+2.0_r8*hz(i,j,k)+hz(i,j,k+1)
192 cffr=cff*fc(i,k)
193 cffl=cff*fc(i,k-1)
194
195
196
197
198 IF ((dltr*dltl).le.0.0_r8) THEN
199 dltr=0.0_r8
200 dltl=0.0_r8
201 ELSE IF (abs(dltr).gt.abs(cffl)) THEN
202 dltr=cffl
203 ELSE IF (abs(dltl).gt.abs(cffr)) THEN
204 dltl=cffr
205 END IF
206
207
208
209
210
211
212
213
214
215
216 cff=(dltr-dltl)*hz_inv3(i,k)
217 dltr=dltr-cff*hz(i,j,k+1)
218 dltl=dltl+cff*hz(i,j,k-1)
219 qr(i,k)=qc(i,k)+dltr
220 ql(i,k)=qc(i,k)-dltl
221 wr(i,k)=(2.0_r8*dltr-dltl)**2
222 wl(i,k)=(dltr-2.0_r8*dltl)**2
223 END DO
224 END DO
225 cff=1.0e-14_r8
227 DO i=istr,iend
228 dltl=max(cff,wl(i,k ))
229 dltr=max(cff,wr(i,k+1))
230 qr(i,k)=(dltr*qr(i,k)+dltl*ql(i,k+1))/(dltr+dltl)
231 ql(i,k+1)=qr(i,k)
232 END DO
233 END DO
234 DO i=istr,iend
236# if defined LINEAR_CONTINUATION
237 ql(i,
n(ng))=qr(i,
n(ng)-1)
238 qr(i,
n(ng))=2.0_r8*qc(i,
n(ng))-ql(i,
n(ng))
239# elif defined NEUMANN
240 ql(i,
n(ng))=qr(i,
n(ng)-1)
241 qr(i,
n(ng))=1.5_r8*qc(i,
n(ng))-0.5_r8*ql(i,
n(ng))
242# else
243 qr(i,
n(ng))=qc(i,
n(ng))
244 ql(i,
n(ng))=qc(i,
n(ng))
245 qr(i,
n(ng)-1)=qc(i,
n(ng))
246# endif
247# if defined LINEAR_CONTINUATION
248 qr(i,1)=ql(i,2)
249 ql(i,1)=2.0_r8*qc(i,1)-qr(i,1)
250# elif defined NEUMANN
251 qr(i,1)=ql(i,2)
252 ql(i,1)=1.5_r8*qc(i,1)-0.5_r8*qr(i,1)
253# else
254 ql(i,2)=qc(i,1)
255 qr(i,1)=qc(i,1)
256 ql(i,1)=qc(i,1)
257# endif
258 END DO
259
260
261
262
263
265 DO i=istr,iend
266 dltr=qr(i,k)-qc(i,k)
267 dltl=qc(i,k)-ql(i,k)
268 cffr=2.0_r8*dltr
269 cffl=2.0_r8*dltl
270 IF ((dltr*dltl).lt.0.0_r8) THEN
271 dltr=0.0_r8
272 dltl=0.0_r8
273 ELSE IF (abs(dltr).gt.abs(cffl)) THEN
274 dltr=cffl
275 ELSE IF (abs(dltl).gt.abs(cffr)) THEN
276 dltl=cffr
277 END IF
278 qr(i,k)=qc(i,k)+dltr
279 ql(i,k)=qc(i,k)-dltl
280 END DO
281 END DO
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297 cff=
dt(ng)*abs(
wsed(ised,ng))
299 DO i=istr,iend
300 fc(i,k-1)=0.0_r8
301 wl(i,k)=z_w(i,j,k-1)+cff
302 wr(i,k)=hz(i,j,k)*qc(i,k)
303 ksource(i,k)=k
304 END DO
305 END DO
308 DO i=istr,iend
309 IF (wl(i,k).gt.z_w(i,j,ks)) THEN
310 ksource(i,k)=ks+1
311 fc(i,k-1)=fc(i,k-1)+wr(i,ks)
312 END IF
313 END DO
314 END DO
315 END DO
316
317
318
320 DO i=istr,iend
321 ks=ksource(i,k)
322 cu=min(1.0_r8,(wl(i,k)-z_w(i,j,ks-1))*hz_inv(i,ks))
323 fc(i,k-1)=fc(i,k-1)+ &
324 & hz(i,j,ks)*cu* &
325 & (ql(i,ks)+ &
326 & cu*(0.5_r8*(qr(i,ks)-ql(i,ks))- &
327 & (1.5_r8-cu)* &
328 & (qr(i,ks)+ql(i,ks)-2.0_r8*qc(i,ks))))
329 END DO
330 END DO
331 DO i=istr,iend
333 t(i,j,k,nnew,indx)=qc(i,k)*hz(i,j,k)+(fc(i,k)-fc(i,k-1))
334 END DO
335 settling_flux(i,j,ised)=fc(i,0)
336 END DO
337 END DO sed_loop
338 END DO j_loop
339
340 RETURN
integer, dimension(:), allocatable n
real(dp), dimension(:), allocatable dt
integer, dimension(:), allocatable idsed
real(r8), dimension(:,:), allocatable wsed