80 implicit none ;
private 82 #include <MOM_memory.h> 87 logical :: bulkmixedlayer
90 logical :: correct_density
98 integer :: id_kd = -1, id_diff_work = -1
109 subroutine entrainment_diffusive(u, v, h, tv, fluxes, dt, G, GV, CS, ea, eb, &
110 kb_out, Kd_Lay, Kd_int)
113 real,
dimension(SZIB_(G),SZJ_(G),SZK_(G)), &
115 real,
dimension(SZI_(G),SZJB_(G),SZK_(G)), &
117 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
122 type(
forcing),
intent(in) :: fluxes
124 real,
intent(in) :: dt
127 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
131 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
135 integer,
dimension(SZI_(G),SZJ_(G)), &
136 optional,
intent(inout) :: kb_out
139 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
140 optional,
intent(in) :: Kd_Lay
142 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1), &
143 optional,
intent(in) :: Kd_int
176 real,
dimension(SZI_(G),SZK_(G)) :: &
179 real,
dimension(SZI_(G),SZK_(G)+1) :: &
182 real,
dimension(SZI_(G),SZK_(G)) :: &
195 real,
dimension(SZI_(G),SZK_(G)+1) :: &
198 real,
allocatable,
dimension(:,:,:) :: &
205 real :: hm, fm, fr, fk
208 real :: c1(szi_(g),szk_(g))
210 real,
dimension(SZI_(G)) :: &
241 real,
dimension(SZI_(G),SZK_(G)) :: &
249 real,
dimension(SZI_(G),SZK_(G)) :: &
263 real,
dimension(SZI_(G)) :: &
285 real :: H_to_m, m_to_H
288 logical :: do_i(szi_(g)), did_i(szi_(g)), reiterate, correct_density
289 integer :: it, i, j, k, is, ie, js, je, nz, K2, kmb
290 integer :: kb(szi_(g))
292 integer :: kb_min_act
294 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
295 angstrom = gv%Angstrom
296 h_neglect = gv%H_subroundoff
298 if (.not.
associated(cs))
call mom_error(fatal, &
299 "MOM_entrain_diffusive: Module must be initialized before it is used.")
301 if (.not.(
present(kd_lay) .or.
present(kd_int)))
call mom_error(fatal, &
302 "MOM_entrain_diffusive: Either Kd_Lay or Kd_int must be present in call.")
304 if ((.not.cs%bulkmixedlayer .and. .not.
ASSOCIATED(fluxes%buoy)) .and. &
305 (
ASSOCIATED(fluxes%lprec) .or.
ASSOCIATED(fluxes%evap) .or. &
306 ASSOCIATED(fluxes%sens) .or.
ASSOCIATED(fluxes%sw)))
then 308 &The code to handle evaporation and precipitation without & 309 &a bulk mixed layer has not been implemented.")
311 "Either define BULKMIXEDLAYER in MOM_input or use fluxes%buoy & 312 &and a linear equation of state to drive the model.")
315 h_to_m = gv%H_to_m ; m_to_h = gv%m_to_H
316 tolerance = m_to_h * cs%Tolerance_Ent
317 g_2dt = 0.5 * gv%g_Earth / dt
318 kmb = gv%nk_rho_varies
319 k2 = max(kmb+1,2) ; kb_min = k2
320 if (.not. cs%bulkmixedlayer)
then 324 do i=is,ie ; ds_dsp1(i,nz) = 2.0 ; dsp1_ds(i,nz) = 0.5 ;
enddo 327 do i=is,ie ; ds_dsp1(i,nz) = 0.0 ; dsp1_ds(i,nz) = 0.0 ;
enddo 330 if (cs%id_diff_work > 0)
allocate(diff_work(g%isd:g%ied,g%jsd:g%jed,nz+1))
331 if (cs%id_Kd > 0)
allocate(kd_eff(g%isd:g%ied,g%jsd:g%jed,nz))
333 correct_density = (cs%correct_density .and.
associated(tv%eqn_of_state))
334 if (correct_density)
then 357 do i=is,ie ; kb(i) = 1 ;
enddo 359 if (
present(kd_lay))
then 360 do k=1,nz ;
do i=is,ie
361 dtkd(i,k) = m_to_h**2 * (dt*kd_lay(i,j,k))
363 if (
present(kd_int))
then 364 do k=1,nz+1 ;
do i=is,ie
365 dtkd_int(i,k) = m_to_h**2 * (dt*kd_int(i,j,k))
368 do k=2,nz ;
do i=is,ie
369 dtkd_int(i,k) = m_to_h**2 * (0.5*dt*(kd_lay(i,j,k-1) + kd_lay(i,j,k)))
373 do k=1,nz ;
do i=is,ie
374 dtkd(i,k) = m_to_h**2 * (0.5*dt*(kd_int(i,j,k)+kd_int(i,j,k+1)))
376 dO k=1,nz+1 ;
do i=is,ie
377 dtkd_int(i,k) = m_to_h**2 * (dt*kd_int(i,j,k))
381 do i=is,ie ; do_i(i) = (g%mask2dT(i,j) > 0.5) ;
enddo 382 do i=is,ie ; ds_dsp1(i,nz) = 0.0 ;
enddo 383 do i=is,ie ; dsp1_ds(i,nz) = 0.0 ;
enddo 385 do k=2,nz-1 ;
do i=is,ie
386 ds_dsp1(i,k) = gv%g_prime(k) / gv%g_prime(k+1)
389 if (cs%bulkmixedlayer)
then 393 call set_ent_bl(h, dtkd_int, tv, kb, kmb, do_i, g, gv, cs, j, ent_bl, sref, h_bl)
396 dtkd_kb(i) = 0.0 ;
if (kb(i) < nz) dtkd_kb(i) = dtkd(i,kb(i))
399 do i=is,ie ; ent_bl(i,kmb+1) = 0.0 ;
enddo 402 do k=2,nz-1 ;
do i=is,ie
403 dsp1_ds(i,k) = 1.0 / ds_dsp1(i,k)
404 i2p2dsp1_ds(i,k) = 0.5/(1.0+dsp1_ds(i,k))
405 grats(i,k) = 2.0*(2.0+(dsp1_ds(i,k)+ds_dsp1(i,k)))
411 if (cs%bulkmixedlayer)
then 414 htot(i) = h(i,j,1) - angstrom
416 do k=2,kmb ;
do i=is,ie
417 htot(i) = htot(i) + (h(i,j,k) - angstrom)
420 max_eakb(i) = max(ent_bl(i,kmb+1) + 0.5*htot(i), htot(i))
421 i_dskbp1(i) = 1.0 / (sref(i,kmb+2) - sref(i,kmb+1))
429 call find_maxf_kb(h_bl, sref, ent_bl, i_dskbp1, zeros, max_eakb, kmb, &
430 is, ie, g, gv, cs, maxf_kb, eakb_maxf, do_i, f_kb_maxent)
431 do i=is,ie ;
if (kb(i) <= nz)
then 432 maxf(i,kb(i)) = max(0.0, maxf_kb(i), f_kb_maxent(i))
433 if ((maxf_kb(i) > f_kb_maxent(i)) .and. (eakb_maxf(i) >= htot(i))) &
434 max_eakb(i) = eakb_maxf(i)
437 do i=is,ie ; ea_kbp1(i) = 0.0 ; eakb(i) = max_eakb(i) ;
enddo 439 max_eakb, max_eakb, kmb, is, ie, do_i, g, gv, cs, eakb, &
440 error=err_max_eakb0, f_kb=f_kb)
444 do i=is,ie ; min_eakb(i) = min(htot(i), max_eakb(i)) ;
enddo 445 call find_maxf_kb(h_bl, sref, ent_bl, i_dskbp1, min_eakb, max_eakb, &
446 kmb, is, ie, g, gv, cs, f_kb_maxent, do_i_in = do_i)
449 if ((.not.do_i(i)) .or. (err_max_eakb0(i) >= 0.0))
then 450 eakb(i) = 0.0 ; min_eakb(i) = 0.0
452 eakb(i) = max_eakb(i) ; min_eakb(i) = max_eakb(i)
460 zeros, max_eakb, kmb, is, ie, do_i, g, gv, cs, min_eakb, &
461 error=err_min_eakb0, f_kb=f_kb, err_max_eakb0=err_max_eakb0)
463 do i=is,ie ;
if ((kb(i)<nz) .and. (kb_min>kb(i))) kb_min = kb(i) ;
enddo 472 htot(i) = h(i,j,1) - angstrom
474 if (
ASSOCIATED(fluxes%buoy))
then ;
do i=is,ie
475 maxf(i,1) = (dt*fluxes%buoy(i,j)) / gv%g_prime(2)
481 do k=kb_min,nz-1 ;
do i=is,ie
482 if ((k == kb(i)+1) .and. cs%bulkmixedlayer)
then 483 maxf(i,k) = ds_dsp1(i,k)*(f_kb_maxent(i) + htot(i))
484 htot(i) = htot(i) + (h(i,j,k) - angstrom)
485 elseif (k > kb(i))
then 486 maxf(i,k) = ds_dsp1(i,k)*(maxf(i,k-1) + htot(i))
487 htot(i) = htot(i) + (h(i,j,k) - angstrom)
492 if (.not.cs%bulkmixedlayer)
then 493 maxf_correct(i) = max(0.0, -(maxf(i,nz-1) + htot(i)))
495 htot(i) = h(i,j,nz) - angstrom
497 if (.not.cs%bulkmixedlayer)
then 498 do_any = .false. ;
do i=is,ie ;
if (maxf_correct(i) > 0.0) do_any = .true. ;
enddo 500 do k=nz-1,1,-1 ;
do i=is,ie
501 maxf(i,k) = maxf(i,k) + maxf_correct(i)
502 maxf_correct(i) = maxf_correct(i) * dsp1_ds(i,k)
506 do k=nz-1,kb_min,-1 ;
do i=is,ie ;
if (do_i(i))
then 508 maxf(i,k) = min(maxf(i,k),dsp1_ds(i,k+1)*maxf(i,k+1) + htot(i))
509 htot(i) = htot(i) + (h(i,j,k) - angstrom)
510 if ( (k == kb(i)) .and. ((maxf(i,k) < f_kb(i)) .or. &
511 (maxf(i,k) < maxf_kb(i)) .and. (eakb_maxf(i) <= max_eakb(i))) )
then 516 if ((f_kb(i) <= maxf_kb(i)) .and. (eakb_maxf(i) <= max_eakb(i)))
then 517 eakb(i) = eakb_maxf(i)
519 eakb(i) = max_eakb(i)
521 call f_kb_to_ea_kb(h_bl, sref, ent_bl, i_dskbp1, f_kb, kmb, i, &
522 g, gv, cs, eakb, angstrom)
523 if ((eakb(i) < max_eakb(i)) .or. (eakb(i) < min_eakb(i)))
then 525 eakb, eakb, kmb, i, i, do_i, g, gv, cs, eakb, &
527 if (eakb(i) < max_eakb(i))
then 528 max_eakb(i) = eakb(i) ; err_max_eakb0(i) = err_eakb0(i)
530 if (eakb(i) < min_eakb(i))
then 531 min_eakb(i) = eakb(i) ; err_min_eakb0(i) = err_eakb0(i)
536 endif ;
enddo ;
enddo 537 if (.not.cs%bulkmixedlayer)
then 539 maxf(i,1) = min(maxf(i,1),dsp1_ds(i,2)*maxf(i,2) + htot(i))
550 f(i,nz) = maxf(i,nz) ; minf(i,nz) = 0.0
554 if ((k==kb(i)) .and. (do_i(i)))
then 555 eakb(i) = min_eakb(i)
557 elseif ((k>kb(i)) .and. (do_i(i)))
then 562 hm = h(i,j,k) + h_neglect
565 f(i,k) = min(maxf(i,k), sqrt(ds_dsp1(i,k)*dtkd(i,k)), &
566 0.5*(ds_dsp1(i,k)+1.0) * (dtkd(i,k) / hm))
571 fk = dtkd(i,k) * grats(i,k)
572 minf(i,k) = min(maxf(i,k), &
573 0.9*(i2p2dsp1_ds(i,k) * fk / (hm + sqrt(hm*hm + fk))))
574 if (k==kb(i)) minf(i,k) = 0.0
584 is1 = ie+1 ; ie1 = is-1
585 do i=is,ie ;
if (do_i(i))
then ; is1 = i ;
exit ;
endif ;
enddo 586 do i=ie,is,-1 ;
if (do_i(i))
then ; ie1 = i ;
exit ;
endif ;
enddo 588 if (cs%bulkmixedlayer)
then 591 if (do_i(i) .and. (kb(i) < kb_min_act)) kb_min_act = kb(i)
598 if (do_i(i) .and. (kb(i) < nz)) &
599 ea_kbp1(i) = dsp1_ds(i,kb(i)+1)*f(i,kb(i)+1)
601 call determine_ea_kb(h_bl, dtkd_kb, sref, i_dskbp1, ent_bl, ea_kbp1, min_eakb, &
602 max_eakb, kmb, is1, ie1, do_i, g, gv, cs, eakb, f_kb=f_kb, &
603 err_max_eakb0=err_max_eakb0, err_min_eakb0=err_min_eakb0, &
609 do it=0,cs%max_ent_it-1
610 do i=is1,ie1 ;
if (do_i(i))
then 611 if (.not.cs%bulkmixedlayer) f(i,1) = min(f(i,1),maxf(i,1))
617 do k=kb_min_act,nz-1 ;
do i=is1,ie1 ;
if (do_i(i) .and. (k>=kb(i)))
then 619 if (cs%bulkmixedlayer .and. (k==kb(i)))
then 621 dfdfm(i,k) = dfdfm_kb(i)
624 fm = (f(i,k-1) - h(i,j,k)) + dsp1_ds(i,k+1)*f(i,k+1)
625 fk = grats(i,k)*dtkd(i,k)
626 fr = sqrt(fm*fm + fk)
629 f(i,k) = min(maxf(i,k), i2p2dsp1_ds(i,k) * (fm+fr))
631 f(i,k) = min(maxf(i,k), i2p2dsp1_ds(i,k) * (fk / (-1.0*fm+fr)))
634 if ((f(i,k) >= maxf(i,k)) .or. (fr == 0.0))
then 637 dfdfm(i,k) = i2p2dsp1_ds(i,k) * ((fr + fm) / fr)
642 c1(i,k) = dfdfm(i,k-1)*(dsp1_ds(i,k)*b1(i))
643 b1(i) = 1.0 / (1.0 - c1(i,k)*dfdfm(i,k))
644 f(i,k) = min(b1(i)*(f(i,k)-fprev(i,k)) + fprev(i,k), maxf(i,k))
645 if (f(i,k) >= maxf(i,k)) dfdfm(i,k) = 0.0
648 endif ;
enddo ;
enddo 650 do k=nz-2,kb_min_act,-1 ;
do i=is1,ie1
651 if (do_i(i) .and. (k > kb(i))) &
652 f(i,k) = min((f(i,k)+c1(i,k+1)*(f(i,k+1)-fprev(i,k+1))),maxf(i,k))
655 if (cs%bulkmixedlayer)
then 657 if (do_i(i) .and. (kb(i) < nz))
then 659 ea_kbp1(i) = dsp1_ds(i,kb(i)+1)*max(f(i,kb(i)+1), minf(i,kb(i)+1))
664 call determine_ea_kb(h_bl, dtkd_kb, sref, i_dskbp1, ent_bl, ea_kbp1, min_eakb, &
665 max_eakb, kmb, is1, ie1, do_i, g, gv, cs, eakb, f_kb=f_kb, &
666 err_max_eakb0=err_max_eakb0, err_min_eakb0=err_min_eakb0, &
669 if (do_i(i) .and. (kb(i) < nz)) f(i,kb(i)) = f_kb(i)
674 if (it < cs%max_ent_it-1)
then 677 if (cs%bulkmixedlayer)
then ;
do i=is1,ie1 ;
if (do_i(i))
then 678 eb_kmb(i) = max(2.0*ent_bl(i,kmb+1) - eakb(i), 0.0)
679 endif ;
enddo ;
endif 681 did_i(i) = do_i(i) ; do_i(i) = .false.
683 do k=kb_min_act,nz-1 ;
do i=is1,ie1
684 if (did_i(i) .and. (k >= kb(i)))
then 685 if (f(i,k) < minf(i,k))
then 687 do_i(i) = .true. ; reiterate = .true.
688 elseif (k > kb(i))
then 689 if ((abs(f(i,k) - fprev(i,k)) > tolerance) .or. &
690 ((h(i,j,k) + ((1.0+dsp1_ds(i,k))*f(i,k) - &
691 (f(i,k-1) + dsp1_ds(i,k+1)*f(i,k+1)))) < 0.9*angstrom))
then 692 do_i(i) = .true. ; reiterate = .true.
698 if (h(i,j,k) + ((f(i,k) + eakb(i)) - &
699 (eb_kmb(i) + dsp1_ds(i,k+1)*f(i,k+1))) < 0.9*angstrom)
then 700 do_i(i) = .true. ; reiterate = .true.
705 if (.not.reiterate)
exit 711 if (it == (cs%max_ent_it))
then 714 do i=is1,ie1 ;
if (do_i(i))
then 715 f(i,nz-1) = max(f(i,nz-1), min(minf(i,nz-1), 0.0))
716 if (kb(i) >= nz-1)
then ; ea_kbp1(i) = 0.0 ;
endif 718 do k=nz-2,kb_min_act,-1 ;
do i=is1,ie1 ;
if (do_i(i))
then 720 f(i,k) = min(max(minf(i,k),f(i,k)), (dsp1_ds(i,k+1)*f(i,k+1) + &
721 max(((f(i,k+1)-dsp1_ds(i,k+2)*f(i,k+2)) + &
722 (h(i,j,k+1) - angstrom)), 0.5*(h(i,j,k+1)-angstrom))))
723 elseif (k==kb(i))
then 724 ea_kbp1(i) = dsp1_ds(i,k+1)*f(i,k+1)
725 h_avail = dsp1_ds(i,k+1)*f(i,k+1) + max(0.5*(h(i,j,k+1)-angstrom), &
726 ((f(i,k+1)-dsp1_ds(i,k+2)*f(i,k+2)) + (h(i,j,k+1) - angstrom)))
727 if ((f(i,k) > 0.0) .and. (f(i,k) > h_avail))
then 728 f_kb(i) = max(0.0, h_avail)
730 if ((f_kb(i) < maxf_kb(i)) .and. (eakb_maxf(i) <= eakb(i))) &
731 eakb(i) = eakb_maxf(i)
732 call f_kb_to_ea_kb(h_bl, sref, ent_bl, i_dskbp1, f_kb, kmb, i, &
736 endif ;
enddo ;
enddo 739 if (cs%bulkmixedlayer)
then ;
do i=is1,ie1
740 if (do_i(i) .and. (kb(i) < nz))
then 741 h_avail = eakb(i) + max(0.5*(h_bl(i,kmb+1)-angstrom), &
742 (f_kb(i)-ea_kbp1(i)) + (h_bl(i,kmb+1)-angstrom))
744 ent_bl(i,kmb+1) = min(ent_bl(i,kmb+1),0.5*(eakb(i) + h_avail))
746 eb_kmb(i) = max(2.0*ent_bl(i,kmb+1) - eakb(i), 0.0)
751 do k=kb_min_act+1,nz-1 ;
do i=is1,ie1 ;
if (do_i(i))
then 752 if ((.not.cs%bulkmixedlayer) .or. (k > kb(i)+1))
then 753 f(i,k) = min(f(i,k), ds_dsp1(i,k)*( ((f(i,k-1) + &
754 dsp1_ds(i,k-1)*f(i,k-1)) - f(i,k-2)) + (h(i,j,k-1) - angstrom)))
755 f(i,k) = max(f(i,k),min(minf(i,k),0.0))
756 else if (k == kb(i)+1)
then 757 f(i,k) = min(f(i,k), ds_dsp1(i,k)*( ((f(i,k-1) + eakb(i)) - &
758 eb_kmb(i)) + (h(i,j,k-1) - angstrom)))
759 f(i,k) = max(f(i,k),min(minf(i,k),0.0))
761 endif ;
enddo ;
enddo 764 call f_to_ent(f, h, kb, kmb, j, g, gv, cs, dsp1_ds, eakb, ent_bl, ea, eb)
768 if (correct_density)
then 770 h_guess(i,1) = (h(i,j,1) - angstrom) + (eb(i,j,1) - ea(i,j,2))
771 h_guess(i,nz) = (h(i,j,nz) - angstrom) + (ea(i,j,nz) - eb(i,j,nz-1))
772 if (h_guess(i,1) < 0.0) h_guess(i,1) = 0.0
773 if (h_guess(i,nz) < 0.0) h_guess(i,nz) = 0.0
775 do k=2,nz-1 ;
do i=is,ie
776 h_guess(i,k) = (h(i,j,k) - angstrom) + ((ea(i,j,k) - eb(i,j,k-1)) + &
777 (eb(i,j,k) - ea(i,j,k+1)))
778 if (h_guess(i,k) < 0.0) h_guess(i,k) = 0.0
780 if (cs%bulkmixedlayer)
then 781 call determine_dskb(h_bl, sref, ent_bl, eakb, is, ie, kmb, g, gv, &
782 .true., ds_kb, ds_anom_lim=ds_anom_lim)
785 rcv(is:ie), 1, ie-is+1, tv%eqn_of_state)
787 if ((k>kb(i)) .and. (f(i,k) > 0.0))
then 794 f_cor = h(i,j,k) * min(1.0 , max(-ds_dsp1(i,k), &
795 (gv%Rlay(k) - rcv(i)) / (gv%Rlay(k+1)-gv%Rlay(k))) )
801 if (f_cor > 0.0)
then 802 f_cor = min(f_cor, 0.9*f(i,k), ds_dsp1(i,k)*0.5*h_guess(i,k), &
805 f_cor = -min(-f_cor, 0.9*f(i,k), 0.5*h_guess(i,k), &
806 0.25*ds_dsp1(i,k)*h_guess(i,k-1) )
809 ea(i,j,k) = ea(i,j,k) - dsp1_ds(i,k)*f_cor
810 eb(i,j,k) = eb(i,j,k) + f_cor
811 else if ((k==kb(i)) .and. (f(i,k) > 0.0))
then 815 ds_kb_eff = 2.0*ds_kb(i) - ds_anom_lim(i)
816 rho_cor = h(i,j,k) * (gv%Rlay(k)-rcv(i)) + eakb(i)*ds_anom_lim(i)
819 if (abs(rho_cor) < abs(0.9*eakb(i)*ds_kb_eff))
then 820 ea_cor = -rho_cor / ds_kb_eff
822 ea_cor = sign(0.9*eakb(i),-rho_cor*ds_kb_eff)
825 if (ea_cor > 0.0)
then 827 ea_cor = min(ea_cor, 0.5*(max_eakb(i) - eakb(i)), &
828 0.5*h_guess(i,k) / (ds_kb(i) * i_dskbp1(i)))
831 ea_cor = -min(-ea_cor, 0.5*h_guess(i,k), &
832 0.25*h_guess(i,k+1) / (ds_kb(i) * i_dskbp1(i)))
835 ea(i,j,k) = ea(i,j,k) + ea_cor
836 eb(i,j,k) = eb(i,j,k) - (ds_kb(i) * i_dskbp1(i)) * ea_cor
837 else if (k < kb(i))
then 839 ea(i,j,k) = ea(i,j,k+1)
843 do k=kb_min-1,k2,-1 ;
do i=is,ie
844 ea(i,j,k) = ea(i,j,k+1)
852 h1 = (h(i,j,k) - angstrom) + (eb(i,j,k) - ea(i,j,k+1))
853 ea(i,j,k) = max(ent_bl(i,k), ent_bl(i,k)-0.5*h1, -h1)
855 do k=kmb-1,2,-1 ;
do i=is,ie
857 eb(i,j,k) = max(2.0*ent_bl(i,k+1) - ea(i,j,k+1), 0.0)
860 h1 = (h(i,j,k) - angstrom) + (eb(i,j,k) - ea(i,j,k+1))
861 ea(i,j,k) = max(ent_bl(i,k), ent_bl(i,k)-0.5*h1, -h1)
864 eb(i,j,1) = max(2.0*ent_bl(i,2) - ea(i,j,2), 0.0)
870 rcv(is:ie), 1, ie-is+1, tv%eqn_of_state)
871 do i=is,ie ;
if (f(i,k) > 0.0)
then 876 f_cor = h(i,j,k) * min(dsp1_ds(i,k) , max(-1.0, &
877 (gv%Rlay(k) - rcv(i)) / (gv%Rlay(k+1)-gv%Rlay(k))) )
883 if (f_cor >= 0.0)
then 884 f_cor = min(f_cor, 0.9*f(i,k), 0.5*dsp1_ds(i,k)*h_guess(i,k), &
887 f_cor = -min(-f_cor, 0.9*f(i,k), 0.5*h_guess(i,k), &
888 0.25*ds_dsp1(i,k)*h_guess(i,k-1) )
891 ea(i,j,k) = ea(i,j,k) - dsp1_ds(i,k)*f_cor
892 eb(i,j,k) = eb(i,j,k) + f_cor
899 if (cs%id_Kd > 0)
then 901 do k=2,nz-1 ;
do i=is,ie
902 if (k<kb(i))
then ; kd_here = 0.0 ;
else 903 kd_here = f(i,k) * ( h(i,j,k) + ((ea(i,j,k) - eb(i,j,k-1)) + &
904 (eb(i,j,k) - ea(i,j,k+1))) ) / (i2p2dsp1_ds(i,k) * grats(i,k))
907 kd_eff(i,j,k) = h_to_m**2 * (max(dtkd(i,k),kd_here)*idt)
910 kd_eff(i,j,1) = h_to_m**2 * (dtkd(i,1)*idt)
911 kd_eff(i,j,nz) = h_to_m**2 * (dtkd(i,nz)*idt)
915 if (cs%id_diff_work > 0)
then 916 do i=is,ie ; diff_work(i,j,1) = 0.0 ; diff_work(i,j,nz+1) = 0.0 ;
enddo 917 if (
associated(tv%eqn_of_state))
then 918 if (
associated(fluxes%p_surf))
then 919 do i=is,ie ; pressure(i) = fluxes%p_surf(i,j) ;
enddo 921 do i=is,ie ; pressure(i) = 0.0 ;
enddo 924 do i=is,ie ; pressure(i) = pressure(i) + gv%H_to_Pa*h(i,j,k-1) ;
enddo 927 t_eos(i) = 0.5*(tv%T(i,j,kmb) + tv%T(i,j,k))
928 s_eos(i) = 0.5*(tv%S(i,j,kmb) + tv%S(i,j,k))
930 t_eos(i) = 0.5*(tv%T(i,j,k-1) + tv%T(i,j,k))
931 s_eos(i) = 0.5*(tv%S(i,j,k-1) + tv%S(i,j,k))
935 drho_dt, drho_ds, is, ie-is+1, tv%eqn_of_state)
937 if ((k>kmb) .and. (k<kb(i)))
then ; diff_work(i,j,k) = 0.0
940 drho = drho_dt(i) * (tv%T(i,j,k)-tv%T(i,j,kmb)) + &
941 drho_ds(i) * (tv%S(i,j,k)-tv%S(i,j,kmb))
943 drho = drho_dt(i) * (tv%T(i,j,k)-tv%T(i,j,k-1)) + &
944 drho_ds(i) * (tv%S(i,j,k)-tv%S(i,j,k-1))
946 diff_work(i,j,k) = g_2dt * drho * &
947 (ea(i,j,k) * (h(i,j,k) + ea(i,j,k)) + &
948 eb(i,j,k-1)*(h(i,j,k-1) + eb(i,j,k-1)))
953 do k=2,nz ;
do i=is,ie
954 diff_work(i,j,k) = g_2dt * (gv%Rlay(k)-gv%Rlay(k-1)) * &
955 (ea(i,j,k) * (h(i,j,k) + ea(i,j,k)) + &
956 eb(i,j,k-1)*(h(i,j,k-1) + eb(i,j,k-1)))
961 if (
present(kb_out))
then 962 do i=is,ie ; kb_out(i,j) = kb(i) ;
enddo 968 if (cs%id_Kd > 0)
call post_data(cs%id_Kd, kd_eff, cs%diag)
969 if (cs%id_Kd > 0)
deallocate(kd_eff)
970 if (cs%id_diff_work > 0)
call post_data(cs%id_diff_work, diff_work, cs%diag)
971 if (cs%id_diff_work > 0)
deallocate(diff_work)
978 subroutine f_to_ent(F, h, kb, kmb, j, G, GV, CS, dsp1_ds, eakb, Ent_bl, ea, eb, do_i_in)
981 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: F
982 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
983 integer,
dimension(SZI_(G)),
intent(in) :: kb
984 integer,
intent(in) :: kmb, j
986 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: dsp1_ds
987 real,
dimension(SZI_(G)),
intent(in) :: eakb
988 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: Ent_bl
989 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(inout) :: ea, eb
990 logical,
dimension(SZI_(G)),
optional,
intent(in) :: do_i_in
997 logical :: do_i(szi_(g))
998 integer :: i, k, is, ie, nz
1000 is = g%isc ; ie = g%iec ; nz = g%ke
1002 if (
present(do_i_in))
then 1003 do i=is,ie ; do_i(i) = do_i_in(i) ;
enddo 1004 do i=g%isc,g%iec ;
if (do_i(i))
then 1007 do i=g%iec,g%isc,-1 ;
if (do_i(i))
then 1011 do i=is,ie ; do_i(i) = .true. ;
enddo 1015 ea(i,j,nz) = 0.0 ; eb(i,j,nz) = 0.0
1017 if (cs%bulkmixedlayer)
then 1019 eb(i,j,kmb) = max(2.0*ent_bl(i,kmb+1) - eakb(i), 0.0)
1021 do k=nz-1,kmb+1,-1 ;
do i=is,ie ;
if (do_i(i))
then 1025 ea(i,j,k) = dsp1_ds(i,k)*f(i,k)
1027 else if (k == kb(i))
then 1030 elseif (k == kb(i)-1)
then 1031 ea(i,j,k) = ea(i,j,k+1)
1032 eb(i,j,k) = eb(i,j,kmb)
1034 ea(i,j,k) = ea(i,j,k+1)
1037 eb(i,j,k) = eb(i,j,k+1) + max(0.0, h(i,j,k+1) - gv%Angstrom)
1039 endif ;
enddo ;
enddo 1041 do i=is,ie ;
if (do_i(i))
then 1044 if (kb(i) > kmb+1) &
1045 eb(i,j,k) = eb(i,j,k+1) + max(0.0, h(i,j,k+1) - gv%Angstrom)
1048 h1 = (h(i,j,k) - gv%Angstrom) + (eb(i,j,k) - ea(i,j,k+1))
1049 ea(i,j,k) = max(ent_bl(i,k), ent_bl(i,k)-0.5*h1, -h1)
1051 do k=kmb-1,2,-1 ;
do i=is,ie ;
if (do_i(i))
then 1053 eb(i,j,k) = max(2.0*ent_bl(i,k+1) - ea(i,j,k+1), 0.0)
1056 h1 = (h(i,j,k) - gv%Angstrom) + (eb(i,j,k) - ea(i,j,k+1))
1057 ea(i,j,k) = max(ent_bl(i,k), ent_bl(i,k)-0.5*h1, -h1)
1061 endif ;
enddo ;
enddo 1062 do i=is,ie ;
if (do_i(i))
then 1063 eb(i,j,1) = max(2.0*ent_bl(i,2) - ea(i,j,2), 0.0)
1071 ea(i,j,1) = 0.0 ; eb(i,j,1) = max(f(i,1),0.0)
1072 ea(i,j,2) = dsp1_ds(i,2)*f(i,2) - min(f(i,1),0.0)
1075 do k=2,nz-1 ;
do i=is,ie
1076 eb(i,j,k) = max(f(i,k),0.0)
1077 ea(i,j,k+1) = dsp1_ds(i,k+1)*f(i,k+1) - (f(i,k)-eb(i,j,k))
1078 if (ea(i,j,k+1) < 0.0)
then 1079 eb(i,j,k) = eb(i,j,k) - ea(i,j,k+1)
1090 subroutine set_ent_bl(h, dtKd_int, tv, kb, kmb, do_i, G, GV, CS, j, Ent_bl, Sref, h_bl)
1093 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
1096 real,
dimension(SZI_(G),SZK_(G)+1), &
1097 intent(in) :: dtKd_int
1103 integer,
dimension(SZI_(G)),
intent(inout) :: kb
1106 integer,
intent(in) :: kmb
1107 logical,
dimension(SZI_(G)),
intent(in) :: do_i
1110 integer,
intent(in) :: j
1112 real,
dimension(SZI_(G),SZK_(G)+1), &
1113 intent(out) :: Ent_bl
1116 real,
dimension(SZI_(G),SZK_(G)),
intent(out) :: Sref
1118 real,
dimension(SZI_(G),SZK_(G)),
intent(out) :: h_bl
1144 real,
dimension(SZI_(G)) :: &
1151 real,
dimension(SZI_(G), SZK_(G)) :: &
1160 integer :: i, k, is, ie, nz
1161 is = g%isc ; ie = g%iec ; nz = g%ke
1164 max_ent = 1.0e4*gv%m_to_H
1165 h_neglect = gv%H_subroundoff
1167 do i=is,ie ; pres(i) = tv%P_Ref ;
enddo 1170 rcv(is:ie), 1, ie-is+1, tv%eqn_of_state)
1172 h_bl(i,k) = h(i,j,k) + h_neglect
1173 sref(i,k) = rcv(i) - 1000.0
1178 h_interior(i) = 0.0 ; ent_bl(i,1) = 0.0
1182 do k=2,kmb ;
do i=is,ie
1184 ent_bl(i,k) = min(2.0 * dtkd_int(i,k) / (h(i,j,k-1) + h(i,j,k) + h_neglect), &
1186 else ; ent_bl(i,k) = 0.0 ;
endif 1195 b1(i) = 1.0 / (h_bl(i,1) + ent_bl(i,2))
1196 d1(i) = h_bl(i,1) * b1(i)
1197 s_est(i,1) = (h_bl(i,1)*sref(i,1)) * b1(i)
1199 do k=2,kmb-1 ;
do i=is,ie
1200 b1(i) = 1.0 / ((h_bl(i,k) + ent_bl(i,k+1)) + d1(i)*ent_bl(i,k))
1201 d1(i) = (h_bl(i,k) + d1(i)*ent_bl(i,k)) * b1(i)
1202 s_est(i,k) = (h_bl(i,k)*sref(i,k) + ent_bl(i,k)*s_est(i,k-1)) * b1(i)
1205 s_est(i,kmb) = (h_bl(i,kmb)*sref(i,kmb) + ent_bl(i,kmb)*s_est(i,kmb-1)) / &
1206 (h_bl(i,kmb) + d1(i)*ent_bl(i,kmb))
1212 do i=is,ie ; kb(i) = nz+1 ;
if (do_i(i)) kb(i) = kmb+1 ;
enddo 1214 do k=kmb+1,nz ;
do i=is,ie ;
if (do_i(i))
then 1215 if ((k == kb(i)) .and. (s_est(i,kmb) > (gv%Rlay(k) - 1000.0)))
then 1216 if (4.0*dtkd_int(i,kmb+1)*frac_rem(i) > &
1217 (h_bl(i,kmb) + h(i,j,k)) * (h(i,j,k) - gv%Angstrom))
then 1219 dh = max((h(i,j,k) - gv%Angstrom), 0.0)
1221 frac_rem(i) = frac_rem(i) - ((h_bl(i,kmb) + h(i,j,k)) * dh) / &
1222 (4.0*dtkd_int(i,kmb+1))
1223 sref(i,kmb) = (h_bl(i,kmb)*sref(i,kmb) + dh*(gv%Rlay(k)-1000.0)) / &
1225 h_bl(i,kmb) = h_bl(i,kmb) + dh
1226 s_est(i,kmb) = (h_bl(i,kmb)*sref(i,kmb) + ent_bl(i,kmb)*s_est(i,kmb-1)) / &
1227 (h_bl(i,kmb) + d1(i)*ent_bl(i,kmb))
1232 endif ;
enddo ;
enddo 1236 do k=nz,kmb+1,-1 ;
do i=is,ie
1237 if (k >= kb(i)) h_interior(i) = h_interior(i) + (h(i,j,k)-gv%Angstrom)
1239 h_bl(i,kmb+1) = h(i,j,k) ; sref(i,kmb+1) = gv%Rlay(k) - 1000.0
1240 elseif (k==kb(i)+1)
then 1241 h_bl(i,kmb+2) = h(i,j,k) ; sref(i,kmb+2) = gv%Rlay(k) - 1000.0
1244 do i=is,ie ;
if (kb(i) >= nz)
then 1245 h_bl(i,kmb+1) = h(i,j,nz)
1246 sref(i,kmb+1) = gv%Rlay(nz) - 1000.0
1247 h_bl(i,kmb+2) = gv%Angstrom
1248 sref(i,kmb+2) = sref(i,kmb+1) + (gv%Rlay(nz) - gv%Rlay(nz-1))
1254 do i=is,ie ;
if (do_i(i))
then 1255 kd_x_dt = frac_rem(i) * dtkd_int(i,kmb+1)
1256 if ((kd_x_dt <= 0.0) .or. (h_interior(i) <= 0.0))
then 1257 ent_bl(i,kmb+1) = 0.0
1261 ent_bl(i,kmb+1) = min(0.5*h_interior(i), sqrt(kd_x_dt), &
1262 kd_x_dt / (0.5*(h_bl(i,kmb) + h_bl(i,kmb+1))))
1265 ent_bl(i,kmb+1) = 0.0
1282 subroutine determine_dskb(h_bl, Sref, Ent_bl, E_kb, is, ie, kmb, G, GV, limit, &
1283 dSkb, ddSkb_dE, dSlay, ddSlay_dE, dS_anom_lim, do_i_in)
1287 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: h_bl
1289 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: Sref
1291 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: Ent_bl
1294 real,
dimension(SZI_(G)),
intent(in) :: E_kb
1296 integer,
intent(in) :: is, ie
1297 integer,
intent(in) :: kmb
1299 logical,
intent(in) :: limit
1301 real,
dimension(SZI_(G)),
intent(inout) :: dSkb
1306 real,
dimension(SZI_(G)),
optional,
intent(inout) :: ddSkb_dE
1308 real,
dimension(SZI_(G)),
optional,
intent(inout) :: dSlay
1311 real,
dimension(SZI_(G)),
optional,
intent(inout) :: ddSlay_dE
1313 real,
dimension(SZI_(G)),
optional,
intent(inout) :: dS_anom_lim
1314 logical,
dimension(SZI_(G)),
optional,
intent(in) :: do_i_in
1349 real,
dimension(SZI_(G),SZK_(G)) :: &
1354 real :: deriv_dSkb(szi_(g))
1359 logical,
dimension(SZI_(G)) :: do_i
1366 real :: dS_kbp1, IdS_kbp1
1369 real :: f1, df1_drat
1370 real :: z, dz_drat, f2, df2_dz, expz
1371 real :: eps_dSLay, eps_dSkb
1374 if (
present(ddslay_de) .and. .not.
present(dslay))
call mom_error(fatal, &
1375 "In deterimine_dSkb, ddSLay_dE may only be present if dSlay is.")
1377 h_neglect = gv%H_subroundoff
1380 ea(i,kmb+1) = e_kb(i) ; dea_de(i,kmb+1) = 1.0
1381 s(i,kmb+1) = sref(i,kmb+1) ; ds_de(i,kmb+1) = 0.0
1386 if (
present(do_i_in))
then 1387 do i=is,ie ; do_i(i) = do_i_in(i) ;
enddo 1389 do k=kmb,1,-1 ;
do i=is,ie
1393 if (2.0*ent_bl(i,k+1) > ea(i,k+1))
then 1394 eb(i,k) = 2.0*ent_bl(i,k+1) - ea(i,k+1) ; deb_de(i,k) = -dea_de(i,k+1)
1396 eb(i,k) = 0.0 ; deb_de(i,k) = 0.0
1400 h1 = (h_bl(i,k) - gv%Angstrom) + (eb(i,k) - ea(i,k+1))
1402 ea(i,k) = ent_bl(i,k) ; dea_de(i,k) = 0.0
1403 elseif (ent_bl(i,k) + 0.5*h1 >= 0.0)
then 1404 ea(i,k) = ent_bl(i,k) - 0.5*h1
1405 dea_de(i,k) = 0.5*(dea_de(i,k+1) - deb_de(i,k))
1408 dea_de(i,k) = dea_de(i,k+1) - deb_de(i,k)
1411 ea(i,k) = 0.0 ; dea_de(i,k) = 0.0 ; eb(i,k) = 0.0 ; deb_de(i,k) = 0.0
1415 h_tr = h_bl(i,k) + h_neglect
1416 c1(i,k) = ea(i,k+1) * b1(i,k+1)
1417 b_denom_1 = (h_tr + d1(i)*eb(i,k))
1418 b1(i,k) = 1.0 / (b_denom_1 + ea(i,k))
1419 d1(i) = b_denom_1 * b1(i,k)
1421 s(i,k) = (h_tr*sref(i,k) + eb(i,k)*s(i,k+1)) * b1(i,k)
1423 do k=2,kmb ;
do i=is,ie
1424 s(i,k) = s(i,k) + c1(i,k-1)*s(i,k-1)
1427 if (
present(ddskb_de) .or.
present(ddslay_de))
then 1430 do k=kmb,2,-1 ;
do i=is,ie
1431 if (do_i(i) .and. (dea_de(i,k) - deb_de(i,k) > 0.0))
then 1432 src = (((s(i,k+1) - sref(i,k)) * (h_bl(i,k) + h_neglect) + &
1433 (s(i,k+1) - s(i,k-1)) * ea(i,k)) * deb_de(i,k) - &
1434 ((sref(i,k) - s(i,k-1)) * h_bl(i,k) + &
1435 (s(i,k+1) - s(i,k-1)) * eb(i,k)) * dea_de(i,k)) / &
1436 ((h_bl(i,k) + h_neglect + ea(i,k)) + eb(i,k))
1437 else ; src = 0.0 ;
endif 1438 ds_de(i,k) = (src + eb(i,k)*ds_de(i,k+1)) * b1(i,k)
1441 if (do_i(i) .and. (deb_de(i,1) < 0.0))
then 1442 src = (((s(i,2) - sref(i,1)) * (h_bl(i,1) + h_neglect)) * deb_de(i,1)) / &
1443 (h_bl(i,1) + h_neglect + eb(i,1))
1444 else ; src = 0.0 ;
endif 1445 ds_de(i,1) = (src + eb(i,1)*ds_de(i,2)) * b1(i,1)
1447 do k=2,kmb ;
do i=is,ie
1448 ds_de(i,k) = ds_de(i,k) + c1(i,k-1)*ds_de(i,k-1)
1455 if (.not.limit)
then 1456 do i=is,ie ;
if (do_i(i))
then 1457 dskb(i) = sref(i,kmb+1) - s(i,kmb)
1459 if (
present(ddskb_de))
then ;
do i=is,ie ;
if (do_i(i))
then 1460 ddskb_de(i) = -1.0*ds_de(i,kmb)
1461 endif ;
enddo ;
endif 1463 if (
present(dslay))
then ;
do i=is,ie ;
if (do_i(i))
then 1464 dslay(i) = 0.5 * (sref(i,kmb+2) - s(i,kmb))
1465 endif ;
enddo ;
endif 1466 if (
present(ddslay_de))
then ;
do i=is,ie ;
if (do_i(i))
then 1467 ddslay_de(i) = -0.5*ds_de(i,kmb)
1468 endif ;
enddo ;
endif 1470 do i=is,ie ;
if (do_i(i))
then 1472 if (sref(i,kmb+1) - s(i,kmb) < eps_dskb*(sref(i,kmb+2) - sref(i,kmb+1)))
then 1473 dskb(i) = eps_dskb * (sref(i,kmb+2) - sref(i,kmb+1)) ; deriv_dskb(i) = 0.0
1475 dskb(i) = sref(i,kmb+1) - s(i,kmb) ; deriv_dskb(i) = -1.0
1477 if (
present(ddskb_de)) ddskb_de(i) = deriv_dskb(i)*ds_de(i,kmb)
1480 if (
present(dslay))
then 1484 do i=is,ie ;
if (do_i(i))
then 1485 ds_kbp1 = sref(i,kmb+2) - sref(i,kmb+1)
1486 ids_kbp1 = 1.0 / (sref(i,kmb+2) - sref(i,kmb+1))
1487 rat = (sref(i,kmb+1) - s(i,kmb)) * ids_kbp1
1495 inv_term = 1.0 / (1.0-rat)
1496 f1 = 2.0 - 0.125*(inv_term**2)
1497 df1_drat = - 0.25*(inv_term**3)
1501 z = dz_drat * rat + 4.0
1502 if (z >= 18.0)
then ; f2 = 1.0 ; df2_dz = 0.0
1503 elseif (z <= -58.0)
then ; f2 = eps_dslay ; df2_dz = 0.0
1505 expz = exp(z) ; inv_term = 1.0 / (1.0 + expz)
1506 f2 = (eps_dslay + expz) * inv_term
1507 df2_dz = (1.0 - eps_dslay) * expz * inv_term**2
1510 dslay(i) = dskb(i) * f1 * f2
1511 deriv_dslay = deriv_dskb(i) * (f1 * f2) - (dskb(i)*ids_kbp1) * &
1512 (df1_drat*f2 + f1 * dz_drat * df2_dz)
1513 elseif (dskb(i) <= 3.0*ds_kbp1)
then 1515 dslay(i) = 0.5 * (dskb(i) + ds_kbp1)
1516 deriv_dslay = 0.5 * deriv_dskb(i)
1518 dslay(i) = 2.0*ds_kbp1
1521 if (
present(ddslay_de)) ddslay_de(i) = deriv_dslay*ds_de(i,kmb)
1526 if (
present(ds_anom_lim))
then ;
do i=is,ie ;
if (do_i(i))
then 1527 ds_anom_lim(i) = max(0.0, eps_dskb * (sref(i,kmb+2) - sref(i,kmb+1)) - &
1528 (sref(i,kmb+1) - s(i,kmb)) )
1529 endif ;
enddo ;
endif 1534 subroutine f_kb_to_ea_kb(h_bl, Sref, Ent_bl, I_dSkbp1, F_kb, kmb, i, &
1535 G, GV, CS, ea_kb, tol_in)
1538 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: h_bl, Sref, Ent_bl
1539 real,
dimension(SZI_(G)),
intent(in) :: I_dSkbp1, F_kb
1540 integer,
intent(in) :: kmb, i
1542 real,
dimension(SZI_(G)),
intent(inout) :: ea_kb
1543 real,
optional,
intent(in) :: tol_in
1549 real :: max_ea, min_ea
1550 real :: err, err_min, err_max
1552 real :: val, tolerance, tol1
1555 logical :: bisect_next, Newton
1556 real,
dimension(SZI_(G)) :: dS_kb
1557 real,
dimension(SZI_(G)) :: maxF, ent_maxF, zeros
1558 real,
dimension(SZI_(G)) :: ddSkb_dE
1560 integer,
parameter :: MAXIT = 30
1562 ds_kbp1 = sref(i,kmb+2) - sref(i,kmb+1)
1563 max_ea = ea_kb(i) ; min_ea = 0.0
1564 val = ds_kbp1 * f_kb(i)
1567 tolerance = gv%m_to_H * cs%Tolerance_Ent
1568 if (
present(tol_in)) tolerance = tol_in
1569 bisect_next = .true.
1571 call determine_dskb(h_bl, sref, ent_bl, ea_kb, i, i, kmb, g, gv, .true., &
1574 err = ds_kb(i) * ea_kb(i) - val
1575 derr_dea = ds_kb(i) + ddskb_de(i) * ea_kb(i)
1578 if ((err <= 0.0) .and. (abs(err) <= tolerance*abs(derr_dea)))
return 1580 if (err == 0.0)
then ;
return 1581 elseif (err > 0.0)
then 1582 max_ea = ea_kb(i) ; err_max = err
1585 if ((derr_dea > 0.0) .and. (derr_dea*(ea_kb(i) - min_ea) > err) .and. &
1586 (derr_dea*(max_ea - ea_kb(i)) > -1.0*err))
then 1587 ea_kb(i) = ea_kb(i) - err / derr_dea
1589 ea_kb(i) = 0.5*(max_ea+min_ea)
1595 call find_maxf_kb(h_bl, sref, ent_bl, i_dskbp1, zeros, ea_kb, &
1596 kmb, i, i, g, gv, cs, maxf, ent_maxf, f_thresh = f_kb)
1597 err_max = ds_kbp1 * maxf(i) - val
1600 if (err_max <= 0.0)
then 1601 ea_kb(i) = ent_maxf(i) ;
return 1603 max_ea = ent_maxf(i)
1604 ea_kb(i) = 0.5*(max_ea+min_ea)
1612 call determine_dskb(h_bl, sref, ent_bl, ea_kb, i, i, kmb, g, gv, .true., &
1615 err = ds_kb(i) * ea_kb(i) - val
1616 derr_dea = ds_kb(i) + ddskb_de(i) * ea_kb(i)
1622 max_ea = ea_kb(i) ; err_max = err
1623 if ((derr_dea > 0.0) .and. (derr_dea*(ea_kb(i)-min_ea) > err)) newton = .true.
1625 min_ea = ea_kb(i) ; err_min = err
1626 if ((derr_dea > 0.0) .and. (derr_dea*(ea_kb(i)-max_ea) < err)) newton = .true.
1630 ea_kb(i) = ea_kb(i) - err / derr_dea
1631 elseif (bisect_next)
then 1632 ea_kb(i) = 0.5*(max_ea+min_ea)
1633 bisect_next = .false.
1635 ea_kb(i) = min_ea + (max_ea-min_ea) * (err_min/(err_min - err_max))
1636 bisect_next = .true.
1639 tol1 = tolerance ;
if (err > 0.0) tol1 = 0.099*tolerance
1640 if (ds_kb(i) <= ds_kbp1)
then 1641 if (abs(ea_kb(i) - ea_prev) <= tol1)
return 1643 if (ds_kbp1*abs(ea_kb(i) - ea_prev) <= ds_kb(i)*tol1)
return 1650 subroutine determine_ea_kb(h_bl, dtKd_kb, Sref, I_dSkbp1, Ent_bl, ea_kbp1, &
1651 min_eakb, max_eakb, kmb, is, ie, do_i, G, GV, CS, Ent, &
1652 error, err_min_eakb0, err_max_eakb0, F_kb, dFdfm_kb)
1655 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: h_bl
1659 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: Sref
1663 real,
dimension(SZI_(G),SZK_(G)),
intent(in) :: Ent_bl
1666 real,
dimension(SZI_(G)),
intent(in) :: I_dSkbp1
1670 real,
dimension(SZI_(G)),
intent(in) :: dtKd_kb
1673 real,
dimension(SZI_(G)),
intent(in) :: ea_kbp1
1675 real,
dimension(SZI_(G)),
intent(in) :: min_eakb
1677 real,
dimension(SZI_(G)),
intent(in) :: max_eakb
1679 integer,
intent(in) :: kmb
1680 integer,
intent(in) :: is, ie
1681 logical,
dimension(SZI_(G)),
intent(in) :: do_i
1684 real,
dimension(SZI_(G)),
intent(inout) :: Ent
1687 real,
dimension(SZI_(G)),
intent(out),
optional :: error
1690 real,
dimension(SZI_(G)),
intent(in),
optional :: err_min_eakb0, err_max_eakb0
1695 real,
dimension(SZI_(G)),
intent(out),
optional :: F_kb
1699 real,
dimension(SZI_(G)),
intent(out),
optional :: dFdfm_kb
1736 real,
dimension(SZI_(G)) :: &
1743 ddskb_de, ddslay_de, &
1748 error_mine, error_maxe
1753 real :: fa, fk, fm, fr
1756 logical,
dimension(SZI_(G)) :: false_position
1758 logical,
dimension(SZI_(G)) :: redo_i
1760 real,
parameter :: LARGE_VAL = 1.0e30
1762 integer,
parameter :: MAXIT = 30
1764 if (.not.cs%bulkmixedlayer)
then 1765 call mom_error(fatal,
"determine_Ea_kb should not be called "//&
1766 "unless BULKMIXEDLAYER is defined.")
1768 tolerance = gv%m_to_H * cs%Tolerance_Ent
1770 do i=is,ie ; redo_i(i) = do_i(i) ;
enddo 1772 do i=is,ie ;
if (do_i(i))
then 1777 e_min(i) = min_eakb(i) ; e_max(i) = max_eakb(i)
1778 error_mine(i) = -large_val ; error_maxe(i) = large_val
1779 false_position(i) = .true.
1781 if (
present(err_min_eakb0)) error_mine(i) = err_min_eakb0(i) - e_min(i) * ea_kbp1(i)
1782 if (
present(err_max_eakb0)) error_maxe(i) = err_max_eakb0(i) - e_max(i) * ea_kbp1(i)
1784 if ((error_maxe(i) <= 0.0) .or. (error_mine(i) >= 0.0))
then 1786 if (error_maxe(i) <= 0.0)
then 1788 ent(i) = e_max(i) ; err(i) = error_maxe(i)
1790 ent(i) = e_min(i) ; err(i) = error_mine(i)
1798 do_any = .false. ;
do i=is,ie ;
if (redo_i(i)) do_any = .true. ;
enddo 1799 if (.not.do_any)
exit 1800 call determine_dskb(h_bl, sref, ent_bl, ent, is, ie, kmb, g, gv, .true., ds_kb, &
1801 ddskb_de, ds_lay, ddslay_de, do_i_in = redo_i)
1802 do i=is,ie ;
if (redo_i(i))
then 1805 el = 0.0 ;
if (2.0*ent_bl(i,kmb+1) >= ent(i)) el = 1.0
1806 fa = (1.0 + el) + ds_kb(i)*i_dskbp1(i)
1807 fk = dtkd_kb(i) * (ds_lay(i)/ds_kb(i))
1808 fm = (ea_kbp1(i) - h_bl(i,kmb+1)) + el*2.0*ent_bl(i,kmb+1)
1809 if (fm > -gv%Angstrom) fm = fm + gv%Angstrom
1810 err(i) = (fa * ent(i)**2 - fm * ent(i)) - fk
1811 derror_de(i) = ((2.0*fa + (ddskb_de(i)*i_dskbp1(i))*ent(i))*ent(i) - fm) - &
1812 dtkd_kb(i) * (ddslay_de(i)*ds_kb(i) - ddskb_de(i)*ds_lay(i))/(ds_kb(i)**2)
1814 if (err(i) == 0.0)
then 1815 redo_i(i) = .false. ; cycle
1816 elseif (err(i) > 0.0)
then 1817 e_max(i) = ent(i) ; error_maxe(i) = err(i)
1819 e_min(i) = ent(i) ; error_mine(i) = err(i)
1823 if ((it == 1) .or. (derror_de(i) <= 0.0))
then 1828 fr = sqrt(fm**2 + 4.0*fa*fk)
1830 ent(i) = (fm + fr) / (2.0 * fa)
1832 ent(i) = (2.0 * fk) / (fr - fm)
1835 if ((ent(i) > e_max(i)) .or. (ent(i) < e_min(i))) &
1836 ent(i) = 0.5*(e_max(i) + e_min(i))
1837 elseif (((e_max(i)-ent(i))*derror_de(i) > -err(i)) .and. &
1838 ((ent(i)-e_min(i))*derror_de(i) > err(i)) )
then 1841 ent(i) = ent(i) - err(i) / derror_de(i)
1842 elseif (false_position(i) .and. &
1843 (error_maxe(i) - error_mine(i) < 0.9*large_val))
then 1845 ent(i) = e_min(i) + (e_max(i)-e_min(i)) * &
1846 (-error_mine(i)/(error_maxe(i) - error_mine(i)))
1847 false_position(i) = .false.
1849 ent(i) = 0.5*(e_max(i) + e_min(i))
1850 false_position(i) = .true.
1853 if (abs(e_prev - ent(i)) < tolerance)
then 1854 err_est = err(i) + (ent(i) - e_prev) * derror_de(i)
1855 if ((it > 1) .or. (err_est*err(i) <= 0.0) .or. &
1856 (abs(err_est) < abs(tolerance*derror_de(i)))) redo_i(i) = .false.
1863 if (
present(f_kb) .or.
present(dfdfm_kb)) &
1864 call determine_dskb(h_bl, sref, ent_bl, ent, is, ie, kmb, g, gv, .true., &
1865 ds_kb, do_i_in = do_i)
1867 if (
present(f_kb))
then ;
do i=is,ie ;
if (do_i(i))
then 1868 f_kb(i) = ent(i) * (ds_kb(i) * i_dskbp1(i))
1869 endif ;
enddo ;
endif 1870 if (
present(error))
then ;
do i=is,ie ;
if (do_i(i))
then 1872 endif ;
enddo ;
endif 1873 if (
present(dfdfm_kb))
then ;
do i=is,ie ;
if (do_i(i))
then 1877 if (derror_de(i) > 0.0)
then 1878 dfdfm_kb(i) = ((ds_kb(i) + ent(i) * ddskb_de(i)) * i_dskbp1(i)) * &
1879 (ent(i) / derror_de(i))
1883 endif ;
enddo ;
endif 1887 subroutine find_maxf_kb(h_bl, Sref, Ent_bl, I_dSkbp1, min_ent_in, max_ent_in, &
1888 kmb, is, ie, G, GV, CS, maxF, ent_maxF, do_i_in, &
1889 F_lim_maxent, F_thresh)
1892 real,
dimension(SZI_(G),SZK_(G)), &
1895 real,
dimension(SZI_(G),SZK_(G)), &
1897 real,
dimension(SZI_(G),SZK_(G)), &
1898 intent(in) :: Ent_bl
1901 real,
dimension(SZI_(G)),
intent(in) :: I_dSkbp1
1905 real,
dimension(SZI_(G)),
intent(in) :: min_ent_in
1907 real,
dimension(SZI_(G)),
intent(in) :: max_ent_in
1909 integer,
intent(in) :: kmb
1910 integer,
intent(in) :: is, ie
1912 real,
dimension(SZI_(G)),
intent(out) :: maxF
1915 real,
dimension(SZI_(G)),
intent(out), &
1916 optional :: ent_maxF
1917 logical,
dimension(SZI_(G)),
intent(in), &
1920 real,
dimension(SZI_(G)),
intent(out), &
1921 optional :: F_lim_maxent
1925 real,
dimension(SZI_(G)),
intent(in), &
1926 optional :: F_thresh
1959 real,
dimension(SZI_(G)) :: &
1961 minent, maxent, ent_best, &
1963 F_maxent, F_minent, F, F_best, &
1964 dF_dent, dF_dE_max, dF_dE_min, dF_dE_best, &
1965 dS_kb, dS_kb_lim, ddSkb_dE, dS_anom_lim, &
1966 chg_prev, chg_pre_prev
1967 real :: dF_dE_mean, maxslope, minslope
1969 real :: ratio_select_end
1970 real :: rat, max_chg, min_chg, chg1, chg2, chg
1971 logical,
dimension(SZI_(G)) :: do_i, last_it, need_bracket, may_use_best
1972 logical :: doany, OK1, OK2, bisect, new_min_bound
1973 integer :: i, it, is1, ie1
1974 integer,
parameter :: MAXIT = 20
1976 tolerance = gv%m_to_H * cs%Tolerance_Ent
1978 if (
present(do_i_in))
then 1979 do i=is,ie ; do_i(i) = do_i_in(i) ;
enddo 1981 do i=is,ie ; do_i(i) = .true. ;
enddo 1985 call determine_dskb(h_bl, sref, ent_bl, max_ent_in, is, ie, kmb, g, gv, .false., &
1986 ds_kb, ddskb_de , ds_anom_lim=ds_anom_lim)
1987 ie1 = is-1 ; doany = .false.
1989 ds_kb_lim(i) = ds_kb(i) + ds_anom_lim(i)
1990 f_max_ent_in(i) = max_ent_in(i)*ds_kb_lim(i)*i_dskbp1(i)
1991 maxent(i) = max_ent_in(i) ; minent(i) = min_ent_in(i)
1992 if ((abs(maxent(i) - minent(i)) < tolerance) .or. (.not.do_i(i)))
then 1993 f_best(i) = max_ent_in(i)*ds_kb(i)*i_dskbp1(i)
1994 ent_best(i) = max_ent_in(i) ; ent(i) = max_ent_in(i)
1997 f_maxent(i) = maxent(i) * ds_kb(i) * i_dskbp1(i)
1998 df_de_max(i) = (ds_kb(i) + maxent(i)*ddskb_de(i)) * i_dskbp1(i)
1999 doany = .true. ; last_it(i) = .false. ; need_bracket(i) = .true.
2004 ie1 = is-1 ;
do i=is,ie ;
if (do_i(i)) ie1 = i ;
enddo 2005 do i=ie1,is,-1 ;
if (do_i(i)) is1 = i ;
enddo 2007 call determine_dskb(h_bl, sref, ent_bl, minent, is1, ie1, kmb, g, gv, .false., &
2008 ds_kb, ddskb_de, do_i_in = do_i)
2009 do i=is1,ie1 ;
if (do_i(i))
then 2010 f_minent(i) = minent(i) * ds_kb(i) * i_dskbp1(i)
2011 df_de_min(i) = (ds_kb(i) + minent(i)*ddskb_de(i)) * i_dskbp1(i)
2014 ratio_select_end = 0.9
2016 ratio_select_end = 0.5*ratio_select_end
2017 do i=is1,ie1 ;
if (do_i(i))
then 2018 if (need_bracket(i))
then 2019 df_de_mean = (f_maxent(i) - f_minent(i)) / (maxent(i) - minent(i))
2020 maxslope = max(df_de_mean, df_de_min(i), df_de_max(i))
2021 minslope = min(df_de_mean, df_de_min(i), df_de_max(i))
2022 if (f_minent(i) >= f_maxent(i))
then 2023 if (df_de_min(i) > 0.0)
then ; rat = 0.02
2024 elseif (maxslope < ratio_select_end*minslope)
then 2026 f_best(i) = f_minent(i) ; ent_best(i) = minent(i) ; rat = 0.0
2028 else ; rat = 0.382 ;
endif 2030 if (df_de_max(i) < 0.0)
then ; rat = 0.98
2031 elseif (minslope > ratio_select_end*maxslope)
then 2033 f_best(i) = f_maxent(i) ; ent_best(i) = maxent(i) ; rat = 1.0
2035 else ; rat = 0.618 ;
endif 2038 if (rat >= 0.0) ent(i) = rat*maxent(i) + (1.0-rat)*minent(i)
2039 if (((maxent(i) - minent(i)) < tolerance) .or. (it==maxit)) &
2042 chg1 = 2.0*(maxent(i) - minent(i)) ; chg2 = chg1
2043 if (df_de_best(i) > 0)
then 2044 max_chg = maxent(i) - ent_best(i) ; min_chg = 0.0
2046 max_chg = 0.0 ; min_chg = minent(i) - ent_best(i)
2048 if (max_chg - min_chg < 2.0*tolerance) last_it(i) = .true.
2049 if (df_de_max(i) /= df_de_best(i)) &
2050 chg1 = (maxent(i) - ent_best(i))*df_de_best(i) / &
2051 (df_de_best(i) - df_de_max(i))
2052 if (df_de_min(i) /= df_de_best(i)) &
2053 chg2 = (minent(i) - ent_best(i))*df_de_best(i) / &
2054 (df_de_best(i) - df_de_min(i))
2055 ok1 = ((chg1 < max_chg) .and. (chg1 > min_chg))
2056 ok2 = ((chg2 < max_chg) .and. (chg2 > min_chg))
2057 if (.not.(ok1 .or. ok2))
then ; bisect = .true. ;
else 2058 if (ok1 .and. ok2)
then 2059 chg = chg1 ;
if (abs(chg2) < abs(chg1)) chg = chg2
2060 elseif (ok1)
then ; chg = chg1
2061 else ; chg = chg2 ;
endif 2062 if (abs(chg) > 0.5*abs(chg_pre_prev(i)))
then ; bisect = .true.
2063 else ; bisect = .false. ;
endif 2065 chg_pre_prev(i) = chg_prev(i)
2067 if (df_de_best(i) > 0.0)
then 2068 ent(i) = 0.5*(maxent(i) + ent_best(i))
2069 chg_prev(i) = 0.5*(maxent(i) - ent_best(i))
2071 ent(i) = 0.5*(minent(i) + ent_best(i))
2072 chg_prev(i) = 0.5*(minent(i) - ent_best(i))
2075 if (abs(chg) < tolerance) chg = sign(tolerance,chg)
2076 ent(i) = ent_best(i) + chg
2082 if (mod(it,3) == 0)
then 2083 ie1 = is-1 ;
do i=is1,ie ;
if (do_i(i)) ie1 = i ;
enddo 2084 do i=ie1,is,-1 ;
if (do_i(i)) is1 = i ;
enddo 2087 call determine_dskb(h_bl, sref, ent_bl, ent, is1, ie1, kmb, g, gv, .false., &
2088 ds_kb, ddskb_de, do_i_in = do_i)
2089 do i=is1,ie1 ;
if (do_i(i))
then 2090 f(i) = ent(i)*ds_kb(i)*i_dskbp1(i)
2091 df_dent(i) = (ds_kb(i) + ent(i)*ddskb_de(i)) * i_dskbp1(i)
2094 if (
present(f_thresh))
then ;
do i=is1,ie1 ;
if (do_i(i))
then 2095 if (f(i) >= f_thresh(i))
then 2096 f_best(i) = f(i) ; ent_best(i) = ent(i) ; do_i(i) = .false.
2098 endif ;
enddo ;
endif 2101 do i=is1,ie1 ;
if (do_i(i))
then 2102 if (.not.last_it(i)) doany = .true.
2103 if (last_it(i))
then 2104 if (need_bracket(i))
then 2105 if ((f(i) > f_maxent(i)) .and. (f(i) > f_minent(i)))
then 2106 f_best(i) = f(i) ; ent_best(i) = ent(i)
2107 elseif (f_maxent(i) > f_minent(i))
then 2108 f_best(i) = f_maxent(i) ; ent_best(i) = maxent(i)
2110 f_best(i) = f_minent(i) ; ent_best(i) = minent(i)
2112 elseif (f(i) > f_best(i))
then 2113 f_best(i) = f(i) ; ent_best(i) = ent(i)
2116 elseif (need_bracket(i))
then 2117 if ((f(i) > f_maxent(i)) .and. (f(i) > f_minent(i)))
then 2118 need_bracket(i) = .false.
2119 chg_prev(i) = (maxent(i) - minent(i))
2120 chg_pre_prev(i) = 2.0*chg_prev(i)
2121 ent_best(i) = ent(i) ; f_best(i) = f(i) ; df_de_best(i) = df_dent(i)
2122 elseif ((f(i) <= f_maxent(i)) .and. (f(i) > f_minent(i)))
then 2123 new_min_bound = .true.
2124 elseif ((f(i) <= f_maxent(i)) .and. (f(i) > f_minent(i)))
then 2125 new_min_bound = .false.
2131 new_min_bound = .true.
2132 if (df_de_min(i) > 0.0 .or. (f_minent(i) >= f_maxent(i))) &
2133 new_min_bound = .false.
2135 if (need_bracket(i))
then 2136 if (new_min_bound)
then 2137 minent(i) = ent(i) ; f_minent(i) = f(i) ; df_de_min(i) = df_dent(i)
2139 maxent(i) = ent(i) ; f_maxent(i) = f(i) ; df_de_max(i) = df_dent(i)
2143 if (f(i) >= f_best(i))
then 2144 if (ent(i) > ent_best(i))
then 2145 minent(i) = ent_best(i) ; f_minent(i) = f_best(i) ; df_de_min(i) = df_de_best(i)
2147 maxent(i) = ent_best(i) ; f_maxent(i) = f_best(i) ; df_de_max(i) = df_de_best(i)
2149 ent_best(i) = ent(i) ; f_best(i) = f(i) ; df_de_best(i) = df_dent(i)
2151 if (ent(i) < ent_best(i))
then 2152 minent(i) = ent(i) ; f_minent(i) = f(i) ; df_de_min(i) = df_dent(i)
2154 maxent(i) = ent(i) ; f_maxent(i) = f(i) ; df_de_max(i) = df_dent(i)
2157 if ((maxent(i) - minent(i)) <= tolerance) do_i(i) = .false.
2160 if (.not.doany)
exit 2164 if (
present(f_lim_maxent))
then 2168 f_lim_maxent(i) = f_max_ent_in(i)
2169 if (
present(ent_maxf)) ent_maxf(i) = ent_best(i)
2175 may_use_best(i) = (ent_best(i) /= max_ent_in(i))
2176 if (may_use_best(i)) doany = .true.
2180 call determine_dskb(h_bl, sref, ent_bl, ent_best, is, ie, kmb, g, gv, .true., &
2183 f_best(i) = ent_best(i)*ds_kb_lim(i)*i_dskbp1(i)
2186 if ((f_best(i) > f_max_ent_in(i)) .and. (may_use_best(i)))
then 2188 if (
present(ent_maxf)) ent_maxf(i) = ent_best(i)
2190 maxf(i) = f_max_ent_in(i)
2191 if (
present(ent_maxf)) ent_maxf(i) = max_ent_in(i)
2196 do i=is,ie ; maxf(i) = f_max_ent_in(i) ;
enddo 2197 if (
present(ent_maxf))
then 2198 do i=is,ie ; ent_maxf(i) = max_ent_in(i) ;
enddo 2206 type(time_type),
intent(in) :: Time
2211 type(
diag_ctrl),
target,
intent(inout) :: diag
2224 real :: decay_length, dt, Kd
2226 #include "version_variable.h" 2227 character(len=40) :: mod =
"MOM_entrain_diffusive" 2229 if (
associated(cs))
then 2230 call mom_error(warning,
"entrain_diffusive_init called with an associated "// &
2231 "control structure.")
2238 cs%bulkmixedlayer = (gv%nkml > 0)
2242 call get_param(param_file, mod,
"CORRECT_DENSITY", cs%correct_density, &
2243 "If true, and USE_EOS is true, the layer densities are \n"//&
2244 "restored toward their target values by the diapycnal \n"//&
2245 "mixing, as described in Hallberg (MWR, 2000).", &
2247 call get_param(param_file, mod,
"MAX_ENT_IT", cs%max_ent_it, &
2248 "The maximum number of iterations that may be used to \n"//&
2249 "calculate the interior diapycnal entrainment.", default=5)
2251 call get_param(param_file, mod,
"KD", kd, fail_if_missing=.true.)
2252 call get_param(param_file, mod,
"DT", dt, &
2253 "The (baroclinic) dynamics time step.", units =
"s", &
2254 fail_if_missing=.true.)
2256 call get_param(param_file, mod,
"TOLERANCE_ENT", cs%Tolerance_Ent, &
2257 "The tolerance with which to solve for entrainment values.", &
2258 units=
"m", default=max(100.0*gv%Angstrom,1.0e-4*sqrt(dt*kd)))
2260 cs%id_Kd = register_diag_field(
'ocean_model',
'Kd_effective', diag%axesTL, time, &
2261 'Diapycnal diffusivity as applied',
'meter2 second-1')
2262 cs%id_diff_work = register_diag_field(
'ocean_model',
'diff_work', diag%axesTi, time, &
2263 'Work actually done by diapycnal diffusion across each interface',
'W m-2')
2270 if (
associated(cs))
deallocate(cs)
This module implements boundary forcing for MOM6.
Ocean grid type. See mom_grid for details.
Calculates density of sea water from T, S and P.
Provides the ocean grid type.
subroutine, public entrainment_diffusive(u, v, h, tv, fluxes, dt, G, GV, CS, ea, eb, kb_out, Kd_Lay, Kd_int)
This subroutine calculates ea and eb, the rates at which a layer entrains from the layers above and b...
subroutine f_to_ent(F, h, kb, kmb, j, G, GV, CS, dsp1_ds, eakb, Ent_bl, ea, eb, do_i_in)
This subroutine calculates the actual entrainments (ea and eb) and the amount of surface forcing that...
subroutine determine_ea_kb(h_bl, dtKd_kb, Sref, I_dSkbp1, Ent_bl, ea_kbp1, min_eakb, max_eakb, kmb, is, ie, do_i, G, GV, CS, Ent, error, err_min_eakb0, err_max_eakb0, F_kb, dFdfm_kb)
subroutine, public calculate_density_derivs(T, S, pressure, drho_dT, drho_dS, start, npts, EOS)
Calls the appropriate subroutine to calculate density derivatives for 1-D array inputs.
subroutine f_kb_to_ea_kb(h_bl, Sref, Ent_bl, I_dSkbp1, F_kb, kmb, i, G, GV, CS, ea_kb, tol_in)
subroutine find_maxf_kb(h_bl, Sref, Ent_bl, I_dSkbp1, min_ent_in, max_ent_in, kmb, is, ie, G, GV, CS, maxF, ent_maxF, do_i_in, F_lim_maxent, F_thresh)
subroutine, public entrain_diffusive_end(CS)
logical function, public is_root_pe()
subroutine determine_dskb(h_bl, Sref, Ent_bl, E_kb, is, ie, kmb, G, GV, limit, dSkb, ddSkb_dE, dSlay, ddSlay_dE, dS_anom_lim, do_i_in)
This subroutine determines the reference density difference between the bottommost buffer layer and t...
Structure that contains pointers to the boundary forcing used to drive the liquid ocean simulated by ...
Provides subroutines for quantities specific to the equation of state.
subroutine, public entrain_diffusive_init(Time, G, GV, param_file, diag, CS)
The thermo_var_ptrs structure contains pointers to an assortment of thermodynamic fields that may be ...
subroutine, public mom_error(level, message, all_print)
subroutine set_ent_bl(h, dtKd_int, tv, kb, kmb, do_i, G, GV, CS, j, Ent_bl, Sref, h_bl)
This subroutine sets the average entrainment across each of the interfaces between buffer layers with...