112
113
116
117
118
119 integer, intent(in) :: ng, tile
120 integer, intent(in) :: LBi, UBi, LBj, UBj
121 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
122 Integer, intent(in) :: nstp
123
124# ifdef ASSUMED_SHAPE
125 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
126# ifndef RI_SPLINES
127 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
128# endif
129 real(r8), intent(in) :: rho(LBi:,LBj:,:)
130 real(r8), intent(in) :: u(LBi:,LBj:,:,:)
131 real(r8), intent(in) :: v(LBi:,LBj:,:,:)
132# ifdef LMD_DDMIX
133 real(r8), intent(in) :: t(LBi:,LBj:,:,:,:)
134 real(r8), intent(in) :: alfaobeta(LBi:,LBj:,0:)
135# endif
136 real(r8), intent(in) :: bvf(LBi:,LBj:,0:)
137
138 real(r8), intent(inout) :: Akt(LBi:,LBj:,0:,:)
139 real(r8), intent(inout) :: Akv(LBi:,LBj:,0:)
140# else
141 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
142# ifndef RI_SPLINES
143 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
144# endif
145 real(r8), intent(in) :: rho(LBi:UBi,LBj:UBj,N(ng))
146 real(r8), intent(in) :: u(LBi:UBi,LBj:UBj,N(ng),3)
147 real(r8), intent(in) :: v(LBi:UBi,LBj:UBj,N(ng),3)
148# ifdef LMD_DDMIX
149 real(r8), intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
150 real(r8), intent(in) :: alfaobeta(LBi:UBi,LBj:UBj,0:N(ng))
151# endif
152 real(r8), intent(in) :: bvf(LBi:UBi,LBj:UBj,0:N(ng))
153
154 real(r8), intent(inout) :: Akt(LBi:UBi,LBj:UBj,0:N(ng),NAT)
155 real(r8), intent(inout) :: Akv(LBi:UBi,LBj:UBj,0:N(ng))
156# endif
157
158
159
160 integer :: i, itrc, j, k
161
162 real(r8), parameter :: eps = 1.0e-14_r8
163
164 real(r8) :: cff, lmd_iwm, lmd_iws, nu_sx, nu_sxc, shear2
165# ifdef LMD_DDMIX
166 real(r8) :: Rrho, ddDS, ddDT, nu_dds, nu_ddt
167# endif
168
169 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: Rig
170
171 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: FC
172 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: dR
173 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: dU
174 real(r8), dimension(IminS:ImaxS,0:N(ng)) :: dV
175
176# include "set_bounds.h"
177
178# ifdef LMD_RIMIX
179
180
181
182
183
184
185
186
187
188# ifdef RI_SPLINES
189 DO j=max(1,jstr-1),min(jend+1,
mm(ng))
190 DO i=max(1,istr-1),min(iend+1,
lm(ng))
191 fc(i,0)=0.0_r8
192 dr(i,0)=0.0_r8
193 du(i,0)=0.0_r8
194 dv(i,0)=0.0_r8
195 END DO
197 DO i=max(1,istr-1),min(iend+1,
lm(ng))
198 cff=1.0_r8/(2.0_r8*hz(i,j,k+1)+ &
199 & hz(i,j,k)*(2.0_r8-fc(i,k-1)))
200 fc(i,k)=cff*hz(i,j,k+1)
201 dr(i,k)=cff*(6.0_r8*(rho(i,j,k+1)-rho(i,j,k))- &
202 & hz(i,j,k)*dr(i,k-1))
203 du(i,k)=cff*(3.0_r8*(u(i ,j,k+1,nstp)-u(i ,j,k,nstp)+ &
204 & u(i+1,j,k+1,nstp)-u(i+1,j,k,nstp))- &
205 & hz(i,j,k)*du(i,k-1))
206 dv(i,k)=cff*(3.0_r8*(v(i,j ,k+1,nstp)-v(i,j ,k,nstp)+ &
207 & v(i,j+1,k+1,nstp)-v(i,j+1,k,nstp))- &
208 & hz(i,j,k)*dv(i,k-1))
209 END DO
210 END DO
211 DO i=max(1,istr-1),min(iend+1,
lm(ng))
215 END DO
217 DO i=max(1,istr-1),min(iend+1,
lm(ng))
218 dr(i,k)=dr(i,k)-fc(i,k)*dr(i,k+1)
219 du(i,k)=du(i,k)-fc(i,k)*du(i,k+1)
220 dv(i,k)=dv(i,k)-fc(i,k)*dv(i,k+1)
221 END DO
222 END DO
224 DO i=max(1,istr-1),min(iend+1,
lm(ng))
225 shear2=du(i,k)*du(i,k)+dv(i,k)*dv(i,k)
226 rig(i,j,k)=bvf(i,j,k)/(shear2+eps)
227
228 END DO
229 END DO
230 END DO
231# else
233 DO j=max(1,jstr-1),min(jend+1,
mm(ng))
234 DO i=max(1,istr-1),min(iend+1,
lm(ng))
235 cff=0.5_r8/(z_r(i,j,k+1)-z_r(i,j,k))
236 shear2=(cff*(u(i ,j,k+1,nstp)-u(i ,j,k,nstp)+ &
237 & u(i+1,j,k+1,nstp)-u(i+1,j,k,nstp)))**2+ &
238 & (cff*(v(i,j ,k+1,nstp)-v(i,j ,k,nstp)+ &
239 & v(i,j+1,k+1,nstp)-v(i,j+1,k,nstp)))**2
240 rig(i,j,k)=bvf(i,j,k)/(shear2+eps)
241 END DO
242 END DO
243 END DO
244# endif
245# ifdef RI_HORAVG
247 IF (
domain(ng)%Western_Edge(tile))
THEN
248 DO j=max(1,jstr-1),min(jend+1,
mm(ng))
249 rig(istr-1,j,k)=rig(istr,j,k)
250 END DO
251 END IF
252 IF (
domain(ng)%Eastern_Edge(tile))
THEN
253 DO j=max(1,jstr-1),min(jend+1,
mm(ng))
254 rig(iend+1,j,k)=rig(iend,j,k)
255 END DO
256 END IF
257 IF (
domain(ng)%Southern_Edge(tile))
THEN
258 DO i=max(1,istr-1),min(iend+1,
lm(ng))
259 rig(i,jstr-1,k)=rig(i,jstr,k)
260 END DO
261 END IF
262 IF (
domain(ng)%Northern_Edge(tile))
THEN
263 DO i=max(1,istr-1),min(iend+1,
lm(ng))
264 rig(i,jend+1,k)=rig(i,jend,k)
265 END DO
266 END IF
267 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
268 rig(istr-1,jstr-1,k)=rig(istr,jstr,k)
269 END IF
270 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
271 rig(istr-1,jend+1,k)=rig(istr,jend,k)
272 END IF
273 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
274 rig(iend+1,jstr-1,k)=rig(iend,jstr,k)
275 END IF
276 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
277 rig(iend+1,jend+1,k)=rig(iend,jend,k)
278 END IF
279
280
281
282
283 DO j=jstr-1,jend
284 DO i=istr-1,iend
285 rig(i,j,0)=0.25_r8*(rig(i,j ,k)+rig(i+1,j ,k)+ &
286 & rig(i,j+1,k)+rig(i+1,j+1,k))
287 END DO
288 END DO
289 DO j=jstr,jend
290 DO i=istr,iend
291 rig(i,j,k)=0.25_r8*(rig(i,j ,0)+rig(i-1,j ,0)+ &
292 & rig(i,j-1,0)+rig(i-1,j-1,0))
293 END DO
294 END DO
295 END DO
296# endif
297# ifdef RI_VERAVG
298
299
300
302 DO j=jstr,jend
303 DO i=istr,iend
304 rig(i,j,k)=0.25_r8*rig(i,j,k-1)+ &
305 & 0.50_r8*rig(i,j,k )+ &
306 & 0.25_r8*rig(i,j,k+1)
307 END DO
308 END DO
309 END DO
310# endif
311# endif
312
313
314
315
316
317
318
319
321 DO j=jstr,jend
322 DO i=istr,iend
323
324
325
326# ifdef LMD_RIMIX
327 cff=min(1.0_r8,max(0.0_r8,rig(i,j,k))/
lmd_ri0)
328 nu_sx=1.0_r8-cff*cff
329 nu_sx=nu_sx*nu_sx*nu_sx
330
331
332
333
334 shear2=bvf(i,j,k)/(rig(i,j,k)+eps)
335 cff=shear2*shear2/(shear2*shear2+16.0e-10_r8)
336 nu_sx=cff*nu_sx
337# else
338 nu_sx=0.0_r8
339# endif
340
341
342
343
344 cff=1.0_r8/sqrt(max(bvf(i,j,k),1.0e-7_r8))
345 lmd_iwm=1.0e-6_r8*cff
346 lmd_iws=1.0e-7_r8*cff
347
348
349
350
351
352
355# ifdef SALINITY
357# endif
358 END DO
359 END DO
360# ifdef LMD_DDMIX
361
362
363
364
365
366
367
368
369
370
371 DO j=jstr,jend
372 DO i=istr,iend
373 dddt=t(i,j,k+1,nstp,
itemp)-t(i,j,k,nstp,
itemp)
374 ddds=t(i,j,k+1,nstp,
isalt)-t(i,j,k,nstp,
isalt)
375 ddds=sign(1.0_r8,ddds)*max(abs(ddds),1.0e-14_r8)
376 rrho=alfaobeta(i,j,k)*dddt/ddds
377
378
379
380 IF ((rrho.gt.1.0_r8).and.(ddds.gt.0.0_r8)) THEN
381
382
383
384
385
387 nu_dds=1.0_r8-((rrho-1.0_r8)/(
lmd_rrho0-1.0_r8))**2
388 nu_dds=
lmd_nuf*nu_dds*nu_dds*nu_dds
389
390
391
392
394
395
396
397 ELSE IF ((0.0_r8.lt.rrho).and.(rrho.lt.1.0_r8).and. &
398 & (ddds.lt.0.0_r8)) THEN
399
400
401
402
403
406 & exp(-
lmd_tdd3*((1.0_r8/rrho)-1.0_r8)))
407
408
409
410
411 IF (rrho.lt.0.5_r8) THEN
413 ELSE
415 END IF
416 ELSE
417 nu_ddt=0.0_r8
418 nu_dds=0.0_r8
419 END IF
420
421
422
423
425# ifdef SALINITY
427# endif
428 END DO
429 END DO
430# endif
431 END DO
432
433 RETURN
integer, dimension(:), allocatable lm
integer, dimension(:), allocatable mm