Calculates the vertical background diffusivities/viscosities.
313 type(ocean_grid_type),
intent(in) :: g
314 type(verticalgrid_type),
intent(in) :: gv
315 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)),
intent(in) :: h
316 type(thermo_var_ptrs),
intent(in) :: tv
317 real,
dimension(SZI_(G),SZK_(GV)),
intent(in) :: n2_lay
319 real,
dimension(SZI_(G),SZK_(GV)),
intent(out) :: kd_lay
321 real,
dimension(SZI_(G),SZK_(GV)+1),
intent(out) :: kd_int
323 real,
dimension(SZI_(G),SZK_(GV)+1),
intent(out) :: kv_bkgnd
325 integer,
intent(in) :: j
326 type(unit_scale_type),
intent(in) :: us
327 type(bkgnd_mixing_cs),
pointer :: cs
331 real,
dimension(SZK_(GV)+1) :: depth_int
332 real,
dimension(SZK_(GV)+1) :: kd_col
333 real,
dimension(SZK_(GV)+1) :: kv_col
334 real,
dimension(SZI_(G)) :: kd_sfc
335 real,
dimension(SZI_(G)) :: depth
345 real :: bckgrnd_vdc_psin
346 real :: bckgrnd_vdc_psis
347 integer :: i, k, is, ie, js, je, nz
349 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
352 deg_to_rad = atan(1.0)/45.0
360 if (cs%Bryan_Lewis_diffusivity)
then 365 depth_int(k) = depth_int(k-1) + gv%H_to_m*h(i,j,k-1)
368 call cvmix_init_bkgnd(max_nlev=nz, &
370 bl1 = cs%Bryan_Lewis_c1, &
371 bl2 = cs%Bryan_Lewis_c2, &
372 bl3 = cs%Bryan_Lewis_c3, &
373 bl4 = cs%Bryan_Lewis_c4, &
374 prandtl = cs%prandtl_bkgnd)
376 kd_col(:) = 0.0 ; kv_col(:) = 0.0
377 call cvmix_coeffs_bkgnd(mdiff_out=kv_col, tdiff_out=kd_col, nlev=nz, max_nlev=nz)
381 kv_bkgnd(i,k) = us%m2_s_to_Z2_T*kv_col(k)
382 kd_int(i,k) = us%m2_s_to_Z2_T*kd_col(k)
385 kd_lay(i,k) = kd_lay(i,k) + 0.5 * us%m2_s_to_Z2_T * (kd_col(k) + kd_col(k+1))
389 elseif (cs%horiz_varying_background)
then 392 bckgrnd_vdc_psis = cs%bckgrnd_vdc_psim * exp(-(0.4*(g%geoLatT(i,j)+28.9))**2)
393 bckgrnd_vdc_psin = cs%bckgrnd_vdc_psim * exp(-(0.4*(g%geoLatT(i,j)-28.9))**2)
394 kd_int(i,1) = (cs%bckgrnd_vdc_eq + bckgrnd_vdc_psin) + bckgrnd_vdc_psis
396 if (g%geoLatT(i,j) < -10.0)
then 397 kd_int(i,1) = kd_int(i,1) + cs%bckgrnd_vdc1
398 elseif (g%geoLatT(i,j) <= 10.0)
then 399 kd_int(i,1) = kd_int(i,1) + cs%bckgrnd_vdc1 * (g%geoLatT(i,j)/10.0)**2
401 kd_int(i,1) = kd_int(i,1) + cs%bckgrnd_vdc1
405 if ( (g%geoLatT(i,j) < -1.0) .and. (g%geoLatT(i,j) > -4.0) .and. &
406 ( mod(g%geoLonT(i,j)+360.0,360.0) > 103.0) .and. &
407 ( mod(g%geoLonT(i,j)+360.0,360.0) < 134.0) )
then 408 kd_int(i,1) = cs%bckgrnd_vdc_Banda
412 if ( (g%geoLatT(i,j) <= -4.0) .and. (g%geoLatT(i,j) > -7.0) .and. &
413 ( mod(g%geoLonT(i,j)+360.0,360.0) > 106.0) .and. &
414 ( mod(g%geoLonT(i,j)+360.0,360.0) < 140.0) )
then 415 kd_int(i,1) = cs%bckgrnd_vdc_Banda
419 if ( (g%geoLatT(i,j) <= -7.0) .and. (g%geoLatT(i,j) > -8.3) .and. &
420 ( mod(g%geoLonT(i,j)+360.0,360.0) > 111.0) .and. &
421 ( mod(g%geoLonT(i,j)+360.0,360.0) < 142.0) )
then 422 kd_int(i,1) = cs%bckgrnd_vdc_Banda
427 do k=1,nz+1 ;
do i=is,ie
428 kd_int(i,k) = kd_int(i,1)
429 kv_bkgnd(i,k) = kd_int(i,1) * cs%prandtl_bkgnd
431 do k=1,nz ;
do i=is,ie
432 kd_lay(i,k) = kd_int(i,1)
435 elseif (cs%Henyey_IGW_background_new)
then 436 i_x30 = 2.0 / invcosh(cs%N0_2Omega*2.0)
437 i_2omega = 0.5 / cs%omega
438 do k=1,nz ;
do i=is,ie
439 abs_sinlat = max(min_sinlat, abs(sin(g%geoLatT(i,j)*deg_to_rad)))
440 n_2omega = max(abs_sinlat, sqrt(n2_lay(i,k))*i_2omega)
441 n02_n2 = (cs%N0_2Omega/n_2omega)**2
442 kd_lay(i,k) = max(cs%Kd_min, cs%Kd * &
443 ((abs_sinlat * invcosh(n_2omega/abs_sinlat)) * i_x30)*n02_n2)
447 kd_int(i,1) = 0.0; kv_bkgnd(i,1) = 0.0
448 kd_int(i,nz+1) = 0.0; kv_bkgnd(i,nz+1) = 0.0
450 do k=2,nz ;
do i=is,ie
451 kd_int(i,k) = 0.5*(kd_lay(i,k-1) + kd_lay(i,k))
452 kv_bkgnd(i,k) = kd_int(i,k) * cs%prandtl_bkgnd
456 if (cs%Henyey_IGW_background)
then 457 i_x30 = 2.0 / invcosh(cs%N0_2Omega*2.0)
459 abs_sinlat = abs(sin(g%geoLatT(i,j)*deg_to_rad))
460 kd_sfc(i) = max(cs%Kd_min, cs%Kd * &
461 ((abs_sinlat * invcosh(cs%N0_2Omega / max(min_sinlat, abs_sinlat))) * i_x30) )
463 elseif (cs%Kd_tanh_lat_fn)
then 468 kd_sfc(i) = max(cs%Kd_min, cs%Kd * (1.0 + &
469 cs%Kd_tanh_lat_scale * 0.5*tanh((abs(g%geoLatT(i,j)) - 35.0)/5.0) ))
478 if ((.not.cs%bulkmixedlayer) .and. (cs%Kd /= cs%Kdml))
then 481 i_hmix = 1.0 / (cs%Hmix + gv%H_subroundoff*gv%H_to_Z)
482 do i=is,ie ; depth(i) = 0.0 ;
enddo 483 do k=1,nz ;
do i=is,ie
484 depth_c = depth(i) + 0.5*gv%H_to_Z*h(i,j,k)
485 if (cs%Kd_via_Kdml_bug)
then 488 if (depth_c <= cs%Hmix)
then ; kd_int(i,k) = cs%Kdml
489 elseif (depth_c >= 2.0*cs%Hmix)
then ; kd_int(i,k) = kd_sfc(i)
491 kd_lay(i,k) = ((kd_sfc(i) - cs%Kdml) * i_hmix) * depth_c + (2.0*cs%Kdml - kd_sfc(i))
494 if (depth_c <= cs%Hmix)
then ; kd_lay(i,k) = cs%Kdml
495 elseif (depth_c >= 2.0*cs%Hmix)
then ; kd_lay(i,k) = kd_sfc(i)
497 kd_lay(i,k) = ((kd_sfc(i) - cs%Kdml) * i_hmix) * depth_c + (2.0*cs%Kdml - kd_sfc(i))
501 depth(i) = depth(i) + gv%H_to_Z*h(i,j,k)
505 do k=1,nz ;
do i=is,ie
506 kd_lay(i,k) = kd_sfc(i)
512 kd_int(i,1) = 0.0; kv_bkgnd(i,1) = 0.0
513 kd_int(i,nz+1) = 0.0; kv_bkgnd(i,nz+1) = 0.0
515 do k=2,nz ;
do i=is,ie
516 kd_int(i,k) = 0.5*(kd_lay(i,k-1) + kd_lay(i,k))
517 kv_bkgnd(i,k) = kd_int(i,k) * cs%prandtl_bkgnd