This subroutine moves any water left in the former mixed layers into the two buffer layers and may also move buffer layer water into the interior isopycnal layers.
2214 type(ocean_grid_type),
intent(in) :: G
2215 type(verticalGrid_type),
intent(in) :: GV
2216 real,
dimension(SZI_(G),SZK0_(GV)),
intent(inout) :: h
2218 real,
dimension(SZI_(G),SZK0_(GV)),
intent(inout) :: T
2219 real,
dimension(SZI_(G),SZK0_(GV)),
intent(inout) :: S
2220 real,
dimension(SZI_(G),SZK0_(GV)),
intent(inout) :: R0
2222 real,
dimension(SZI_(G),SZK0_(GV)),
intent(inout) :: Rcv
2224 real,
dimension(SZK_(GV)),
intent(in) :: RcvTgt
2226 real,
intent(in) :: dt
2227 real,
intent(in) :: dt_diag
2228 real,
dimension(SZI_(G),SZK_(GV)),
intent(inout) :: d_ea
2232 integer,
intent(in) :: j
2233 type(unit_scale_type),
intent(in) :: US
2234 type(bulkmixedlayer_CS),
pointer :: CS
2236 real,
dimension(SZI_(G)),
intent(in) :: dR0_dT
2240 real,
dimension(SZI_(G)),
intent(in) :: dR0_dS
2244 real,
dimension(SZI_(G)),
intent(in) :: dRcv_dT
2248 real,
dimension(SZI_(G)),
intent(in) :: dRcv_dS
2251 real,
dimension(SZI_(G)),
intent(in) :: max_BL_det
2279 real :: stays_min, stays_max
2282 logical :: mergeable_bl
2288 real :: stays_min_merge
2290 real :: dR0_2dz, dRcv_2dz
2299 real :: dPE_det, dPE_merge
2308 real :: h_det_to_h2, h_ml_to_h2
2309 real :: h_det_to_h1, h_ml_to_h1
2310 real :: h1_to_h2, h1_to_k0
2311 real :: h2_to_k1, h2_to_k1_rem
2316 real :: R0_det, T_det, S_det
2317 real :: Rcv_stays, R0_stays
2318 real :: T_stays, S_stays
2319 real :: dSpice_det, dSpice_stays
2323 real :: dSpice_lim, dSpice_lim2
2334 real :: dPE_time_ratio
2335 real :: dT_dS_gauge, dS_dT_gauge
2345 logical :: stable_Rcv
2354 real :: Ih, Ihdet, Ih1f, Ih2f
2355 real :: Ihk0, Ihk1, Ih12
2356 real :: dR1, dR2, dR2b, dRk1
2357 real :: dR0, dR21, dRcv
2358 real :: dRcv_stays, dRcv_det, dRcv_lim
2361 real :: h2_to_k1_lim, T_new, S_new, T_max, T_min, S_max, S_min
2362 character(len=200) :: mesg
2364 integer :: i, k, k0, k1, is, ie, nz, kb1, kb2, nkmb
2365 is = g%isc ; ie = g%iec ; nz = gv%ke
2366 kb1 = cs%nkml+1; kb2 = cs%nkml+2
2367 nkmb = cs%nkml+cs%nkbl
2368 h_neglect = gv%H_subroundoff
2369 g_2 = 0.5 * gv%g_Earth
2370 rho0xg = gv%Rho0 * gv%g_Earth
2371 idt_h2 = gv%H_to_Z**2 / dt_diag
2372 i2rho0 = 0.5 / (gv%Rho0)
2373 angstrom = gv%Angstrom_H
2376 dt_ds_gauge = cs%dT_dS_wt ; ds_dt_gauge = 1.0 / dt_ds_gauge
2379 if (cs%nkbl /= 2)
call mom_error(fatal,
"MOM_mixed_layer"// &
2380 "CS%nkbl must be 2 in mixedlayer_detrain_2.")
2382 if (dt < cs%BL_detrain_time)
then ; dpe_time_ratio = cs%BL_detrain_time / (dt)
2383 else ; dpe_time_ratio = 1.0 ;
endif
2392 h_to_bl = 0.0 ; r0_to_bl = 0.0
2393 rcv_to_bl = 0.0 ; t_to_bl = 0.0 ; s_to_bl = 0.0
2395 do k=1,cs%nkml ;
if (h(i,k) > 0.0)
then
2396 h_to_bl = h_to_bl + h(i,k)
2397 r0_to_bl = r0_to_bl + r0(i,k)*h(i,k)
2399 rcv_to_bl = rcv_to_bl + rcv(i,k)*h(i,k)
2400 t_to_bl = t_to_bl + t(i,k)*h(i,k)
2401 s_to_bl = s_to_bl + s(i,k)*h(i,k)
2403 d_ea(i,k) = d_ea(i,k) - h(i,k)
2406 if (h_to_bl > 0.0)
then ; r0_det = r0_to_bl / h_to_bl
2407 else ; r0_det = r0(i,0) ;
endif
2429 h_min_bl = min(cs%Hbuffer_min, cs%Hbuffer_rel_min*h(i,0))
2432 if (((r0(i,kb2)-r0(i,kb1)) * (rcv(i,kb2)-rcv(i,kb1)) <= 0.0)) &
2433 stable_rcv = .false.
2435 h1 = h(i,kb1) ; h2 = h(i,kb2)
2437 h2_to_k1_rem = (h1 + h2) + h_to_bl
2438 if ((max_bl_det(i) >= 0.0) .and. (h2_to_k1_rem > max_bl_det(i))) &
2439 h2_to_k1_rem = max_bl_det(i)
2442 if ((h2 == 0.0) .and. (h1 > 0.0))
then
2451 do k1=kb2+1,nz ;
if (h(i,k1) > 2.0*angstrom)
exit ;
enddo
2453 r0(i,kb2) = r0(i,kb1)
2455 rcv(i,kb2)=rcv(i,kb1) ; t(i,kb2)=t(i,kb1) ; s(i,kb2)=s(i,kb1)
2458 if (k1 <= nz)
then ;
if (r0(i,k1) >= r0(i,kb1))
then
2459 r0(i,kb2) = 0.5*(r0(i,kb1)+r0(i,k1))
2461 rcv(i,kb2) = 0.5*(rcv(i,kb1)+rcv(i,k1))
2462 t(i,kb2) = 0.5*(t(i,kb1)+t(i,k1))
2463 s(i,kb2) = 0.5*(s(i,kb1)+s(i,k1))
2467 dpe_extrap = 0.0 ; dpe_merge = 0.0
2468 mergeable_bl = .false.
2469 if ((h1 > 0.0) .and. (h2 > 0.0) .and. (h_to_bl > 0.0) .and. &
2476 do k1=kb2+1,nz ;
if (rcvtgt(k1) >= rcv(i,kb2))
exit ;
enddo ; k0 = k1-1
2477 dr1 = rcvtgt(k0)-rcv(i,kb1) ; dr2 = rcv(i,kb2)-rcvtgt(k0)
2483 h1_avail = h1 - max(0.0,h_min_bl-h_to_bl)
2484 if ((k1<=nz) .and. (h2 > h_min_bl) .and. (h1_avail > 0.0) .and. &
2485 (r0(i,kb1) < r0(i,kb2)) .and. (h_to_bl*r0(i,kb1) > r0_to_bl))
then
2486 drk1 = (rcvtgt(k1) - rcv(i,kb2)) * (r0(i,kb2) - r0(i,kb1)) / &
2487 (rcv(i,kb2) - rcv(i,kb1))
2488 b1 = drk1 / (r0(i,kb2) - r0(i,kb1))
2494 h2_to_k1 = min(h2 - h_min_bl, h2_to_k1_rem)
2497 if (h2_to_k1*(h1_avail + b1*(h1_avail + h2)) > h2*h1_avail) &
2498 h2_to_k1 = (h2*h1_avail) / (h1_avail + b1*(h1_avail + h2))
2499 if (h2_to_k1*(drk1 * h2) > (h_to_bl*r0(i,kb1) - r0_to_bl) * h1) &
2500 h2_to_k1 = (h_to_bl*r0(i,kb1) - r0_to_bl) * h1 / (drk1 * h2)
2502 if ((k1==kb2+1) .and. (cs%BL_extrap_lim > 0.))
then
2505 drcv_lim = rcv(i,kb2)-rcv(i,0)
2506 do k=1,kb2 ; drcv_lim = max(drcv_lim, rcv(i,kb2)-rcv(i,k)) ;
enddo
2507 drcv_lim = cs%BL_extrap_lim*drcv_lim
2508 if ((rcvtgt(k1) - rcv(i,kb2)) >= drcv_lim)
then
2510 elseif ((rcvtgt(k1) - rcv(i,kb2)) > 0.5*drcv_lim)
then
2511 h2_to_k1 = h2_to_k1 * (2.0 - 2.0*((rcvtgt(k1) - rcv(i,kb2)) / drcv_lim))
2515 drcv = (rcvtgt(k1) - rcv(i,kb2))
2520 dspice_det = (ds_dt_gauge*drcv_ds(i)*(t(i,kb2)-t(i,kb1)) - &
2521 dt_ds_gauge*drcv_dt(i)*(s(i,kb2)-s(i,kb1))) * &
2522 (h2 - h2_to_k1) / (h1 + h2)
2524 if (h(i,k1) > 10.0*angstrom)
then
2525 dspice_lim = ds_dt_gauge*drcv_ds(i)*(t(i,k1)-t(i,kb2)) - &
2526 dt_ds_gauge*drcv_dt(i)*(s(i,k1)-s(i,kb2))
2527 if (dspice_det*dspice_lim <= 0.0) dspice_lim = 0.0
2529 if (k1<nz)
then ;
if (h(i,k1+1) > 10.0*angstrom)
then
2530 dspice_lim2 = ds_dt_gauge*drcv_ds(i)*(t(i,k1+1)-t(i,kb2)) - &
2531 dt_ds_gauge*drcv_dt(i)*(s(i,k1+1)-s(i,kb2))
2532 if ((dspice_det*dspice_lim2 > 0.0) .and. &
2533 (abs(dspice_lim2) > abs(dspice_lim))) dspice_lim = dspice_lim2
2535 if (abs(dspice_det) > abs(dspice_lim)) dspice_det = dspice_lim
2537 i_denom = 1.0 / (drcv_ds(i)**2 + (dt_ds_gauge*drcv_dt(i))**2)
2538 t_det = t(i,kb2) + dt_ds_gauge * i_denom * &
2539 (dt_ds_gauge * drcv_dt(i) * drcv + drcv_ds(i) * dspice_det)
2540 s_det = s(i,kb2) + i_denom * &
2541 (drcv_ds(i) * drcv - dt_ds_gauge * drcv_dt(i) * dspice_det)
2543 r0_det = r0(i,kb2) + (t_det-t(i,kb2)) * dr0_dt(i) + &
2544 (s_det-s(i,kb2)) * dr0_ds(i)
2546 if (cs%BL_extrap_lim >= 0.)
then
2549 if (h(i,k1) > 10.0*angstrom)
then
2550 t_min = min(t(i,kb1), t(i,kb2), t(i,k1)) - cs%Allowed_T_chg
2551 t_max = max(t(i,kb1), t(i,kb2), t(i,k1)) + cs%Allowed_T_chg
2552 s_min = min(s(i,kb1), s(i,kb2), s(i,k1)) - cs%Allowed_S_chg
2553 s_max = max(s(i,kb1), s(i,kb2), s(i,k1)) + cs%Allowed_S_chg
2555 t_min = min(t(i,kb1), t(i,kb2)) - cs%Allowed_T_chg
2556 t_max = max(t(i,kb1), t(i,kb2)) + cs%Allowed_T_chg
2557 s_min = min(s(i,kb1), s(i,kb2)) - cs%Allowed_S_chg
2558 s_max = max(s(i,kb1), s(i,kb2)) + cs%Allowed_S_chg
2560 ihk1 = 1.0 / (h(i,k1) + h2_to_k1)
2561 t_new = (h(i,k1)*t(i,k1) + h2_to_k1*t_det) * ihk1
2562 s_new = (h(i,k1)*s(i,k1) + h2_to_k1*s_det) * ihk1
2564 if ((t_new < t_min) .or. (t_new > t_max) .or. &
2565 (s_new < s_min) .or. (s_new > s_max)) &
2569 h1_to_h2 = b1*h2*h2_to_k1 / (h2 - (1.0+b1)*h2_to_k1)
2571 ihk1 = 1.0 / (h(i,k1) + h_neglect + h2_to_k1)
2572 ih2f = 1.0 / ((h(i,kb2) - h2_to_k1) + h1_to_h2)
2574 rcv(i,kb2) = ((h(i,kb2)*rcv(i,kb2) - h2_to_k1*rcvtgt(k1)) + &
2575 h1_to_h2*rcv(i,kb1))*ih2f
2576 rcv(i,k1) = ((h(i,k1)+h_neglect)*rcv(i,k1) + h2_to_k1*rcvtgt(k1)) * ihk1
2578 t(i,kb2) = ((h(i,kb2)*t(i,kb2) - h2_to_k1*t_det) + &
2579 h1_to_h2*t(i,kb1)) * ih2f
2580 t(i,k1) = ((h(i,k1)+h_neglect)*t(i,k1) + h2_to_k1*t_det) * ihk1
2582 s(i,kb2) = ((h(i,kb2)*s(i,kb2) - h2_to_k1*s_det) + &
2583 h1_to_h2*s(i,kb1)) * ih2f
2584 s(i,k1) = ((h(i,k1)+h_neglect)*s(i,k1) + h2_to_k1*s_det) * ihk1
2587 r0(i,kb2) = ((h(i,kb2)*r0(i,kb2) - h2_to_k1*r0_det) + &
2588 h1_to_h2*r0(i,kb1)) * ih2f
2589 r0(i,k1) = ((h(i,k1)+h_neglect)*r0(i,k1) + h2_to_k1*r0_det) * ihk1
2591 h(i,kb1) = h(i,kb1) - h1_to_h2 ; h1 = h(i,kb1)
2592 h(i,kb2) = (h(i,kb2) - h2_to_k1) + h1_to_h2 ; h2 = h(i,kb2)
2593 h(i,k1) = h(i,k1) + h2_to_k1
2595 d_ea(i,kb1) = d_ea(i,kb1) - h1_to_h2
2596 d_ea(i,kb2) = (d_ea(i,kb2) - h2_to_k1) + h1_to_h2
2597 d_ea(i,k1) = d_ea(i,k1) + h2_to_k1
2598 h2_to_k1_rem = max(h2_to_k1_rem - h2_to_k1, 0.0)
2602 if ((k1>kb2+1) .and. (rcvtgt(k1-1) >= rcv(i,kb2)))
then
2603 do k1=k1,kb2+1,-1 ;
if (rcvtgt(k1-1) < rcv(i,kb2))
exit ;
enddo
2608 dr1 = rcvtgt(k0)-rcv(i,kb1) ; dr2 = rcv(i,kb2)-rcvtgt(k0)
2610 if ((k0>kb2) .and. (dr1 > 0.0) .and. (h1 > h_min_bl) .and. &
2611 (h2*dr2 < h1*dr1) .and. (r0(i,kb2) > r0(i,kb1)))
then
2616 stays_merge = 2.0*(h1+h2)*(h1*dr1 - h2*dr2) / &
2617 ((dr1+dr2)*h1 + dr1*(h1+h2) + &
2618 sqrt((dr2*h1-dr1*h2)**2 + 4*(h1+h2)*h2*(dr1+dr2)*dr2))
2620 stays_min_merge = max(h_min_bl, 2.0*h_min_bl - h_to_bl, &
2621 h1 - (h1+h2)*(r0(i,kb1) - r0_det) / (r0(i,kb2) - r0(i,kb1)))
2622 if ((stays_merge > stays_min_merge) .and. &
2623 (stays_merge + h2_to_k1_rem >= h1 + h2))
then
2624 mergeable_bl = .true.
2625 dpe_merge = g_2*(r0(i,kb2)-r0(i,kb1))*(h1-stays_merge)*(h2-stays_merge)
2629 if ((k1<=nz).and.(.not.mergeable_bl))
then
2633 dr2b = rcvtgt(k1)-rcv(i,kb2) ; dr21 = rcv(i,kb2) - rcv(i,kb1)
2634 if (dr2b*(h1+h2) < h2*dr21)
then
2636 h2_to_k1 = min(h2 - (h1+h2) * dr2b / dr21, h2_to_k1_rem)
2638 if (h2 > h2_to_k1)
then
2639 drcv = (rcvtgt(k1) - rcv(i,kb2))
2644 dspice_det = (ds_dt_gauge*drcv_ds(i)*(t(i,kb2)-t(i,kb1)) - &
2645 dt_ds_gauge*drcv_dt(i)*(s(i,kb2)-s(i,kb1))) * &
2646 (h2 - h2_to_k1) / (h1 + h2)
2648 if (h(i,k1) > 10.0*angstrom)
then
2649 dspice_lim = ds_dt_gauge*drcv_ds(i)*(t(i,k1)-t(i,kb2)) - &
2650 dt_ds_gauge*drcv_dt(i)*(s(i,k1)-s(i,kb2))
2651 if (dspice_det*dspice_lim <= 0.0) dspice_lim = 0.0
2653 if (k1<nz) then;
if (h(i,k1+1) > 10.0*angstrom)
then
2654 dspice_lim2 = ds_dt_gauge*drcv_ds(i)*(t(i,k1+1)-t(i,kb2)) - &
2655 dt_ds_gauge*drcv_dt(i)*(s(i,k1+1)-s(i,kb2))
2656 if ((dspice_det*dspice_lim2 > 0.0) .and. &
2657 (abs(dspice_lim2) > abs(dspice_lim))) dspice_lim = dspice_lim2
2659 if (abs(dspice_det) > abs(dspice_lim)) dspice_det = dspice_lim
2661 i_denom = 1.0 / (drcv_ds(i)**2 + (dt_ds_gauge*drcv_dt(i))**2)
2662 t_det = t(i,kb2) + dt_ds_gauge * i_denom * &
2663 (dt_ds_gauge * drcv_dt(i) * drcv + drcv_ds(i) * dspice_det)
2664 s_det = s(i,kb2) + i_denom * &
2665 (drcv_ds(i) * drcv - dt_ds_gauge * drcv_dt(i) * dspice_det)
2667 r0_det = r0(i,kb2) + (t_det-t(i,kb2)) * dr0_dt(i) + &
2668 (s_det-s(i,kb2)) * dr0_ds(i)
2673 ih2f = 1.0 / (h2 - h2_to_k1)
2675 t_min = min(t(i,kb2), t(i,kb1)) - cs%Allowed_T_chg
2676 t_max = max(t(i,kb2), t(i,kb1)) + cs%Allowed_T_chg
2677 t_new = (h2*t(i,kb2) - h2_to_k1*t_det)*ih2f
2678 if (t_new < t_min)
then
2679 h2_to_k1_lim = h2 * (t(i,kb2) - t_min) / (t_det - t_min)
2686 h2_to_k1 = h2_to_k1_lim
2687 ih2f = 1.0 / (h2 - h2_to_k1)
2688 elseif (t_new > t_max)
then
2689 h2_to_k1_lim = h2 * (t(i,kb2) - t_max) / (t_det - t_max)
2696 h2_to_k1 = h2_to_k1_lim
2697 ih2f = 1.0 / (h2 - h2_to_k1)
2699 s_min = max(min(s(i,kb2), s(i,kb1)) - cs%Allowed_S_chg, 0.0)
2700 s_max = max(s(i,kb2), s(i,kb1)) + cs%Allowed_S_chg
2701 s_new = (h2*s(i,kb2) - h2_to_k1*s_det)*ih2f
2702 if (s_new < s_min)
then
2703 h2_to_k1_lim = h2 * (s(i,kb2) - s_min) / (s_det - s_min)
2710 h2_to_k1 = h2_to_k1_lim
2711 ih2f = 1.0 / (h2 - h2_to_k1)
2712 elseif (s_new > s_max)
then
2713 h2_to_k1_lim = h2 * (s(i,kb2) - s_max) / (s_det - s_max)
2720 h2_to_k1 = h2_to_k1_lim
2721 ih2f = 1.0 / (h2 - h2_to_k1)
2724 ihk1 = 1.0 / (h(i,k1) + h_neglect + h2_to_k1)
2725 rcv(i,k1) = ((h(i,k1)+h_neglect)*rcv(i,k1) + h2_to_k1*rcvtgt(k1)) * ihk1
2726 rcv(i,kb2) = rcv(i,kb2) - h2_to_k1*drcv*ih2f
2728 t(i,kb2) = (h2*t(i,kb2) - h2_to_k1*t_det)*ih2f
2729 t(i,k1) = ((h(i,k1)+h_neglect)*t(i,k1) + h2_to_k1*t_det) * ihk1
2731 s(i,kb2) = (h2*s(i,kb2) - h2_to_k1*s_det) * ih2f
2732 s(i,k1) = ((h(i,k1)+h_neglect)*s(i,k1) + h2_to_k1*s_det) * ihk1
2735 r0(i,kb2) = (h2*r0(i,kb2) - h2_to_k1*r0_det) * ih2f
2736 r0(i,k1) = ((h(i,k1)+h_neglect)*r0(i,k1) + h2_to_k1*r0_det) * ihk1
2741 ihk1 = 1.0 / (h(i,k1) + h2)
2743 rcv(i,k1) = (h(i,k1)*rcv(i,k1) + h2*rcv(i,kb2)) * ihk1
2744 t(i,k1) = (h(i,k1)*t(i,k1) + h2*t(i,kb2)) * ihk1
2745 s(i,k1) = (h(i,k1)*s(i,k1) + h2*s(i,kb2)) * ihk1
2746 r0(i,k1) = (h(i,k1)*r0(i,k1) + h2*r0(i,kb2)) * ihk1
2749 h(i,k1) = h(i,k1) + h2_to_k1
2750 h(i,kb2) = h(i,kb2) - h2_to_k1 ; h2 = h(i,kb2)
2752 dpe_extrap = i2rho0*(r0_det-r0(i,kb2))*h2_to_k1*h2
2754 d_ea(i,kb2) = d_ea(i,kb2) - h2_to_k1
2755 d_ea(i,k1) = d_ea(i,k1) + h2_to_k1
2756 h2_to_k1_rem = max(h2_to_k1_rem - h2_to_k1, 0.0)
2763 h_det_h2 = max(h_min_bl-(h1+h2), 0.0)
2764 if (h_det_h2 > 0.0)
then
2770 h_det_to_h2 = min(h_to_bl, h_det_h2)
2771 h_ml_to_h2 = h_det_h2 - h_det_to_h2
2772 h_det_to_h1 = h_to_bl - h_det_to_h2
2773 h_ml_to_h1 = max(h_min_bl-h_det_to_h1,0.0)
2776 ihdet = 0.0 ;
if (h_to_bl > 0.0) ihdet = 1.0 / h_to_bl
2777 ih1f = 1.0 / (h_det_to_h1 + h_ml_to_h1)
2779 r0(i,kb2) = ((h2*r0(i,kb2) + h1*r0(i,kb1)) + &
2780 (h_det_to_h2*r0_to_bl*ihdet + h_ml_to_h2*r0(i,0))) * ih
2781 r0(i,kb1) = (h_det_to_h1*r0_to_bl*ihdet + h_ml_to_h1*r0(i,0)) * ih1f
2783 rcv(i,kb2) = ((h2*rcv(i,kb2) + h1*rcv(i,kb1)) + &
2784 (h_det_to_h2*rcv_to_bl*ihdet + h_ml_to_h2*rcv(i,0))) * ih
2785 rcv(i,kb1) = (h_det_to_h1*rcv_to_bl*ihdet + h_ml_to_h1*rcv(i,0)) * ih1f
2787 t(i,kb2) = ((h2*t(i,kb2) + h1*t(i,kb1)) + &
2788 (h_det_to_h2*t_to_bl*ihdet + h_ml_to_h2*t(i,0))) * ih
2789 t(i,kb1) = (h_det_to_h1*t_to_bl*ihdet + h_ml_to_h1*t(i,0)) * ih1f
2791 s(i,kb2) = ((h2*s(i,kb2) + h1*s(i,kb1)) + &
2792 (h_det_to_h2*s_to_bl*ihdet + h_ml_to_h2*s(i,0))) * ih
2793 s(i,kb1) = (h_det_to_h1*s_to_bl*ihdet + h_ml_to_h1*s(i,0)) * ih1f
2796 d_ea(i,1) = d_ea(i,1) - (h_ml_to_h1 + h_ml_to_h2)
2797 d_ea(i,kb1) = d_ea(i,kb1) + ((h_det_to_h1 + h_ml_to_h1) - h1)
2798 d_ea(i,kb2) = d_ea(i,kb2) + (h_min_bl - h2)
2800 h(i,kb1) = h_det_to_h1 + h_ml_to_h1 ; h(i,kb2) = h_min_bl
2801 h(i,0) = h(i,0) - (h_ml_to_h1 + h_ml_to_h2)
2804 if (
allocated(cs%diag_PE_detrain) .or.
allocated(cs%diag_PE_detrain2))
then
2805 r0_det = r0_to_bl*ihdet
2806 s1en = g_2 * idt_h2 * ( ((r0(i,kb2)-r0(i,kb1))*h1*h2 + &
2807 h_det_to_h2*( (r0(i,kb1)-r0_det)*h1 + (r0(i,kb2)-r0_det)*h2 ) + &
2808 h_ml_to_h2*( (r0(i,kb2)-r0(i,0))*h2 + (r0(i,kb1)-r0(i,0))*h1 + &
2809 (r0_det-r0(i,0))*h_det_to_h2 ) + &
2810 h_det_to_h1*h_ml_to_h1*(r0_det-r0(i,0))) - 2.0*gv%Rho0*dpe_extrap )
2812 if (
allocated(cs%diag_PE_detrain)) &
2813 cs%diag_PE_detrain(i,j) = cs%diag_PE_detrain(i,j) + s1en
2815 if (
allocated(cs%diag_PE_detrain2)) cs%diag_PE_detrain2(i,j) = &
2816 cs%diag_PE_detrain2(i,j) + s1en + idt_h2*rho0xg*dpe_extrap
2819 elseif ((h_to_bl > 0.0) .or. (h1 < h_min_bl) .or. (h2 < h_min_bl))
then
2824 h_from_ml = h_min_bl + max(h_min_bl-h2,0.0) - h1 - h_to_bl
2825 if (h_from_ml > 0.0)
then
2828 dpe_extrap = dpe_extrap - i2rho0*h_from_ml*(r0_to_bl - r0(i,0)*h_to_bl)
2829 r0_to_bl = r0_to_bl + h_from_ml*r0(i,0)
2830 rcv_to_bl = rcv_to_bl + h_from_ml*rcv(i,0)
2831 t_to_bl = t_to_bl + h_from_ml*t(i,0)
2832 s_to_bl = s_to_bl + h_from_ml*s(i,0)
2834 h_to_bl = h_to_bl + h_from_ml
2835 h(i,0) = h(i,0) - h_from_ml
2836 d_ea(i,1) = d_ea(i,1) - h_from_ml
2841 if (r0(i,kb2) - r0(i,kb1) > 1.0e-9*abs(r0(i,kb1) - r0_det)) &
2842 b1 = abs(r0(i,kb1) - r0_det) / (r0(i,kb2) - r0(i,kb1))
2843 stays_min = max((1.0-b1)*h1 - b1*h2, 0.0, h_min_bl - h_to_bl)
2844 stays_max = h1 - max(h_min_bl-h2,0.0)
2847 if (stays_max <= stays_min)
then
2849 mergeable_bl = .false.
2850 if (stays_max < h1) scale_slope = (h1 - stays_min) / (h1 - stays_max)
2855 i_ya = (h1 + h2) / ((h1 + h2) + h_to_bl)
2857 s1 = 0.5*(h1 + (h2 - bh0) * i_ya) ; s2 = h1 - s1
2862 s3sq = i_ya*max(bh0*h1-dpe_extrap, 0.0)
2864 s3sq = i_ya*(bh0*h1-min(dpe_extrap,0.0))
2867 if (s3sq == 0.0)
then
2870 elseif (s2*s2 <= s3sq)
then
2878 if (bh0 <= 0.0)
then ; stays = h1
2879 elseif (s2 > 0.0)
then
2881 if (s1 >= stays_max)
then ; stays = stays_max
2882 elseif (s1 >= 0.0)
then ; stays = s1 + sqrt(s2*s2 - s3sq)
2883 else ; stays = (h1*(s2-s1) - s3sq) / (-s1 + sqrt(s2*s2 - s3sq))
2887 if (s1 <= stays_min)
then ; stays = stays_min
2888 else ; stays = (h1*(s1-s2) + s3sq) / (s1 + sqrt(s2*s2 - s3sq))
2897 if (stays >= stays_max)
then ; stays = stays_max
2898 elseif (stays < stays_min)
then ; stays = stays_min
2902 dpe_det = g_2*((r0(i,kb1)*h_to_bl - r0_to_bl)*stays + &
2903 (r0(i,kb2)-r0(i,kb1)) * (h1-stays) * &
2904 (h2 - scale_slope*stays*((h1+h2)+h_to_bl)/(h1+h2)) ) - &
2907 if (dpe_time_ratio*h_to_bl > h_to_bl+h(i,0))
then
2908 dpe_ratio = (h_to_bl+h(i,0)) / h_to_bl
2910 dpe_ratio = dpe_time_ratio
2913 if ((mergeable_bl) .and. (num_events*dpe_ratio*dpe_det > dpe_merge))
then
2918 h1_to_k0 = (h1-stays_merge)
2919 stays = max(h_min_bl-h_to_bl,0.0)
2920 h1_to_h2 = stays_merge - stays
2922 ihk0 = 1.0 / ((h1_to_k0 + h2) + h(i,k0))
2923 ih1f = 1.0 / (h_to_bl + stays); ih2f = 1.0 / h1_to_h2
2924 ih12 = 1.0 / (h1 + h2)
2926 drcv_2dz = (rcv(i,kb1) - rcv(i,kb2)) * ih12
2927 drcv_stays = drcv_2dz*(h1_to_k0 + h1_to_h2)
2928 drcv_det = - drcv_2dz*(stays + h1_to_h2)
2929 rcv(i,k0) = ((h1_to_k0*(rcv(i,kb1) + drcv_det) + &
2930 h2*rcv(i,kb2)) + h(i,k0)*rcv(i,k0)) * ihk0
2931 rcv(i,kb2) = rcv(i,kb1) + drcv_2dz*(h1_to_k0-stays)
2932 rcv(i,kb1) = (rcv_to_bl + stays*(rcv(i,kb1) + drcv_stays)) * ih1f
2937 i_denom = 1.0 / (drcv_ds(i)**2 + (dt_ds_gauge*drcv_dt(i))**2)
2938 dspice_2dz = (ds_dt_gauge*drcv_ds(i)*(t(i,kb1)-t(i,kb2)) - &
2939 dt_ds_gauge*drcv_dt(i)*(s(i,kb1)-s(i,kb2))) * ih12
2940 dspice_lim = (ds_dt_gauge*dr0_ds(i)*(t_to_bl-t(i,kb1)*h_to_bl) - &
2941 dt_ds_gauge*dr0_dt(i)*(s_to_bl-s(i,kb1)*h_to_bl)) / h_to_bl
2942 if (dspice_lim * dspice_2dz <= 0.0) dspice_2dz = 0.0
2944 if (stays > 0.0)
then
2946 if (abs(dspice_lim) < abs(dspice_2dz*(h1_to_k0 + h1_to_h2))) &
2947 dspice_2dz = dspice_lim/(h1_to_k0 + h1_to_h2)
2949 dspice_stays = dspice_2dz*(h1_to_k0 + h1_to_h2)
2950 t_stays = t(i,kb1) + dt_ds_gauge * i_denom * &
2951 (dt_ds_gauge * drcv_dt(i) * drcv_stays + drcv_ds(i) * dspice_stays)
2952 s_stays = s(i,kb1) + i_denom * &
2953 (drcv_ds(i) * drcv_stays - dt_ds_gauge * drcv_dt(i) * dspice_stays)
2955 r0_stays = r0(i,kb1) + (t_stays-t(i,kb1)) * dr0_dt(i) + &
2956 (s_stays-s(i,kb1)) * dr0_ds(i)
2959 if (abs(dspice_lim) < abs(dspice_2dz*h1_to_k0)) &
2960 dspice_2dz = dspice_lim/h1_to_k0
2962 t_stays = 0.0 ; s_stays = 0.0 ; r0_stays = 0.0
2965 dspice_det = - dspice_2dz*(stays + h1_to_h2)
2966 t_det = t(i,kb1) + dt_ds_gauge * i_denom * &
2967 (dt_ds_gauge * drcv_dt(i) * drcv_det + drcv_ds(i) * dspice_det)
2968 s_det = s(i,kb1) + i_denom * &
2969 (drcv_ds(i) * drcv_det - dt_ds_gauge * drcv_dt(i) * dspice_det)
2971 r0_det = r0(i,kb1) + (t_det-t(i,kb1)) * dr0_dt(i) + &
2972 (s_det-s(i,kb1)) * dr0_ds(i)
2974 t(i,k0) = ((h1_to_k0*t_det + h2*t(i,kb2)) + h(i,k0)*t(i,k0)) * ihk0
2975 t(i,kb2) = (h1*t(i,kb1) - stays*t_stays - h1_to_k0*t_det) * ih2f
2976 t(i,kb1) = (t_to_bl + stays*t_stays) * ih1f
2978 s(i,k0) = ((h1_to_k0*s_det + h2*s(i,kb2)) + h(i,k0)*s(i,k0)) * ihk0
2979 s(i,kb2) = (h1*s(i,kb1) - stays*s_stays - h1_to_k0*s_det) * ih2f
2980 s(i,kb1) = (s_to_bl + stays*s_stays) * ih1f
2982 r0(i,k0) = ((h1_to_k0*r0_det + h2*r0(i,kb2)) + h(i,k0)*r0(i,k0)) * ihk0
2983 r0(i,kb2) = (h1*r0(i,kb1) - stays*r0_stays - h1_to_k0*r0_det) * ih2f
2984 r0(i,kb1) = (r0_to_bl + stays*r0_stays) * ih1f
3006 d_ea(i,kb1) = (d_ea(i,kb1) + h_to_bl) + (stays - h1)
3007 d_ea(i,kb2) = d_ea(i,kb2) + (h1_to_h2 - h2)
3008 d_ea(i,k0) = d_ea(i,k0) + (h1_to_k0 + h2)
3010 h(i,kb1) = stays + h_to_bl
3012 h(i,k0) = h(i,k0) + (h1_to_k0 + h2)
3013 if (
allocated(cs%diag_PE_detrain)) &
3014 cs%diag_PE_detrain(i,j) = cs%diag_PE_detrain(i,j) + idt_h2*dpe_merge
3015 if (
allocated(cs%diag_PE_detrain2)) cs%diag_PE_detrain2(i,j) = &
3016 cs%diag_PE_detrain2(i,j) + idt_h2*(dpe_det + rho0xg*dpe_extrap)
3021 h1_to_h2 = h1 - stays
3022 ih1f = 1.0 / (h_to_bl + stays) ; ih2f = 1.0 / (h2 + h1_to_h2)
3023 ih = 1.0 / (h1 + h2)
3024 dr0_2dz = (r0(i,kb1) - r0(i,kb2)) * ih
3025 r0(i,kb2) = (h2*r0(i,kb2) + h1_to_h2*(r0(i,kb1) - &
3026 scale_slope*dr0_2dz*stays)) * ih2f
3027 r0(i,kb1) = (r0_to_bl + stays*(r0(i,kb1) + &
3028 scale_slope*dr0_2dz*h1_to_h2)) * ih1f
3033 dr0 = scale_slope*dr0_2dz*h1_to_h2
3034 dspice_stays = (ds_dt_gauge*dr0_ds(i)*(t(i,kb1)-t(i,kb2)) - &
3035 dt_ds_gauge*dr0_dt(i)*(s(i,kb1)-s(i,kb2))) * &
3036 scale_slope*h1_to_h2 * ih
3037 if (h_to_bl > 0.0)
then
3038 dspice_lim = (ds_dt_gauge*dr0_ds(i)*(t_to_bl-t(i,kb1)*h_to_bl) - &
3039 dt_ds_gauge*dr0_dt(i)*(s_to_bl-s(i,kb1)*h_to_bl)) /&
3042 dspice_lim = ds_dt_gauge*dr0_ds(i)*(t(i,0)-t(i,kb1)) - &
3043 dt_ds_gauge*dr0_dt(i)*(s(i,0)-s(i,kb1))
3045 if (dspice_stays*dspice_lim <= 0.0)
then
3047 elseif (abs(dspice_stays) > abs(dspice_lim))
then
3048 dspice_stays = dspice_lim
3050 i_denom = 1.0 / (dr0_ds(i)**2 + (dt_ds_gauge*dr0_dt(i))**2)
3051 t_stays = t(i,kb1) + dt_ds_gauge * i_denom * &
3052 (dt_ds_gauge * dr0_dt(i) * dr0 + dr0_ds(i) * dspice_stays)
3053 s_stays = s(i,kb1) + i_denom * &
3054 (dr0_ds(i) * dr0 - dt_ds_gauge * dr0_dt(i) * dspice_stays)
3056 rcv_stays = rcv(i,kb1) + (t_stays-t(i,kb1)) * drcv_dt(i) + &
3057 (s_stays-s(i,kb1)) * drcv_ds(i)
3059 t(i,kb2) = (h2*t(i,kb2) + h1*t(i,kb1) - t_stays*stays) * ih2f
3060 t(i,kb1) = (t_to_bl + stays*t_stays) * ih1f
3061 s(i,kb2) = (h2*s(i,kb2) + h1*s(i,kb1) - s_stays*stays) * ih2f
3062 s(i,kb1) = (s_to_bl + stays*s_stays) * ih1f
3063 rcv(i,kb2) = (h2*rcv(i,kb2) + h1*rcv(i,kb1) - rcv_stays*stays) * ih2f
3064 rcv(i,kb1) = (rcv_to_bl + stays*rcv_stays) * ih1f
3083 d_ea(i,kb1) = d_ea(i,kb1) + ((stays - h1) + h_to_bl)
3084 d_ea(i,kb2) = d_ea(i,kb2) + h1_to_h2
3086 h(i,kb1) = stays + h_to_bl
3087 h(i,kb2) = h(i,kb2) + h1_to_h2
3089 if (
allocated(cs%diag_PE_detrain)) &
3090 cs%diag_PE_detrain(i,j) = cs%diag_PE_detrain(i,j) + idt_h2*dpe_det
3091 if (
allocated(cs%diag_PE_detrain2)) cs%diag_PE_detrain2(i,j) = &
3092 cs%diag_PE_detrain2(i,j) + idt_h2*(dpe_det + rho0xg*dpe_extrap)