This subroutine calculates ea and eb, the rates at which a layer entrains from the layers above and below. The entrainment rates are proportional to the buoyancy flux in a layer and inversely proportional to the density differences between layers. The scheme that is used here is described in detail in Hallberg, Mon. Wea. Rev. 2000.
52 type(ocean_grid_type),
intent(in) :: G
53 type(verticalGrid_type),
intent(in) :: GV
54 type(unit_scale_type),
intent(in) :: US
55 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
57 type(thermo_var_ptrs),
intent(in) :: tv
60 type(forcing),
intent(in) :: fluxes
62 real,
intent(in) :: dt
63 type(entrain_diffusive_CS),
pointer :: CS
65 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
68 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
71 integer,
dimension(SZI_(G),SZJ_(G)), &
72 optional,
intent(inout) :: kb_out
75 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
76 optional,
intent(in) :: Kd_Lay
78 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)+1), &
79 optional,
intent(in) :: Kd_int
88 real,
dimension(SZI_(G),SZK_(G)) :: &
90 real,
dimension(SZI_(G),SZK_(G)+1) :: &
92 real,
dimension(SZI_(G),SZK_(G)) :: &
105 real,
dimension(SZI_(G),SZK_(G)+1) :: &
108 real,
allocatable,
dimension(:,:,:) :: &
115 real :: hm, fm, fr, fk
118 real :: c1(SZI_(G),SZK_(G))
120 real,
dimension(SZI_(G)) :: &
151 real,
dimension(SZI_(G),SZK_(G)) :: &
159 real,
dimension(SZI_(G),SZK_(G)) :: &
174 real,
dimension(SZI_(G)) :: &
198 logical :: do_entrain_eakb
199 logical :: do_i(SZI_(G)), did_i(SZI_(G)), reiterate
200 integer,
dimension(2) :: EOSdom
201 integer :: it, i, j, k, is, ie, js, je, nz, K2, kmb
202 integer :: kb(SZI_(G))
204 integer :: kb_min_act
206 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
207 angstrom = gv%Angstrom_H
208 h_neglect = gv%H_subroundoff
210 if (.not.
associated(cs))
call mom_error(fatal, &
211 "MOM_entrain_diffusive: Module must be initialized before it is used.")
213 if (.not.(
present(kd_lay) .or.
present(kd_int)))
call mom_error(fatal, &
214 "MOM_entrain_diffusive: Either Kd_Lay or Kd_int must be present in call.")
216 if ((.not.cs%bulkmixedlayer .and. .not.
associated(fluxes%buoy)) .and. &
217 (
associated(fluxes%lprec) .or.
associated(fluxes%evap) .or. &
218 associated(fluxes%sens) .or.
associated(fluxes%sw)))
then
219 if (is_root_pe())
call mom_error(note,
"Calculate_Entrainment: &
220 &The code to handle evaporation and precipitation without &
221 &a bulk mixed layer has not been implemented.")
222 if (is_root_pe())
call mom_error(fatal, &
223 "Either define BULKMIXEDLAYER in MOM_input or use fluxes%buoy &
224 &and a linear equation of state to drive the model.")
227 tolerance = cs%Tolerance_Ent
228 kmb = gv%nk_rho_varies
229 k2 = max(kmb+1,2) ; kb_min = k2
230 if (.not. cs%bulkmixedlayer)
then
234 do i=is,ie ; ds_dsp1(i,nz) = 2.0 ; dsp1_ds(i,nz) = 0.5 ;
enddo
237 do i=is,ie ; ds_dsp1(i,nz) = 0.0 ; dsp1_ds(i,nz) = 0.0 ;
enddo
240 if (cs%id_diff_work > 0)
allocate(diff_work(g%isd:g%ied,g%jsd:g%jed,nz+1))
241 if (cs%id_Kd > 0)
allocate(kd_eff(g%isd:g%ied,g%jsd:g%jed,nz))
243 if (
associated(tv%eqn_of_state))
then
248 eosdom(:) = eos_domain(g%HI)
266 do i=is,ie ; kb(i) = 1 ;
enddo
268 if (
present(kd_lay))
then
269 do k=1,nz ;
do i=is,ie
270 dtkd(i,k) = gv%Z_to_H**2 * (dt * kd_lay(i,j,k))
272 if (
present(kd_int))
then
273 do k=1,nz+1 ;
do i=is,ie
274 dtkd_int(i,k) = gv%Z_to_H**2 * (dt * kd_int(i,j,k))
277 do k=2,nz ;
do i=is,ie
278 dtkd_int(i,k) = gv%Z_to_H**2 * (0.5 * dt * (kd_lay(i,j,k-1) + kd_lay(i,j,k)))
282 do k=1,nz ;
do i=is,ie
283 dtkd(i,k) = gv%Z_to_H**2 * (0.5 * dt * (kd_int(i,j,k)+kd_int(i,j,k+1)))
285 dO k=1,nz+1 ;
do i=is,ie
286 dtkd_int(i,k) = gv%Z_to_H**2 * (dt * kd_int(i,j,k))
290 do i=is,ie ; do_i(i) = (g%mask2dT(i,j) > 0.5) ;
enddo
291 do i=is,ie ; ds_dsp1(i,nz) = 0.0 ;
enddo
292 do i=is,ie ; dsp1_ds(i,nz) = 0.0 ;
enddo
294 do k=2,nz-1 ;
do i=is,ie
295 ds_dsp1(i,k) = gv%g_prime(k) / gv%g_prime(k+1)
298 if (cs%bulkmixedlayer)
then
302 call set_ent_bl(h, dtkd_int, tv, kb, kmb, do_i, g, gv, us, cs, j, ent_bl, sref, h_bl)
305 dtkd_kb(i) = 0.0 ;
if (kb(i) < nz) dtkd_kb(i) = dtkd(i,kb(i))
308 do i=is,ie ; ent_bl(i,kmb+1) = 0.0 ;
enddo
311 do k=2,nz-1 ;
do i=is,ie
312 dsp1_ds(i,k) = 1.0 / ds_dsp1(i,k)
313 i2p2dsp1_ds(i,k) = 0.5/(1.0+dsp1_ds(i,k))
314 grats(i,k) = 2.0*(2.0+(dsp1_ds(i,k)+ds_dsp1(i,k)))
320 if (cs%bulkmixedlayer)
then
323 htot(i) = h(i,j,1) - angstrom
325 do k=2,kmb ;
do i=is,ie
326 htot(i) = htot(i) + (h(i,j,k) - angstrom)
329 max_eakb(i) = max(ent_bl(i,kmb+1) + 0.5*htot(i), htot(i))
330 i_dskbp1(i) = 1.0 / (sref(i,kmb+2) - sref(i,kmb+1))
338 call find_maxf_kb(h_bl, sref, ent_bl, i_dskbp1, zeros, max_eakb, kmb, &
339 is, ie, g, gv, cs, maxf_kb, eakb_maxf, do_i, f_kb_maxent)
340 do i=is,ie ;
if (kb(i) <= nz)
then
341 maxf(i,kb(i)) = max(0.0, maxf_kb(i), f_kb_maxent(i))
342 if ((maxf_kb(i) > f_kb_maxent(i)) .and. (eakb_maxf(i) >= htot(i))) &
343 max_eakb(i) = eakb_maxf(i)
346 do i=is,ie ; ea_kbp1(i) = 0.0 ; eakb(i) = max_eakb(i) ;
enddo
347 call determine_ea_kb(h_bl, dtkd_kb, sref, i_dskbp1, ent_bl, ea_kbp1, &
348 max_eakb, max_eakb, kmb, is, ie, do_i, g, gv, cs, eakb, &
349 error=err_max_eakb0, f_kb=f_kb)
353 do i=is,ie ; min_eakb(i) = min(htot(i), max_eakb(i)) ;
enddo
354 call find_maxf_kb(h_bl, sref, ent_bl, i_dskbp1, min_eakb, max_eakb, &
355 kmb, is, ie, g, gv, cs, f_kb_maxent, do_i_in = do_i)
358 do_entrain_eakb = .false.
360 if (do_i(i))
then ;
if (err_max_eakb0(i) < 0.0)
then
361 do_entrain_eakb = .true.
364 if (do_entrain_eakb)
then
365 eakb(i) = max_eakb(i) ; min_eakb(i) = max_eakb(i)
367 eakb(i) = 0.0 ; min_eakb(i) = 0.0
374 call determine_ea_kb(h_bl, dtkd_kb, sref, i_dskbp1, ent_bl, ea_kbp1, &
375 zeros, max_eakb, kmb, is, ie, do_i, g, gv, cs, min_eakb, &
376 error=err_min_eakb0, f_kb=f_kb, err_max_eakb0=err_max_eakb0)
378 do i=is,ie ;
if ((kb(i)<nz) .and. (kb_min>kb(i))) kb_min = kb(i) ;
enddo
387 htot(i) = h(i,j,1) - angstrom
389 if (
associated(fluxes%buoy))
then ;
do i=is,ie
390 maxf(i,1) = gv%Z_to_H * (dt*fluxes%buoy(i,j)) / gv%g_prime(2)
396 do k=kb_min,nz-1 ;
do i=is,ie
397 if ((k == kb(i)+1) .and. cs%bulkmixedlayer)
then
398 maxf(i,k) = ds_dsp1(i,k)*(f_kb_maxent(i) + htot(i))
399 htot(i) = htot(i) + (h(i,j,k) - angstrom)
400 elseif (k > kb(i))
then
401 maxf(i,k) = ds_dsp1(i,k)*(maxf(i,k-1) + htot(i))
402 htot(i) = htot(i) + (h(i,j,k) - angstrom)
407 if (.not.cs%bulkmixedlayer)
then
408 maxf_correct(i) = max(0.0, -(maxf(i,nz-1) + htot(i)))
410 htot(i) = h(i,j,nz) - angstrom
412 if (.not.cs%bulkmixedlayer)
then
413 do_any = .false. ;
do i=is,ie ;
if (maxf_correct(i) > 0.0) do_any = .true. ;
enddo
415 do k=nz-1,1,-1 ;
do i=is,ie
416 maxf(i,k) = maxf(i,k) + maxf_correct(i)
417 maxf_correct(i) = maxf_correct(i) * dsp1_ds(i,k)
421 do k=nz-1,kb_min,-1 ;
do i=is,ie ;
if (do_i(i))
then
423 maxf(i,k) = min(maxf(i,k),dsp1_ds(i,k+1)*maxf(i,k+1) + htot(i))
424 htot(i) = htot(i) + (h(i,j,k) - angstrom)
427 if ((maxf(i,k) < f_kb(i)) .or. (maxf(i,k) < maxf_kb(i)) &
428 .and. (eakb_maxf(i) <= max_eakb(i)))
then
433 if ((f_kb(i) <= maxf_kb(i)) .and. (eakb_maxf(i) <= max_eakb(i)))
then
434 eakb(i) = eakb_maxf(i)
436 eakb(i) = max_eakb(i)
438 call f_kb_to_ea_kb(h_bl, sref, ent_bl, i_dskbp1, f_kb, kmb, i, &
439 g, gv, cs, eakb, angstrom)
440 if ((eakb(i) < max_eakb(i)) .or. (eakb(i) < min_eakb(i)))
then
441 call determine_ea_kb(h_bl, dtkd_kb, sref, i_dskbp1, ent_bl, zeros, &
442 eakb, eakb, kmb, i, i, do_i, g, gv, cs, eakb, &
444 if (eakb(i) < max_eakb(i))
then
445 max_eakb(i) = eakb(i) ; err_max_eakb0(i) = err_eakb0(i)
447 if (eakb(i) < min_eakb(i))
then
448 min_eakb(i) = eakb(i) ; err_min_eakb0(i) = err_eakb0(i)
453 endif ;
enddo ;
enddo
454 if (.not.cs%bulkmixedlayer)
then
456 maxf(i,1) = min(maxf(i,1),dsp1_ds(i,2)*maxf(i,2) + htot(i))
467 f(i,nz) = maxf(i,nz) ; minf(i,nz) = 0.0
471 if ((k==kb(i)) .and. (do_i(i)))
then
472 eakb(i) = min_eakb(i)
474 elseif ((k>kb(i)) .and. (do_i(i)))
then
479 hm = h(i,j,k) + h_neglect
482 f(i,k) = min(maxf(i,k), sqrt(ds_dsp1(i,k)*dtkd(i,k)), &
483 0.5*(ds_dsp1(i,k)+1.0) * (dtkd(i,k) / hm))
488 fk = dtkd(i,k) * grats(i,k)
489 minf(i,k) = min(maxf(i,k), &
490 0.9*(i2p2dsp1_ds(i,k) * fk / (hm + sqrt(hm*hm + fk))))
491 if (k==kb(i)) minf(i,k) = 0.0
501 is1 = ie+1 ; ie1 = is-1
502 do i=is,ie ;
if (do_i(i))
then ; is1 = i ;
exit ;
endif ;
enddo
503 do i=ie,is,-1 ;
if (do_i(i))
then ; ie1 = i ;
exit ;
endif ;
enddo
505 if (cs%bulkmixedlayer)
then
508 if (do_i(i) .and. (kb(i) < kb_min_act)) kb_min_act = kb(i)
515 if (do_i(i) .and. (kb(i) < nz)) &
516 ea_kbp1(i) = dsp1_ds(i,kb(i)+1)*f(i,kb(i)+1)
518 call determine_ea_kb(h_bl, dtkd_kb, sref, i_dskbp1, ent_bl, ea_kbp1, min_eakb, &
519 max_eakb, kmb, is1, ie1, do_i, g, gv, cs, eakb, f_kb=f_kb, &
520 err_max_eakb0=err_max_eakb0, err_min_eakb0=err_min_eakb0, &
526 do it=0,cs%max_ent_it-1
527 do i=is1,ie1 ;
if (do_i(i))
then
528 if (.not.cs%bulkmixedlayer) f(i,1) = min(f(i,1),maxf(i,1))
534 do k=kb_min_act,nz-1 ;
do i=is1,ie1 ;
if (do_i(i) .and. (k>=kb(i)))
then
536 if (cs%bulkmixedlayer .and. (k==kb(i)))
then
538 dfdfm(i,k) = dfdfm_kb(i)
541 fm = (f(i,k-1) - h(i,j,k)) + dsp1_ds(i,k+1)*f(i,k+1)
542 fk = grats(i,k)*dtkd(i,k)
543 fr = sqrt(fm*fm + fk)
546 f(i,k) = min(maxf(i,k), i2p2dsp1_ds(i,k) * (fm+fr))
548 f(i,k) = min(maxf(i,k), i2p2dsp1_ds(i,k) * (fk / (-1.0*fm+fr)))
551 if ((f(i,k) >= maxf(i,k)) .or. (fr == 0.0))
then
554 dfdfm(i,k) = i2p2dsp1_ds(i,k) * ((fr + fm) / fr)
559 c1(i,k) = dfdfm(i,k-1)*(dsp1_ds(i,k)*b1(i))
560 b1(i) = 1.0 / (1.0 - c1(i,k)*dfdfm(i,k))
561 f(i,k) = min(b1(i)*(f(i,k)-fprev(i,k)) + fprev(i,k), maxf(i,k))
562 if (f(i,k) >= maxf(i,k)) dfdfm(i,k) = 0.0
565 endif ;
enddo ;
enddo
567 do k=nz-2,kb_min_act,-1 ;
do i=is1,ie1
568 if (do_i(i) .and. (k > kb(i))) &
569 f(i,k) = min((f(i,k)+c1(i,k+1)*(f(i,k+1)-fprev(i,k+1))),maxf(i,k))
572 if (cs%bulkmixedlayer)
then
574 if (do_i(i) .and. (kb(i) < nz))
then
576 ea_kbp1(i) = dsp1_ds(i,kb(i)+1)*max(f(i,kb(i)+1), minf(i,kb(i)+1))
581 call determine_ea_kb(h_bl, dtkd_kb, sref, i_dskbp1, ent_bl, ea_kbp1, min_eakb, &
582 max_eakb, kmb, is1, ie1, do_i, g, gv, cs, eakb, f_kb=f_kb, &
583 err_max_eakb0=err_max_eakb0, err_min_eakb0=err_min_eakb0, &
586 if (do_i(i) .and. (kb(i) < nz)) f(i,kb(i)) = f_kb(i)
591 if (it < cs%max_ent_it-1)
then
594 if (cs%bulkmixedlayer)
then ;
do i=is1,ie1 ;
if (do_i(i))
then
595 eb_kmb(i) = max(2.0*ent_bl(i,kmb+1) - eakb(i), 0.0)
596 endif ;
enddo ;
endif
598 did_i(i) = do_i(i) ; do_i(i) = .false.
600 do k=kb_min_act,nz-1 ;
do i=is1,ie1
601 if (did_i(i) .and. (k >= kb(i)))
then
602 if (f(i,k) < minf(i,k))
then
604 do_i(i) = .true. ; reiterate = .true.
605 elseif (k > kb(i))
then
606 if ((abs(f(i,k) - fprev(i,k)) > tolerance) .or. &
607 ((h(i,j,k) + ((1.0+dsp1_ds(i,k))*f(i,k) - &
608 (f(i,k-1) + dsp1_ds(i,k+1)*f(i,k+1)))) < 0.9*angstrom))
then
609 do_i(i) = .true. ; reiterate = .true.
615 if (h(i,j,k) + ((f(i,k) + eakb(i)) - &
616 (eb_kmb(i) + dsp1_ds(i,k+1)*f(i,k+1))) < 0.9*angstrom)
then
617 do_i(i) = .true. ; reiterate = .true.
622 if (.not.reiterate)
exit
628 if (it == (cs%max_ent_it))
then
631 do i=is1,ie1 ;
if (do_i(i))
then
632 f(i,nz-1) = max(f(i,nz-1), min(minf(i,nz-1), 0.0))
633 if (kb(i) >= nz-1)
then ; ea_kbp1(i) = 0.0 ;
endif
635 do k=nz-2,kb_min_act,-1 ;
do i=is1,ie1 ;
if (do_i(i))
then
637 f(i,k) = min(max(minf(i,k),f(i,k)), (dsp1_ds(i,k+1)*f(i,k+1) + &
638 max(((f(i,k+1)-dsp1_ds(i,k+2)*f(i,k+2)) + &
639 (h(i,j,k+1) - angstrom)), 0.5*(h(i,j,k+1)-angstrom))))
640 elseif (k==kb(i))
then
641 ea_kbp1(i) = dsp1_ds(i,k+1)*f(i,k+1)
642 h_avail = dsp1_ds(i,k+1)*f(i,k+1) + max(0.5*(h(i,j,k+1)-angstrom), &
643 ((f(i,k+1)-dsp1_ds(i,k+2)*f(i,k+2)) + (h(i,j,k+1) - angstrom)))
644 if ((f(i,k) > 0.0) .and. (f(i,k) > h_avail))
then
645 f_kb(i) = max(0.0, h_avail)
647 if ((f_kb(i) < maxf_kb(i)) .and. (eakb_maxf(i) <= eakb(i))) &
648 eakb(i) = eakb_maxf(i)
649 call f_kb_to_ea_kb(h_bl, sref, ent_bl, i_dskbp1, f_kb, kmb, i, &
653 endif ;
enddo ;
enddo
656 if (cs%bulkmixedlayer)
then ;
do i=is1,ie1
657 if (do_i(i) .and. (kb(i) < nz))
then
658 h_avail = eakb(i) + max(0.5*(h_bl(i,kmb+1)-angstrom), &
659 (f_kb(i)-ea_kbp1(i)) + (h_bl(i,kmb+1)-angstrom))
661 ent_bl(i,kmb+1) = min(ent_bl(i,kmb+1),0.5*(eakb(i) + h_avail))
663 eb_kmb(i) = max(2.0*ent_bl(i,kmb+1) - eakb(i), 0.0)
668 do k=kb_min_act+1,nz-1 ;
do i=is1,ie1 ;
if (do_i(i))
then
669 if ((.not.cs%bulkmixedlayer) .or. (k > kb(i)+1))
then
670 f(i,k) = min(f(i,k), ds_dsp1(i,k)*( ((f(i,k-1) + &
671 dsp1_ds(i,k-1)*f(i,k-1)) - f(i,k-2)) + (h(i,j,k-1) - angstrom)))
672 f(i,k) = max(f(i,k),min(minf(i,k),0.0))
673 elseif (k == kb(i)+1)
then
674 f(i,k) = min(f(i,k), ds_dsp1(i,k)*( ((f(i,k-1) + eakb(i)) - &
675 eb_kmb(i)) + (h(i,j,k-1) - angstrom)))
676 f(i,k) = max(f(i,k),min(minf(i,k),0.0))
678 endif ;
enddo ;
enddo
681 call f_to_ent(f, h, kb, kmb, j, g, gv, cs, dsp1_ds, eakb, ent_bl, ea, eb)
685 if (
associated(tv%eqn_of_state))
then
687 h_guess(i,1) = (h(i,j,1) - angstrom) + (eb(i,j,1) - ea(i,j,2))
688 h_guess(i,nz) = (h(i,j,nz) - angstrom) + (ea(i,j,nz) - eb(i,j,nz-1))
689 if (h_guess(i,1) < 0.0) h_guess(i,1) = 0.0
690 if (h_guess(i,nz) < 0.0) h_guess(i,nz) = 0.0
692 do k=2,nz-1 ;
do i=is,ie
693 h_guess(i,k) = (h(i,j,k) - angstrom) + ((ea(i,j,k) - eb(i,j,k-1)) + &
694 (eb(i,j,k) - ea(i,j,k+1)))
695 if (h_guess(i,k) < 0.0) h_guess(i,k) = 0.0
697 if (cs%bulkmixedlayer)
then
698 call determine_dskb(h_bl, sref, ent_bl, eakb, is, ie, kmb, g, gv, &
699 .true., ds_kb, ds_anom_lim=ds_anom_lim)
701 call calculate_density(tv%T(:,j,k), tv%S(:,j,k), pres, rcv, tv%eqn_of_state, eosdom)
703 if ((k>kb(i)) .and. (f(i,k) > 0.0))
then
710 f_cor = h(i,j,k) * min(1.0 , max(-ds_dsp1(i,k), &
711 (gv%Rlay(k) - rcv(i)) / (gv%Rlay(k+1)-gv%Rlay(k))) )
717 if (f_cor > 0.0)
then
718 f_cor = min(f_cor, 0.9*f(i,k), ds_dsp1(i,k)*0.5*h_guess(i,k), &
721 f_cor = -min(-f_cor, 0.9*f(i,k), 0.5*h_guess(i,k), &
722 0.25*ds_dsp1(i,k)*h_guess(i,k-1) )
725 ea(i,j,k) = ea(i,j,k) - dsp1_ds(i,k)*f_cor
726 eb(i,j,k) = eb(i,j,k) + f_cor
727 elseif ((k==kb(i)) .and. (f(i,k) > 0.0))
then
731 ds_kb_eff = 2.0*ds_kb(i) - ds_anom_lim(i)
732 rho_cor = h(i,j,k) * (gv%Rlay(k)-rcv(i)) + eakb(i)*ds_anom_lim(i)
735 if (abs(rho_cor) < abs(0.9*eakb(i)*ds_kb_eff))
then
736 ea_cor = -rho_cor / ds_kb_eff
738 ea_cor = sign(0.9*eakb(i),-rho_cor*ds_kb_eff)
741 if (ea_cor > 0.0)
then
743 ea_cor = min(ea_cor, 0.5*(max_eakb(i) - eakb(i)), &
744 0.5*h_guess(i,k) / (ds_kb(i) * i_dskbp1(i)))
747 ea_cor = -min(-ea_cor, 0.5*h_guess(i,k), &
748 0.25*h_guess(i,k+1) / (ds_kb(i) * i_dskbp1(i)))
751 ea(i,j,k) = ea(i,j,k) + ea_cor
752 eb(i,j,k) = eb(i,j,k) - (ds_kb(i) * i_dskbp1(i)) * ea_cor
753 elseif (k < kb(i))
then
755 ea(i,j,k) = ea(i,j,k+1)
759 do k=kb_min-1,k2,-1 ;
do i=is,ie
760 ea(i,j,k) = ea(i,j,k+1)
768 h1 = (h(i,j,k) - angstrom) + (eb(i,j,k) - ea(i,j,k+1))
769 ea(i,j,k) = max(ent_bl(i,k), ent_bl(i,k)-0.5*h1, -h1)
771 do k=kmb-1,2,-1 ;
do i=is,ie
773 eb(i,j,k) = max(2.0*ent_bl(i,k+1) - ea(i,j,k+1), 0.0)
776 h1 = (h(i,j,k) - angstrom) + (eb(i,j,k) - ea(i,j,k+1))
777 ea(i,j,k) = max(ent_bl(i,k), ent_bl(i,k)-0.5*h1, -h1)
780 eb(i,j,1) = max(2.0*ent_bl(i,2) - ea(i,j,2), 0.0)
785 call calculate_density(tv%T(:,j,k), tv%S(:,j,k), pres, rcv, tv%eqn_of_state, eosdom)
786 do i=is,ie ;
if (f(i,k) > 0.0)
then
791 f_cor = h(i,j,k) * min(dsp1_ds(i,k) , max(-1.0, &
792 (gv%Rlay(k) - rcv(i)) / (gv%Rlay(k+1)-gv%Rlay(k))) )
798 if (f_cor >= 0.0)
then
799 f_cor = min(f_cor, 0.9*f(i,k), 0.5*dsp1_ds(i,k)*h_guess(i,k), &
802 f_cor = -min(-f_cor, 0.9*f(i,k), 0.5*h_guess(i,k), &
803 0.25*ds_dsp1(i,k)*h_guess(i,k-1) )
806 ea(i,j,k) = ea(i,j,k) - dsp1_ds(i,k)*f_cor
807 eb(i,j,k) = eb(i,j,k) + f_cor
814 if (cs%id_Kd > 0)
then
815 idt = gv%H_to_Z**2 / dt
816 do k=2,nz-1 ;
do i=is,ie
817 if (k<kb(i))
then ; kd_here = 0.0 ;
else
818 kd_here = f(i,k) * ( h(i,j,k) + ((ea(i,j,k) - eb(i,j,k-1)) + &
819 (eb(i,j,k) - ea(i,j,k+1))) ) / (i2p2dsp1_ds(i,k) * grats(i,k))
822 kd_eff(i,j,k) = max(dtkd(i,k), kd_here)*idt
825 kd_eff(i,j,1) = dtkd(i,1)*idt
826 kd_eff(i,j,nz) = dtkd(i,nz)*idt
830 if (cs%id_diff_work > 0)
then
831 g_2dt = 0.5 * gv%H_to_Z**2*us%L_to_Z**2 * (gv%g_Earth / dt)
832 do i=is,ie ; diff_work(i,j,1) = 0.0 ; diff_work(i,j,nz+1) = 0.0 ;
enddo
833 if (
associated(tv%eqn_of_state))
then
834 if (
associated(fluxes%p_surf))
then
835 do i=is,ie ; pressure(i) = fluxes%p_surf(i,j) ;
enddo
837 do i=is,ie ; pressure(i) = 0.0 ;
enddo
840 do i=is,ie ; pressure(i) = pressure(i) + (gv%g_Earth*gv%H_to_RZ)*h(i,j,k-1) ;
enddo
843 t_eos(i) = 0.5*(tv%T(i,j,kmb) + tv%T(i,j,k))
844 s_eos(i) = 0.5*(tv%S(i,j,kmb) + tv%S(i,j,k))
846 t_eos(i) = 0.5*(tv%T(i,j,k-1) + tv%T(i,j,k))
847 s_eos(i) = 0.5*(tv%S(i,j,k-1) + tv%S(i,j,k))
850 call calculate_density_derivs(t_eos, s_eos, pressure, drho_dt, drho_ds, &
851 tv%eqn_of_state, eosdom)
853 if ((k>kmb) .and. (k<kb(i)))
then ; diff_work(i,j,k) = 0.0
856 drho = drho_dt(i) * (tv%T(i,j,k)-tv%T(i,j,kmb)) + &
857 drho_ds(i) * (tv%S(i,j,k)-tv%S(i,j,kmb))
859 drho = drho_dt(i) * (tv%T(i,j,k)-tv%T(i,j,k-1)) + &
860 drho_ds(i) * (tv%S(i,j,k)-tv%S(i,j,k-1))
862 diff_work(i,j,k) = g_2dt * drho * &
863 (ea(i,j,k) * (h(i,j,k) + ea(i,j,k)) + &
864 eb(i,j,k-1)*(h(i,j,k-1) + eb(i,j,k-1)))
869 do k=2,nz ;
do i=is,ie
870 diff_work(i,j,k) = g_2dt * (gv%Rlay(k)-gv%Rlay(k-1)) * &
871 (ea(i,j,k) * (h(i,j,k) + ea(i,j,k)) + &
872 eb(i,j,k-1)*(h(i,j,k-1) + eb(i,j,k-1)))
877 if (
present(kb_out))
then
878 do i=is,ie ; kb_out(i,j) = kb(i) ;
enddo
884 if (cs%id_Kd > 0)
call post_data(cs%id_Kd, kd_eff, cs%diag)
885 if (cs%id_Kd > 0)
deallocate(kd_eff)
886 if (cs%id_diff_work > 0)
call post_data(cs%id_diff_work, diff_work, cs%diag)
887 if (cs%id_diff_work > 0)
deallocate(diff_work)