Calculates the vertical background diffusivities/viscosities.
377 type(ocean_grid_type),
intent(in) :: G
378 type(verticalGrid_type),
intent(in) :: GV
379 type(unit_scale_type),
intent(in) :: US
380 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
381 type(thermo_var_ptrs),
intent(in) :: tv
382 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: N2_lay
384 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(inout) :: Kd_lay
386 real,
dimension(:,:,:),
pointer :: Kv
388 integer,
intent(in) :: j
389 type(bkgnd_mixing_cs),
pointer :: CS
393 real,
dimension(SZK_(G)+1) :: depth_int
394 real,
dimension(SZK_(G)+1) :: Kd_col
395 real,
dimension(SZK_(G)+1) :: Kv_col
396 real,
dimension(SZI_(G)) :: depth
406 real :: bckgrnd_vdc_psin
407 real :: bckgrnd_vdc_psis
408 integer :: i, k, is, ie, js, je, nz
410 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
413 deg_to_rad = atan(1.0)/45.0
417 if (cs%Bryan_Lewis_diffusivity)
then
422 depth_int(k) = depth_int(k-1) + gv%H_to_m*h(i,j,k-1)
425 call cvmix_init_bkgnd(max_nlev=nz, &
427 bl1 = cs%Bryan_Lewis_c1, &
428 bl2 = cs%Bryan_Lewis_c2, &
429 bl3 = cs%Bryan_Lewis_c3, &
430 bl4 = cs%Bryan_Lewis_c4, &
431 prandtl = cs%prandtl_bkgnd)
433 kd_col(:) = 0.0 ; kv_col(:) = 0.0
434 call cvmix_coeffs_bkgnd(mdiff_out=kv_col, tdiff_out=kd_col, nlev=nz, max_nlev=nz)
438 cs%Kv_bkgnd(i,j,k) = us%m2_s_to_Z2_T*kv_col(k)
439 cs%Kd_bkgnd(i,j,k) = us%m2_s_to_Z2_T*kd_col(k)
442 kd_lay(i,j,k) = kd_lay(i,j,k) + 0.5 * us%m2_s_to_Z2_T * (kd_col(k) + kd_col(k+1))
446 elseif ((.not. cs%Bryan_Lewis_diffusivity) .and. (.not.cs%bulkmixedlayer) .and. &
447 (.not. cs%horiz_varying_background) .and. (cs%Kd /= cs%Kdml))
then
448 i_hmix = 1.0 / cs%Hmix
449 do i=is,ie ; depth(i) = 0.0 ;
enddo
450 do k=1,nz ;
do i=is,ie
451 depth_c = depth(i) + 0.5*gv%H_to_Z*h(i,j,k)
452 if (depth_c <= cs%Hmix)
then ; cs%Kd_bkgnd(i,j,k) = cs%Kdml
453 elseif (depth_c >= 2.0*cs%Hmix)
then ; cs%Kd_bkgnd(i,j,k) = cs%Kd_sfc(i,j)
455 kd_lay(i,j,k) = ((cs%Kd_sfc(i,j) - cs%Kdml) * i_hmix) * depth_c + &
456 (2.0*cs%Kdml - cs%Kd_sfc(i,j))
459 depth(i) = depth(i) + gv%H_to_Z*h(i,j,k)
462 elseif (cs%horiz_varying_background)
then
465 bckgrnd_vdc_psis = cs%bckgrnd_vdc_psim * exp(-(0.4*(g%geoLatT(i,j)+28.9))**2)
466 bckgrnd_vdc_psin = cs%bckgrnd_vdc_psim * exp(-(0.4*(g%geoLatT(i,j)-28.9))**2)
468 cs%Kd_bkgnd(i,j,:) = cs%bckgrnd_vdc_eq + bckgrnd_vdc_psin + bckgrnd_vdc_psis
470 if (g%geoLatT(i,j) < -10.0)
then
471 cs%Kd_bkgnd(i,j,:) = cs%Kd_bkgnd(i,j,:) + cs%bckgrnd_vdc1
472 elseif (g%geoLatT(i,j) <= 10.0)
then
473 cs%Kd_bkgnd(i,j,:) = cs%Kd_bkgnd(i,j,:) + cs%bckgrnd_vdc1 * (g%geoLatT(i,j)/10.0)**2
475 cs%Kd_bkgnd(i,j,:) = cs%Kd_bkgnd(i,j,:) + cs%bckgrnd_vdc1
479 if ( (g%geoLatT(i,j) < -1.0) .and. (g%geoLatT(i,j) > -4.0) .and. &
480 ( mod(g%geoLonT(i,j)+360.0,360.0) > 103.0) .and. &
481 ( mod(g%geoLonT(i,j)+360.0,360.0) < 134.0) )
then
482 cs%Kd_bkgnd(i,j,:) = cs%bckgrnd_vdc_Banda
486 if ( (g%geoLatT(i,j) <= -4.0) .and. (g%geoLatT(i,j) > -7.0) .and. &
487 ( mod(g%geoLonT(i,j)+360.0,360.0) > 106.0) .and. &
488 ( mod(g%geoLonT(i,j)+360.0,360.0) < 140.0) )
then
489 cs%Kd_bkgnd(i,j,:) = cs%bckgrnd_vdc_Banda
493 if ( (g%geoLatT(i,j) <= -7.0) .and. (g%geoLatT(i,j) > -8.3) .and. &
494 ( mod(g%geoLonT(i,j)+360.0,360.0) > 111.0) .and. &
495 ( mod(g%geoLonT(i,j)+360.0,360.0) < 142.0) )
then
496 cs%Kd_bkgnd(i,j,:) = cs%bckgrnd_vdc_Banda
500 cs%kv_bkgnd(i,j,:) = cs%Kd_bkgnd(i,j,:) * cs%prandtl_bkgnd
503 kd_lay(i,j,:) = cs%Kd_bkgnd(i,j,1)
507 elseif (cs%Henyey_IGW_background_new)
then
508 i_x30 = 2.0 / invcosh(cs%N0_2Omega*2.0)
509 i_2omega = 0.5 / cs%omega
510 do k=1,nz ;
do i=is,ie
511 abs_sin = max(epsilon, abs(sin(g%geoLatT(i,j)*deg_to_rad)))
512 n_2omega = max(abs_sin, sqrt(n2_lay(i,k))*i_2omega)
513 n02_n2 = (cs%N0_2Omega/n_2omega)**2
514 kd_lay(i,j,k) = max(cs%Kd_min, cs%Kd_sfc(i,j) * &
515 ((abs_sin * invcosh(n_2omega/abs_sin)) * i_x30)*n02_n2)
519 do k=1,nz ;
do i=is,ie
520 kd_lay(i,j,k) = cs%Kd_sfc(i,j)
525 if (.not. (cs%Bryan_Lewis_diffusivity .or. cs%horiz_varying_background))
then
527 cs%kd_bkgnd(i,j,1) = 0.0; cs%kv_bkgnd(i,j,1) = 0.0
528 cs%kd_bkgnd(i,j,nz+1) = 0.0; cs%kv_bkgnd(i,j,nz+1) = 0.0
530 cs%Kd_bkgnd(i,j,k) = 0.5*(kd_lay(i,j,k-1) + kd_lay(i,j,k))
531 cs%Kv_bkgnd(i,j,k) = cs%Kd_bkgnd(i,j,k) * cs%prandtl_bkgnd
537 if (
associated(kv))
then
538 do k=1,nz+1 ;
do i=is,ie
539 kv(i,j,k) = kv(i,j,k) + cs%Kv_bkgnd(i,j,k)