74 PUBLIC :: background_std
79 SUBROUTINE background_std (ng, tile, Lbck, Lstd)
84 integer,
intent(in) :: ng, tile, Lbck, Lstd
100 CALL background_std_tile (ng, tile, &
101 & lbi, ubi, lbj, ubj, &
102 & imins, imaxs, jmins, jmaxs, &
109 &
grid(ng) % rmask, &
110 &
grid(ng) % umask, &
111 &
grid(ng) % vmask, &
121 &
ocean(ng) % e_ubar, &
122 &
ocean(ng) % e_vbar, &
123 &
ocean(ng) % e_zeta)
126 10
FORMAT (/,2x,
'BACKGROUND_STD - computing standard deviation', &
130 END SUBROUTINE background_std
133 SUBROUTINE background_std_tile (ng, tile, &
134 & LBi, UBi, LBj, UBj, &
135 & IminS, ImaxS, JminS, JmaxS, &
141 & rmask, umask, vmask, &
147 & e_ubar, e_vbar, e_zeta)
152 integer,
intent(in) :: ng, tile
153 integer,
intent(in) :: LBi, UBi, LBj, UBj
154 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
155 integer,
intent(in) :: Lbck, Lstd
159 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
160 real(r8),
intent(in) :: z_r(LBi:,LBj:,:)
163 real(r8),
intent(in) :: rmask(LBi:,LBj:)
164 real(r8),
intent(in) :: umask(LBi:,LBj:)
165 real(r8),
intent(in) :: vmask(LBi:,LBj:)
168 real(r8),
intent(in) :: t(LBi:,LBj:,:,:,:)
169 real(r8),
intent(in) :: u(LBi:,LBj:,:,:)
170 real(r8),
intent(in) :: v(LBi:,LBj:,:,:)
171 real(r8),
intent(inout) :: e_t(LBi:,LBj:,:,:,:)
172 real(r8),
intent(inout) :: e_u(LBi:,LBj:,:,:)
173 real(r8),
intent(inout) :: e_v(LBi:,LBj:,:,:)
175 real(r8),
intent(inout) :: e_ubar(LBi:,LBj:,:)
176 real(r8),
intent(inout) :: e_vbar(LBi:,LBj:,:)
177 real(r8),
intent(inout) :: e_zeta(LBi:,LBj:,:)
182 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
183 real(r8),
intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
186 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
187 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
188 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
191 real(r8),
intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
192 real(r8),
intent(in) :: u(LBi:UBi,LBj:UBj,2,N(ng))
193 real(r8),
intent(in) :: v(LBi:UBi,LBj:UBj,2,N(ng))
194 real(r8),
intent(inout) :: e_t(LBi:UBi,LBj:UBj,N(ng),NSA,NT(ng))
195 real(r8),
intent(inout) :: e_u(LBi:UBi,LBj:UBj,N(ng),NSA)
196 real(r8),
intent(inout) :: e_v(LBi:UBi,LBj:UBj,N(ng),NSA)
198 real(r8),
intent(inout) :: e_ubar(LBi:UBi,LBj:UBj,NSA)
199 real(r8),
intent(inout) :: e_vbar(LBi:UBi,LBj:UBj,NSA)
200 real(r8),
intent(inout) :: e_zeta(LBi:UBi,LBj:UBj,NSA)
206 logical :: base_reached = .false.
207 logical :: ml_reached = .false.
209 integer,
parameter :: Norder = 2
210 integer :: i, j, k, kref, khref, order
212 real(r8) :: Temp_ref, T_dep, T_high, T_low, T_thvalue
213 real(r8) :: sigmabS, sigmabT, sigmabU, SigmabV
214 real(r8) :: cff, cff1, cff2, fac
219 real(r8),
dimension(20) :: filter_coef = &
220 & (/ 2.500000E-1_r8, 6.250000E-2_r8, 1.562500E-2_r8, &
221 & 3.906250E-3_r8, 9.765625E-4_r8, 2.44140625E-4_r8, &
222 & 6.103515625E-5_r8, 1.5258789063E-5_r8, 3.814697E-6_r8, &
223 & 9.536743E-7_r8, 2.384186E-7_r8, 5.960464E-8_r8, &
224 & 1.490116E-8_r8, 3.725290E-9_r8, 9.313226E-10_r8, &
225 & 2.328306E-10_r8, 5.820766E-11_r8, 1.455192E-11_r8, &
226 & 3.637979E-12_r8, 9.094947E-13_r8 /)
228 real(r8),
dimension(N(ng)) :: dSdT, dSdT_filter
230 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: FC
232 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: dTdz
233 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: dUdz
234 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: dVdz
235 real(r8),
dimension(N(ng)) :: dTdz_filter
236 real(r8),
dimension(N(ng)) :: dUdz_filter, dVdz_filter
238 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS,0:N(ng)) :: dSdz
239 real(r8),
dimension(N(ng)) :: dSdz_filter
241 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: mld
243# include "set_bounds.h"
259 cff=1.0_r8/(2.0_r8*hz(i,j,k+1)+ &
260 & hz(i,j,k)*(2.0_r8-fc(i,k-1)))
261 fc(i,k)=cff*hz(i,j,k+1)
262 dtdz(i,j,k)=cff*(6.0_r8*(t(i,j,k+1,lbck,
itemp)- &
263 & t(i,j,k ,lbck,
itemp))- &
264 & hz(i,j,k)*dtdz(i,j,k-1))
266 dsdz(i,j,k)=cff*(6.0_r8*(t(i,j,k+1,lbck,
isalt)- &
267 & t(i,j,k ,lbck,
isalt))- &
268 & hz(i,j,k)*dsdz(i,j,k-1))
273 dtdz(i,j,n(ng))=0.0_r8
275 dsdz(i,j,n(ng))=0.0_r8
280 dtdz(i,j,k)=dtdz(i,j,k)-fc(i,k)*dtdz(i,j,k+1)
282 dsdz(i,j,k)=dsdz(i,j,k)-fc(i,k)*dsdz(i,j,k+1)
291 IF (order.ne.norder/2)
THEN
293 dsdz_filter(1)=2.0_r8*(dsdz(i,j,1)-dsdz(i,j,2))
294 dsdz_filter(n(ng))=2.0_r8*(dsdz(i,j,n(ng) )- &
297 dtdz_filter(1)=2.0_r8*(dtdz(i,j,1)-dtdz(i,j,2))
298 dtdz_filter(n(ng))=2.0_r8*(dtdz(i,j,n(ng) )- &
302 dsdz_filter(1)=0.0_r8
303 dsdz_filter(n(ng))=0.0_r8
305 dtdz_filter(1)=0.0_r8
306 dtdz_filter(n(ng))=0.0_r8
310 dsdz_filter(k)=2.0_r8*dsdz(i,j,k)- &
311 & dsdz(i,j,k-1)-dsdz(i,j,k+1)
313 dtdz_filter(k)=2.0_r8*dtdz(i,j,k)- &
314 & dtdz(i,j,k-1)-dtdz(i,j,k+1)
318 dsdz(i,j,k)=dsdz(i,j,k)- &
319 & filter_coef(norder/2)*dsdz_filter(k)
321 dtdz(i,j,k)=dtdz(i,j,k)- &
322 & filter_coef(norder/2)*dtdz_filter(k)
331 IF ((k.eq.0).or.(k.eq.n(ng)))
THEN
345 cff=1.0_r8/(0.5_r8*(z_r(i-1,j,k+1)-z_r(i-1,j,k)+ &
346 & z_r(i ,j,k+1)-z_r(i ,j,k)))
347 dudz(i,j,k)=cff*(u(i,j,k+1,lbck)- &
353 cff=1.0_r8/(0.5_r8*(z_r(i,j-1,k+1)-z_r(i,j-1,k)+ &
354 & z_r(i,j ,k+1)-z_r(i,j ,k)))
355 dvdz(i,j,k)=cff*(v(i,j,k+1,lbck)- &
367 IF (order.ne.norder/2)
THEN
368 dudz_filter(1)=2.0_r8*(dudz(i,j,1)-dudz(i,j,2))
369 dudz_filter(n(ng))=2.0_r8*(dudz(i,j,n(ng) )- &
372 dudz_filter(1)=0.0_r8
373 dudz_filter(n(ng))=0.0_r8
376 dudz_filter(k)=2.0_r8*dudz(i,j,k)- &
377 & dudz(i,j,k-1)-dudz(i,j,k+1)
380 dudz(i,j,k)=dudz(i,j,k)- &
381 & filter_coef(norder/2)*dudz_filter(k)
392 IF (order.ne.norder/2)
THEN
393 dvdz_filter(1)=2.0_r8*(dvdz(i,j,1)-dvdz(i,j,2))
394 dvdz_filter(n(ng))=2.0_r8*(dvdz(i,j,n(ng) )- &
397 dvdz_filter(1)=0.0_r8
398 dvdz_filter(n(ng))=0.0_r8
401 dvdz_filter(k)=2.0_r8*dvdz(i,j,k)- &
402 & dvdz(i,j,k-1)-dvdz(i,j,k+1)
405 dvdz(i,j,k)=dvdz(i,j,k)- &
406 & filter_coef(norder/2)*dvdz_filter(k)
435 IF ((z_r(i,j,k+1).gt.href).and.(z_r(i,j,k).le.href))
THEN
439 base_reached =.false.
443 t_dep = abs(t(i,j,k+1,lbck,
itemp)-t(i,j,k,lbck,
itemp))/ &
444 & abs(z_r(i,j,k+1)-z_r(i,j,k))
445 IF (.not.base_reached.and.(t_dep.lt.0.01_r8*t_thvalue))
THEN
448 base_reached = .true.
452 IF (.not.base_reached)
THEN
458 IF (kref.eq.khref)
THEN
460 IF ((href.ge.z_r(i,j,k)).and.(href.lt.z_r(i,j,k+1)))
THEN
461 fac=(href-z_r(i,j,k))/(z_r(i,j,k+1)-z_r(i,j,k))
462 temp_ref=fac*t(i,j,k+1,lbck,
itemp)+ &
463 (1.0_r8-fac)*t(i,j,k,lbck,
itemp)
468 temp_ref=t(i,j,kref,lbck,
itemp)
469 mld(i,j)=z_r(i,j,kref)
475 IF (.not.ml_reached.and. &
476 & (abs(t(i,j,k,lbck,
itemp)-temp_ref).gt.t_thvalue))
THEN
477 t_high=abs(t(i,j,k+1,lbck,
itemp)-temp_ref)
478 t_low =abs(t(i,j,k ,lbck,
itemp)-temp_ref)
479 mld(i,j)=((t_thvalue-t_high)*z_r(i,j,k)+ &
480 & (t_low-t_thvalue)*z_r(i,j,k+1))/(t_low-t_high)
485 IF (.not.ml_reached)
THEN
493 mld(i,j)=mld_uniform(ng)
507 cff1=0.5_r8*(dtdz(i,j,k-1)+dtdz(i,j,k))
508 sigmabt=min(abs(sigma_dz(
istvar(
itemp),ng)*cff1), &
510 IF (z_r(i,j,k).ge.mld(i,j))
THEN
515 e_t(i,j,k,lstd,
itemp)=sigmabt
517 e_t(i,j,k,lstd,
itemp)=e_t(i,j,k,lstd,
itemp)*rmask(i,j)
520 cff2=0.5_r8*(dsdz(i,j,k-1)+dsdz(i,j,k))
521 sigmabs=min(abs(sigma_dz(
istvar(
isalt),ng)*cff2), &
523 IF (z_r(i,j,k).ge.mld(i,j))
THEN
528 e_t(i,j,k,lstd,
isalt)=sigmabs
530 e_t(i,j,k,lstd,
isalt)=e_t(i,j,k,lstd,
isalt)*rmask(i,j)
542 cff=0.5_r8*(dudz(i,j,k-1)+dudz(i,j,k))
543 sigmabu=min(abs(sigma_dz(
isuvel,ng)*cff), &
545 IF (z_r(i,j,k).ge.mld(i,j))
THEN
546 sigmabu=max(sigmabu, sigma_ml(
isuvel,ng))
548 sigmabu=max(sigmabu, sigma_do(
isuvel,ng))
550 e_u(i,j,k,lstd)=sigmabu
552 e_u(i,j,k,lstd)=e_u(i,j,k,lstd)*umask(i,j)
563 cff=0.5_r8*(dvdz(i,j,k-1)+dvdz(i,j,k))
564 sigmabv=min(abs(sigma_dz(
isvvel,ng)*cff), &
566 IF (z_r(i,j,k).ge.mld(i,j))
THEN
567 sigmabv=max(sigmabv, sigma_ml(
isvvel,ng))
569 sigmabv=max(sigmabv, sigma_do(
isvvel,ng))
571 e_v(i,j,k,lstd)=sigmabv
573 e_v(i,j,k,lstd)=e_v(i,j,k,lstd)*vmask(i,j)
584 e_ubar(i,j,lstd)=sigma_max(
isubar,ng)
586 e_ubar(i,j,lstd)=e_ubar(i,j,lstd)*umask(i,j)
593 e_vbar(i,j,lstd)=sigma_max(
isvbar,ng)
595 e_vbar(i,j,lstd)=e_vbar(i,j,lstd)*vmask(i,j)
604 e_zeta(i,j,lstd)=sigma_max(
isfsur,ng)
606 e_zeta(i,j,lstd)=e_zeta(i,j,lstd)*rmask(i,j)
615 & lbi, ubi, lbj, ubj, 1, n(ng), &
616 & e_t(:,:,:,lstd,
itemp))
619 & lbi, ubi, lbj, ubj, 1, n(ng), &
620 & e_t(:,:,:,lstd,
isalt))
624 & lbi, ubi, lbj, ubj, 1, n(ng), &
627 & lbi, ubi, lbj, ubj, 1, n(ng), &
630 & lbi, ubi, lbj, ubj, &
633 & lbi, ubi, lbj, ubj, &
636 & lbi, ubi, lbj, ubj, &
643 & lbi, ubi, lbj, ubj, 1, n(ng), &
646 & e_t(:,:,:,lstd,
itemp))
649 & lbi, ubi, lbj, ubj, 1, n(ng), &
652 & e_t(:,:,:,lstd,
isalt))
655 & lbi, ubi, lbj, ubj, 1, n(ng), &
661 & lbi, ubi, lbj, ubj, &
664 & e_ubar(:,:,lstd), &
665 & e_vbar(:,:,lstd), &
670 END SUBROUTINE background_std_tile
subroutine exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine exchange_u2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine exchange_v2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine exchange_u3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
subroutine exchange_r3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
subroutine exchange_v3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
type(t_coupling), dimension(:), allocatable coupling
type(t_grid), dimension(:), allocatable grid
integer, dimension(:), allocatable istvar
type(t_ocean), dimension(:), allocatable ocean
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
subroutine mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine mp_exchange3d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine, public set_depth(ng, tile, model)