38 implicit none ;
private 43 logical :: initialized = .false.
45 real :: test_kh_scaling
48 logical :: use_test_kh_profile
52 integer :: id_ert=-1, id_erb=-1, id_erc=-1, id_erh=-1, id_kddt=-1, id_kd=-1
53 integer :: id_chct=-1, id_chcb=-1, id_chcc=-1, id_chch=-1
54 integer :: id_t0=-1, id_tf=-1, id_s0=-1, id_sf=-1, id_n2_0=-1, id_n2_f=-1
55 integer :: id_h=-1, id_zint=-1
64 real,
dimension(G%isd:G%ied,G%jsd:G%jed,GV%ke), &
70 real,
intent(in) :: dt
73 real,
dimension(G%isd:G%ied,G%jsd:G%jed,GV%ke+1), &
74 optional,
intent(in) :: Kd_int
85 real,
dimension(GV%ke) :: &
88 real,
dimension(GV%ke+1) :: &
91 real :: ustar, absf, htot
94 integer :: i, j, k, is, ie, js, je, nz, itt
96 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
98 if (.not.
associated(cs))
call mom_error(fatal,
"diapyc_energy_req_test: "// &
99 "Module must be initialized before it is used.")
102 do j=js,je ;
do i=is,ie ;
if (g%mask2dT(i,j) > 0.5)
then 103 if (
present(kd_int) .and. .not.cs%use_test_Kh_profile)
then 104 do k=1,nz+1 ; kd(k) = cs%test_Kh_scaling*kd_int(i,j,k) ;
enddo 106 htot = 0.0 ; h_top(1) = 0.0
108 t0(k) = tv%T(i,j,k) ; s0(k) = tv%S(i,j,k)
109 h_col(k) = h_3d(i,j,k)
110 h_top(k+1) = h_top(k) + h_col(k)
115 h_bot(k) = h_bot(k+1) + h_col(k)
119 absf = 0.25*((abs(g%CoriolisBu(i-1,j-1)) + abs(g%CoriolisBu(i,j))) + &
120 (abs(g%CoriolisBu(i-1,j-1)) + abs(g%CoriolisBu(i,j))))
121 kd(1) = 0.0 ; kd(nz+1) = 0.0
123 tmp1 = h_top(k) * h_bot(k) * gv%H_to_m
124 kd(k) = cs%test_Kh_scaling * &
125 ustar * 0.41 * (tmp1*ustar) / (absf*tmp1 + htot*ustar)
128 may_print =
is_root_pe() .and. (i==ie) .and. (j==je)
130 may_print=may_print, cs=cs)
131 endif ;
enddo ;
enddo 142 G, GV, may_print, CS)
145 real,
dimension(GV%ke),
intent(in) :: h_in
147 real,
dimension(GV%ke),
intent(in) :: T_in
148 real,
dimension(GV%ke),
intent(in) :: S_in
149 real,
dimension(GV%ke+1),
intent(in) :: Kd
151 real,
intent(in) :: dt
153 real,
intent(out) :: energy_Kd
158 logical,
optional,
intent(in) :: may_print
161 optional,
pointer :: CS
184 real,
dimension(GV%ke) :: &
232 real,
dimension(GV%ke+1) :: &
242 real,
dimension(GV%ke+1,4) :: &
255 real :: dTe_term, dSe_term
264 real :: PE_change, ColHt_cor
266 real :: dT_k, dT_km1, dS_k, dS_km1
268 real :: Kd_rat, Kdr_denom, I_Kdr_denom
269 real :: dTe_t2, dSe_t2, dT_km1_t2, dS_km1_t2, dT_k_t2, dS_k_t2
273 real,
dimension(GV%ke) :: &
275 real,
dimension(GV%ke+1) :: &
276 dPEa_dKd, dPEa_dKd_est, dPEa_dKd_err, dPEa_dKd_trunc, dPEa_dKd_err_norm, &
277 dPEb_dKd, dPEb_dKd_est, dPEb_dKd_err, dPEb_dKd_trunc, dPEb_dKd_err_norm
278 real :: PE_chg_tot1A, PE_chg_tot2A, T_chg_totA
279 real :: PE_chg_tot1B, PE_chg_tot2B, T_chg_totB
280 real :: PE_chg_tot1C, PE_chg_tot2C, T_chg_totC
281 real :: PE_chg_tot1D, PE_chg_tot2D, T_chg_totD
282 real,
dimension(GV%ke+1) :: dPEchg_dKd
284 real,
dimension(6) :: dT_k_itt, dS_k_itt, dT_km1_itt, dS_km1_itt
287 real :: dKd_rat_dKd, ddT_k_dKd, ddS_k_dKd, ddT_km1_dKd, ddS_km1_dKd
288 integer :: k, nz, itt, max_itt, k_cent
289 logical :: surface_BL, bottom_BL, central, halves, debug
290 logical :: old_PE_calc
292 h_neglect = gv%H_subroundoff
294 i_g_earth = 1.0 / gv%g_Earth
297 surface_bl = .true. ; bottom_bl = .true. ; halves = .true.
298 central = .true. ; k_cent = nz/2
300 do_print = .false. ;
if (
present(may_print) .and.
present(cs)) do_print = may_print
302 dpea_dkd(:) = 0.0 ; dpea_dkd_est(:) = 0.0 ; dpea_dkd_err(:) = 0.0 ; dpea_dkd_err_norm(:) = 0.0 ; dpea_dkd_trunc(:) = 0.0
303 dpeb_dkd(:) = 0.0 ; dpeb_dkd_est(:) = 0.0 ; dpeb_dkd_err(:) = 0.0 ; dpeb_dkd_err_norm(:) = 0.0 ; dpeb_dkd_trunc(:) = 0.0
305 htot = 0.0 ; pres(1) = 0.0 ; z_int(1) = 0.0
307 t0(k) = t_in(k) ; s0(k) = s_in(k)
309 htot = htot + h_tr(k)
310 pres(k+1) = pres(k) + gv%g_Earth * gv%H_to_kg_m2 * h_tr(k)
311 p_lay(k) = 0.5*(pres(k) + pres(k+1))
312 z_int(k+1) = z_int(k) - gv%H_to_m * h_tr(k)
315 h_tr(k) = max(h_tr(k), 1e-15*htot)
320 kddt_h(1) = 0.0 ; kddt_h(nz+1) = 0.0
322 kddt_h(k) = min((gv%m_to_H**2*dt)*kd(k) / (0.5*(h_tr(k-1) + h_tr(k))),1e3*htot)
330 dmass = gv%H_to_kg_m2 * h_tr(k)
331 dpres = gv%g_Earth * dmass
332 dt_to_dpe(k) = (dmass * (pres(k) + 0.5*dpres)) * dsv_dt(k)
333 ds_to_dpe(k) = (dmass * (pres(k) + 0.5*dpres)) * dsv_ds(k)
334 dt_to_dcolht(k) = dmass * dsv_dt(k) * cs%ColHt_scaling
335 ds_to_dcolht(k) = dmass * dsv_ds(k) * cs%ColHt_scaling
340 pe_chg_k(:,:) = 0.0 ; colht_cor_k(:,:) = 0.0
344 old_pe_calc = .false.
348 hp_a(k) = h_tr(k) ; hp_b(k) = h_tr(k)
349 dt_to_dpe_a(k) = dt_to_dpe(k) ; ds_to_dpe_a(k) = ds_to_dpe(k)
350 dt_to_dpe_b(k) = dt_to_dpe(k) ; ds_to_dpe_b(k) = ds_to_dpe(k)
351 dt_to_dcolht_a(k) = dt_to_dcolht(k) ; ds_to_dcolht_a(k) = ds_to_dcolht(k)
352 dt_to_dcolht_b(k) = dt_to_dcolht(k) ; ds_to_dcolht_b(k) = ds_to_dcolht(k)
360 if (old_pe_calc)
then 362 dt_km1_t2 = (t0(k)-t0(k-1))
363 ds_km1_t2 = (s0(k)-s0(k-1))
364 dte_t2 = 0.0 ; dse_t2 = 0.0
366 dte_t2 = kddt_h(k-1) * ((t0(k-2) - t0(k-1)) + dte(k-2))
367 dse_t2 = kddt_h(k-1) * ((s0(k-2) - s0(k-1)) + dse(k-2))
368 dt_km1_t2 = (t0(k)-t0(k-1)) - &
369 (kddt_h(k-1) / hp_a(k-1)) * ((t0(k-2) - t0(k-1)) + dte(k-2))
370 ds_km1_t2 = (s0(k)-s0(k-1)) - &
371 (kddt_h(k-1) / hp_a(k-1)) * ((s0(k-2) - s0(k-1)) + dse(k-2))
373 dte_term = dte_t2 + hp_a(k-1) * (t0(k-1)-t0(k))
374 dse_term = dse_t2 + hp_a(k-1) * (s0(k-1)-s0(k))
377 th_a(k-1) = h_tr(k-1) * t0(k-1) ; sh_a(k-1) = h_tr(k-1) * s0(k-1)
379 th_a(k-1) = h_tr(k-1) * t0(k-1) + kddt_h(k-1) * te(k-2)
380 sh_a(k-1) = h_tr(k-1) * s0(k-1) + kddt_h(k-1) * se(k-2)
382 th_b(k) = h_tr(k) * t0(k) ; sh_b(k) = h_tr(k) * s0(k)
388 kddt_h_guess = kddt_h(k)
389 if (old_pe_calc)
then 391 dte_term, dse_term, dt_km1_t2, ds_km1_t2, &
392 dt_to_dpe(k), ds_to_dpe(k), dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), &
393 pres(k), dt_to_dcolht(k), ds_to_dcolht(k), &
394 dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
395 pe_chg_k(k,1), dpea_dkd(k))
397 call find_pe_chg(0.0, kddt_h_guess, hp_a(k-1), hp_b(k), &
398 th_a(k-1), sh_a(k-1), th_b(k), sh_b(k), &
399 dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
400 pres(k), dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
401 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
402 pe_chg=pe_chg_k(k,1), dpec_dkd=dpea_dkd(k), &
403 colht_cor=colht_cor_k(k,1))
408 kddt_h_guess = (1.0+0.01*(itt-3))*kddt_h(k)
410 if (old_pe_calc)
then 412 dte_term, dse_term, dt_km1_t2, ds_km1_t2, &
413 dt_to_dpe(k), ds_to_dpe(k), dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), &
414 pres(k), dt_to_dcolht(k), ds_to_dcolht(k), &
415 dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
418 call find_pe_chg(0.0, kddt_h_guess, hp_a(k-1), hp_b(k), &
419 th_a(k-1), sh_a(k-1), th_b(k), sh_b(k), &
420 dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
421 pres(k), dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
422 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
427 dpea_dkd_est(k) = (4.0*(pe_chg(4)-pe_chg(2))/(0.02*kddt_h(k)) - &
428 (pe_chg(5)-pe_chg(1))/(0.04*kddt_h(k))) / 3.0
429 dpea_dkd_trunc(k) = (pe_chg(4)-pe_chg(2))/(0.02*kddt_h(k)) - &
430 (pe_chg(5)-pe_chg(1))/(0.04*kddt_h(k))
431 dpea_dkd_err(k) = (dpea_dkd_est(k) - dpea_dkd(k))
432 dpea_dkd_err_norm(k) = (dpea_dkd_est(k) - dpea_dkd(k)) / &
433 (abs(dpea_dkd_est(k)) + abs(dpea_dkd(k)) + 1e-100)
439 b1 = 1.0 / (hp_a(k-1) + kddt_h(k))
440 c1_a(k) = kddt_h(k) * b1
442 te(1) = b1*(h_tr(1)*t0(1))
443 se(1) = b1*(h_tr(1)*s0(1))
445 te(k-1) = b1 * (h_tr(k-1) * t0(k-1) + kddt_h(k-1) * te(k-2))
446 se(k-1) = b1 * (h_tr(k-1) * s0(k-1) + kddt_h(k-1) * se(k-2))
448 if (old_pe_calc)
then 449 dte(k-1) = b1 * ( kddt_h(k)*(t0(k)-t0(k-1)) + dte_t2 )
450 dse(k-1) = b1 * ( kddt_h(k)*(s0(k)-s0(k-1)) + dse_t2 )
453 hp_a(k) = h_tr(k) + (hp_a(k-1) * b1) * kddt_h(k)
454 dt_to_dpe_a(k) = dt_to_dpe(k) + c1_a(k)*dt_to_dpe_a(k-1)
455 ds_to_dpe_a(k) = ds_to_dpe(k) + c1_a(k)*ds_to_dpe_a(k-1)
456 dt_to_dcolht_a(k) = dt_to_dcolht(k) + c1_a(k)*dt_to_dcolht_a(k-1)
457 ds_to_dcolht_a(k) = ds_to_dcolht(k) + c1_a(k)*ds_to_dcolht_a(k-1)
461 b1 = 1.0 / (hp_a(nz))
462 tf(nz) = b1 * (h_tr(nz) * t0(nz) + kddt_h(nz) * te(nz-1))
463 sf(nz) = b1 * (h_tr(nz) * s0(nz) + kddt_h(nz) * se(nz-1))
464 if (old_pe_calc)
then 465 dte(nz) = b1 * kddt_h(nz) * ((t0(nz-1)-t0(nz)) + dte(nz-1))
466 dse(nz) = b1 * kddt_h(nz) * ((s0(nz-1)-s0(nz)) + dse(nz-1))
470 tf(k) = te(k) + c1_a(k+1)*tf(k+1)
471 sf(k) = se(k) + c1_a(k+1)*sf(k+1)
475 do k=1,nz ; ta(k) = tf(k) ; sa(k) = sf(k) ;
enddo 476 pe_chg_tot1a = 0.0 ; pe_chg_tot2a = 0.0 ; t_chg_tota = 0.0
478 pe_chg_tot1a = pe_chg_tot1a + (dt_to_dpe(k) * (tf(k) - t0(k)) + &
479 ds_to_dpe(k) * (sf(k) - s0(k)))
480 t_chg_tota = t_chg_tota + h_tr(k) * (tf(k) - t0(k))
483 pe_chg_tot2a = pe_chg_tot2a + (pe_chg_k(k,1) - colht_cor_k(k,1))
490 old_pe_calc = .false.
494 hp_a(k) = h_tr(k) ; hp_b(k) = h_tr(k)
495 dt_to_dpe_a(k) = dt_to_dpe(k) ; ds_to_dpe_a(k) = ds_to_dpe(k)
496 dt_to_dpe_b(k) = dt_to_dpe(k) ; ds_to_dpe_b(k) = ds_to_dpe(k)
497 dt_to_dcolht_a(k) = dt_to_dcolht(k) ; ds_to_dcolht_a(k) = ds_to_dcolht(k)
498 dt_to_dcolht_b(k) = dt_to_dcolht(k) ; ds_to_dcolht_b(k) = ds_to_dcolht(k)
506 if (old_pe_calc)
then 508 dt_k_t2 = (t0(k-1)-t0(k))
509 ds_k_t2 = (s0(k-1)-s0(k))
510 dte_t2 = 0.0 ; dse_t2 = 0.0
512 dte_t2 = kddt_h(k+1) * ((t0(k+1) - t0(k)) + dte(k+1))
513 dse_t2 = kddt_h(k+1) * ((s0(k+1) - s0(k)) + dse(k+1))
514 dt_k_t2 = (t0(k-1)-t0(k)) - &
515 (kddt_h(k+1)/ hp_b(k)) * ((t0(k+1) - t0(k)) + dte(k+1))
516 ds_k_t2 = (s0(k-1)-s0(k)) - &
517 (kddt_h(k+1)/ hp_b(k)) * ((s0(k+1) - s0(k)) + dse(k+1))
519 dte_term = dte_t2 + hp_b(k) * (t0(k)-t0(k-1))
520 dse_term = dse_t2 + hp_b(k) * (s0(k)-s0(k-1))
522 th_a(k-1) = h_tr(k-1) * t0(k-1) ; sh_a(k-1) = h_tr(k-1) * s0(k-1)
524 th_b(k) = h_tr(k) * t0(k) ; sh_b(k) = h_tr(k) * s0(k)
526 th_b(k) = h_tr(k) * t0(k) + kddt_h(k+1) * te(k+1)
527 sh_b(k) = h_tr(k) * s0(k) + kddt_h(k+1) * se(k+1)
532 kddt_h_guess = kddt_h(k)
534 if (old_pe_calc)
then 536 dte_term, dse_term, dt_k_t2, ds_k_t2, &
537 dt_to_dpe(k-1), ds_to_dpe(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
538 pres(k), dt_to_dcolht(k-1), ds_to_dcolht(k-1), &
539 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
540 pe_chg=pe_chg_k(k,2), dpec_dkd=dpeb_dkd(k))
542 call find_pe_chg(0.0, kddt_h_guess, hp_a(k-1), hp_b(k), &
543 th_a(k-1), sh_a(k-1), th_b(k), sh_b(k), &
544 dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
545 pres(k), dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
546 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
547 pe_chg=pe_chg_k(k,2), dpec_dkd=dpeb_dkd(k), &
548 colht_cor=colht_cor_k(k,2))
554 kddt_h_guess = (1.0+0.01*(itt-3))*kddt_h(k)
556 if (old_pe_calc)
then 558 dte_term, dse_term, dt_k_t2, ds_k_t2, &
559 dt_to_dpe(k-1), ds_to_dpe(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
560 pres(k), dt_to_dcolht(k-1), ds_to_dcolht(k-1), &
561 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
564 call find_pe_chg(0.0, kddt_h_guess, hp_a(k-1), hp_b(k), &
565 th_a(k-1), sh_a(k-1), th_b(k), sh_b(k), &
566 dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
567 pres(k), dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
568 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
573 dpeb_dkd_est(k) = (4.0*(pe_chg(4)-pe_chg(2))/(0.02*kddt_h(k)) - &
574 (pe_chg(5)-pe_chg(1))/(0.04*kddt_h(k))) / 3.0
575 dpeb_dkd_trunc(k) = (pe_chg(4)-pe_chg(2))/(0.02*kddt_h(k)) - &
576 (pe_chg(5)-pe_chg(1))/(0.04*kddt_h(k))
577 dpeb_dkd_err(k) = (dpeb_dkd_est(k) - dpeb_dkd(k))
578 dpeb_dkd_err_norm(k) = (dpeb_dkd_est(k) - dpeb_dkd(k)) / &
579 (abs(dpeb_dkd_est(k)) + abs(dpeb_dkd(k)) + 1e-100)
585 b1 = 1.0 / (hp_b(k) + kddt_h(k))
586 c1_b(k) = kddt_h(k) * b1
588 te(nz) = b1* (h_tr(nz)*t0(nz))
589 se(nz) = b1* (h_tr(nz)*s0(nz))
591 te(k) = b1 * (h_tr(k) * t0(k) + kddt_h(k+1) * te(k+1))
592 se(k) = b1 * (h_tr(k) * s0(k) + kddt_h(k+1) * se(k+1))
594 if (old_pe_calc)
then 595 dte(k) = b1 * ( kddt_h(k)*(t0(k-1)-t0(k)) + dte_t2 )
596 dse(k) = b1 * ( kddt_h(k)*(s0(k-1)-s0(k)) + dse_t2 )
599 hp_b(k-1) = h_tr(k-1) + (hp_b(k) * b1) * kddt_h(k)
600 dt_to_dpe_b(k-1) = dt_to_dpe(k-1) + c1_b(k)*dt_to_dpe_b(k)
601 ds_to_dpe_b(k-1) = ds_to_dpe(k-1) + c1_b(k)*ds_to_dpe_b(k)
602 dt_to_dcolht_b(k-1) = dt_to_dcolht(k-1) + c1_b(k)*dt_to_dcolht_b(k)
603 ds_to_dcolht_b(k-1) = ds_to_dcolht(k-1) + c1_b(k)*ds_to_dcolht_b(k)
608 tf(1) = b1 * (h_tr(1) * t0(1) + kddt_h(2) * te(2))
609 sf(1) = b1 * (h_tr(1) * s0(1) + kddt_h(2) * se(2))
610 if (old_pe_calc)
then 611 dte(1) = b1 * kddt_h(2) * ((t0(2)-t0(1)) + dte(2))
612 dse(1) = b1 * kddt_h(2) * ((s0(2)-s0(1)) + dse(2))
616 tf(k) = te(k) + c1_b(k)*tf(k-1)
617 sf(k) = se(k) + c1_b(k)*sf(k-1)
621 do k=1,nz ; tb(k) = tf(k) ; sb(k) = sf(k) ;
enddo 622 pe_chg_tot1b = 0.0 ; pe_chg_tot2b = 0.0 ; t_chg_totb = 0.0
624 pe_chg_tot1b = pe_chg_tot1b + (dt_to_dpe(k) * (tf(k) - t0(k)) + &
625 ds_to_dpe(k) * (sf(k) - s0(k)))
626 t_chg_totb = t_chg_totb + h_tr(k) * (tf(k) - t0(k))
629 pe_chg_tot2b = pe_chg_tot2b + (pe_chg_k(k,2) - colht_cor_k(k,2))
639 hp_a(k) = h_tr(k) ; hp_b(k) = h_tr(k)
640 dt_to_dpe_a(k) = dt_to_dpe(k) ; ds_to_dpe_a(k) = ds_to_dpe(k)
641 dt_to_dpe_b(k) = dt_to_dpe(k) ; ds_to_dpe_b(k) = ds_to_dpe(k)
642 dt_to_dcolht_a(k) = dt_to_dcolht(k) ; ds_to_dcolht_a(k) = ds_to_dcolht(k)
643 dt_to_dcolht_b(k) = dt_to_dcolht(k) ; ds_to_dcolht_b(k) = ds_to_dcolht(k)
652 th_a(k-1) = h_tr(k-1) * t0(k-1) ; sh_a(k-1) = h_tr(k-1) * s0(k-1)
654 th_a(k-1) = h_tr(k-1) * t0(k-1) + kddt_h(k-1) * te_a(k-2)
655 sh_a(k-1) = h_tr(k-1) * s0(k-1) + kddt_h(k-1) * se_a(k-2)
657 th_b(k) = h_tr(k) * t0(k) ; sh_b(k) = h_tr(k) * s0(k)
660 if (k < k_cent) kddt_h_a(k) = kddt_h(k)
665 th_a(k-1), sh_a(k-1), th_b(k), sh_b(k), &
666 dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
667 pres(k), dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
668 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
669 pe_chg=pe_change, colht_cor=colht_cor)
670 pe_chg_k(k,3) = pe_change
671 colht_cor_k(k,3) = colht_cor
673 b1 = 1.0 / (hp_a(k-1) + kddt_h_a(k))
674 c1_a(k) = kddt_h_a(k) * b1
676 te_a(1) = b1*(h_tr(1)*t0(1))
677 se_a(1) = b1*(h_tr(1)*s0(1))
679 te_a(k-1) = b1 * (h_tr(k-1) * t0(k-1) + kddt_h_a(k-1) * te_a(k-2))
680 se_a(k-1) = b1 * (h_tr(k-1) * s0(k-1) + kddt_h_a(k-1) * se_a(k-2))
683 hp_a(k) = h_tr(k) + (hp_a(k-1) * b1) * kddt_h_a(k)
684 dt_to_dpe_a(k) = dt_to_dpe(k) + c1_a(k)*dt_to_dpe_a(k-1)
685 ds_to_dpe_a(k) = ds_to_dpe(k) + c1_a(k)*ds_to_dpe_a(k-1)
686 dt_to_dcolht_a(k) = dt_to_dcolht(k) + c1_a(k)*dt_to_dcolht_a(k-1)
687 ds_to_dcolht_a(k) = ds_to_dcolht(k) + c1_a(k)*ds_to_dcolht_a(k-1)
696 th_a(k-1) = h_tr(k-1) * t0(k-1) ; sh_a(k-1) = h_tr(k-1) * s0(k-1)
702 th_b(k) = h_tr(k) * t0(k) ; sh_b(k) = h_tr(k) * s0(k)
704 th_b(k) = h_tr(k) * t0(k) + kddt_h(k+1) * te_b(k+1)
705 sh_b(k) = h_tr(k) * s0(k) + kddt_h(k+1) * se_b(k+1)
708 kddt_h_b(k) = 0.0 ;
if (k > k_cent) kddt_h_b(k) = kddt_h(k)
712 th_a(k-1), sh_a(k-1), th_b(k), sh_b(k), &
713 dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
714 pres(k), dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
715 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
716 pe_chg=pe_change, colht_cor=colht_cor)
717 pe_chg_k(k,3) = pe_chg_k(k,3) + pe_change
718 colht_cor_k(k,3) = colht_cor_k(k,3) + colht_cor
720 b1 = 1.0 / (hp_b(k) + kddt_h_b(k))
721 c1_b(k) = kddt_h_b(k) * b1
723 te_b(k) = b1 * (h_tr(k)*t0(k))
724 se_b(k) = b1 * (h_tr(k)*s0(k))
726 te_b(k) = b1 * (h_tr(k) * t0(k) + kddt_h_b(k+1) * te_b(k+1))
727 se_b(k) = b1 * (h_tr(k) * s0(k) + kddt_h_b(k+1) * se_b(k+1))
730 hp_b(k-1) = h_tr(k-1) + (hp_b(k) * b1) * kddt_h_b(k)
731 dt_to_dpe_b(k-1) = dt_to_dpe(k-1) + c1_b(k)*dt_to_dpe_b(k)
732 ds_to_dpe_b(k-1) = ds_to_dpe(k-1) + c1_b(k)*ds_to_dpe_b(k)
733 dt_to_dcolht_b(k-1) = dt_to_dcolht(k-1) + c1_b(k)*dt_to_dcolht_b(k)
734 ds_to_dcolht_b(k-1) = ds_to_dcolht(k-1) + c1_b(k)*ds_to_dcolht_b(k)
744 th_a(k-1) = h_tr(k-1) * t0(k-1) ; sh_a(k-1) = h_tr(k-1) * s0(k-1)
746 th_a(k-1) = h_tr(k-1) * t0(k-1) + kddt_h(k-1) * te_a(k-2)
747 sh_a(k-1) = h_tr(k-1) * s0(k-1) + kddt_h(k-1) * se_a(k-2)
750 th_b(k) = h_tr(k) * t0(k) ; sh_b(k) = h_tr(k) * s0(k)
752 th_b(k) = h_tr(k) * t0(k) + kddt_h(k+1) * te_b(k+1)
753 sh_b(k) = h_tr(k) * s0(k) + kddt_h(k+1) * se_b(k+1)
759 th_a(k-1), sh_a(k-1), th_b(k), sh_b(k), &
760 dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
761 pres(k), dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
762 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
763 pe_chg=pe_change, colht_cor=colht_cor)
764 pe_chg_k(k,3) = pe_chg_k(k,3) + pe_change
765 colht_cor_k(k,3) = colht_cor_k(k,3) + colht_cor
780 b1 = 1.0 / (hp_a(k-1)*hp_b(k) + kddt_h(k)*(hp_a(k-1) + hp_b(k)))
781 tf(k-1) = ((hp_b(k) + kddt_h(k)) * th_a(k-1) + kddt_h(k) * th_b(k) ) * b1
782 sf(k-1) = ((hp_b(k) + kddt_h(k)) * sh_a(k-1) + kddt_h(k) * sh_b(k) ) * b1
783 tf(k) = (kddt_h(k) * th_a(k-1) + (hp_a(k-1) + kddt_h(k)) * th_b(k) ) * b1
784 sf(k) = (kddt_h(k) * sh_a(k-1) + (hp_a(k-1) + kddt_h(k)) * sh_b(k) ) * b1
786 c1_a(k) = kddt_h(k) / (hp_a(k-1) + kddt_h(k))
787 c1_b(k) = kddt_h(k) / (hp_b(k) + kddt_h(k))
792 tf(k) = te_a(k) + c1_a(k+1)*tf(k+1)
793 sf(k) = se_a(k) + c1_a(k+1)*sf(k+1)
796 tf(k) = te_b(k) + c1_b(k)*tf(k-1)
797 sf(k) = se_b(k) + c1_b(k)*sf(k-1)
801 pe_chg_tot1c = 0.0 ; pe_chg_tot2c = 0.0 ; t_chg_totc = 0.0
803 pe_chg_tot1c = pe_chg_tot1c + (dt_to_dpe(k) * (tf(k) - t0(k)) + &
804 ds_to_dpe(k) * (sf(k) - s0(k)))
805 t_chg_totc = t_chg_totc + h_tr(k) * (tf(k) - t0(k))
808 pe_chg_tot2c = pe_chg_tot2c + (pe_chg_k(k,3) - colht_cor_k(k,3))
818 hp_a(k) = h_tr(k) ; hp_b(k) = h_tr(k)
819 dt_to_dpe_a(k) = dt_to_dpe(k) ; ds_to_dpe_a(k) = ds_to_dpe(k)
820 dt_to_dpe_b(k) = dt_to_dpe(k) ; ds_to_dpe_b(k) = ds_to_dpe(k)
821 dt_to_dcolht_a(k) = dt_to_dcolht(k) ; ds_to_dcolht_a(k) = ds_to_dcolht(k)
822 dt_to_dcolht_b(k) = dt_to_dcolht(k) ; ds_to_dcolht_b(k) = ds_to_dcolht(k)
834 th_a(k-1) = h_tr(k-1) * t0(k-1) ; sh_a(k-1) = h_tr(k-1) * s0(k-1)
836 th_a(k-1) = h_tr(k-1) * t0(k-1) + kd_so_far(k-1) * te(k-2)
837 sh_a(k-1) = h_tr(k-1) * s0(k-1) + kd_so_far(k-1) * se(k-2)
839 th_b(k) = h_tr(k) * t0(k) ; sh_b(k) = h_tr(k) * s0(k)
841 dkd = 0.5 * kddt_h(k) - kd_so_far(k)
844 th_a(k-1), sh_a(k-1), th_b(k), sh_b(k), &
845 dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
846 pres(k), dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
847 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
848 pe_chg=pe_change, colht_cor=colht_cor)
850 pe_chg_k(k,4) = pe_change
851 colht_cor_k(k,4) = colht_cor
853 kd_so_far(k) = kd_so_far(k) + dkd
855 b1 = 1.0 / (hp_a(k-1) + kd_so_far(k))
856 c1_a(k) = kd_so_far(k) * b1
858 te(1) = b1*(h_tr(1)*t0(1))
859 se(1) = b1*(h_tr(1)*s0(1))
861 te(k-1) = b1 * (h_tr(k-1) * t0(k-1) + kd_so_far(k-1) * te(k-2))
862 se(k-1) = b1 * (h_tr(k-1) * s0(k-1) + kd_so_far(k-1) * se(k-2))
865 hp_a(k) = h_tr(k) + (hp_a(k-1) * b1) * kd_so_far(k)
866 dt_to_dpe_a(k) = dt_to_dpe(k) + c1_a(k)*dt_to_dpe_a(k-1)
867 ds_to_dpe_a(k) = ds_to_dpe(k) + c1_a(k)*ds_to_dpe_a(k-1)
868 dt_to_dcolht_a(k) = dt_to_dcolht(k) + c1_a(k)*dt_to_dcolht_a(k-1)
869 ds_to_dcolht_a(k) = ds_to_dcolht(k) + c1_a(k)*ds_to_dcolht_a(k-1)
877 th_a(k-1) = h_tr(k-1) * t0(k-1) ; sh_a(k-1) = h_tr(k-1) * s0(k-1)
879 th_a(k-1) = h_tr(k-1) * t0(k-1) + kd_so_far(k-1) * te(k-2)
880 sh_a(k-1) = h_tr(k-1) * s0(k-1) + kd_so_far(k-1) * se(k-2)
883 th_b(k) = h_tr(k) * t0(k) ; sh_b(k) = h_tr(k) * s0(k)
885 th_b(k) = h_tr(k) * t0(k) + kd_so_far(k+1) * te(k+1)
886 sh_b(k) = h_tr(k) * s0(k) + kd_so_far(k+1) * se(k+1)
889 dkd = kddt_h(k) - kd_so_far(k)
892 th_a(k-1), sh_a(k-1), th_b(k), sh_b(k), &
893 dt_to_dpe_a(k-1), ds_to_dpe_a(k-1), dt_to_dpe_b(k), ds_to_dpe_b(k), &
894 pres(k), dt_to_dcolht_a(k-1), ds_to_dcolht_a(k-1), &
895 dt_to_dcolht_b(k), ds_to_dcolht_b(k), &
896 pe_chg=pe_change, colht_cor=colht_cor)
898 pe_chg_k(k,4) = pe_chg_k(k,4) + pe_change
899 colht_cor_k(k,4) = colht_cor_k(k,4) + colht_cor
902 kd_so_far(k) = kd_so_far(k) + dkd
904 b1 = 1.0 / (hp_b(k) + kd_so_far(k))
905 c1_b(k) = kd_so_far(k) * b1
907 te(k) = b1 * (h_tr(k)*t0(k))
908 se(k) = b1 * (h_tr(k)*s0(k))
910 te(k) = b1 * (h_tr(k) * t0(k) + kd_so_far(k+1) * te(k+1))
911 se(k) = b1 * (h_tr(k) * s0(k) + kd_so_far(k+1) * se(k+1))
914 hp_b(k-1) = h_tr(k-1) + (hp_b(k) * b1) * kd_so_far(k)
915 dt_to_dpe_b(k-1) = dt_to_dpe(k-1) + c1_b(k)*dt_to_dpe_b(k)
916 ds_to_dpe_b(k-1) = ds_to_dpe(k-1) + c1_b(k)*ds_to_dpe_b(k)
917 dt_to_dcolht_b(k-1) = dt_to_dcolht(k-1) + c1_b(k)*dt_to_dcolht_b(k)
918 ds_to_dcolht_b(k-1) = ds_to_dcolht(k-1) + c1_b(k)*ds_to_dcolht_b(k)
925 tf(1) = b1 * (h_tr(1) * t0(1) + kddt_h(2) * te(2))
926 sf(1) = b1 * (h_tr(1) * s0(1) + kddt_h(2) * se(2))
928 tf(k) = te(k) + c1_b(k)*tf(k-1)
929 sf(k) = se(k) + c1_b(k)*sf(k-1)
933 pe_chg_tot1d = 0.0 ; pe_chg_tot2d = 0.0 ; t_chg_totd = 0.0
935 pe_chg_tot1d = pe_chg_tot1d + (dt_to_dpe(k) * (tf(k) - t0(k)) + &
936 ds_to_dpe(k) * (sf(k) - s0(k)))
937 t_chg_totd = t_chg_totd + h_tr(k) * (tf(k) - t0(k))
940 pe_chg_tot2d = pe_chg_tot2d + (pe_chg_k(k,4) - colht_cor_k(k,4))
946 energy_kd = 0.0 ;
do k=2,nz ; energy_kd = energy_kd + pe_chg_k(k,1) ;
enddo 947 energy_kd = energy_kd / dt
951 if (cs%id_ERt>0)
call post_data_1d_k(cs%id_ERt, pe_chg_k(:,1), cs%diag)
952 if (cs%id_ERb>0)
call post_data_1d_k(cs%id_ERb, pe_chg_k(:,2), cs%diag)
953 if (cs%id_ERc>0)
call post_data_1d_k(cs%id_ERc, pe_chg_k(:,3), cs%diag)
954 if (cs%id_ERh>0)
call post_data_1d_k(cs%id_ERh, pe_chg_k(:,4), cs%diag)
955 if (cs%id_Kddt>0)
call post_data_1d_k(cs%id_Kddt, gv%H_to_m*kddt_h, cs%diag)
957 if (cs%id_h>0)
call post_data_1d_k(cs%id_h, gv%H_to_m*h_tr, cs%diag)
959 if (cs%id_CHCt>0)
call post_data_1d_k(cs%id_CHCt, colht_cor_k(:,1), cs%diag)
960 if (cs%id_CHCb>0)
call post_data_1d_k(cs%id_CHCb, colht_cor_k(:,2), cs%diag)
961 if (cs%id_CHCc>0)
call post_data_1d_k(cs%id_CHCc, colht_cor_k(:,3), cs%diag)
962 if (cs%id_CHCh>0)
call post_data_1d_k(cs%id_CHCh, colht_cor_k(:,4), cs%diag)
967 if (cs%id_N2_0>0)
then 968 n2(1) = 0.0 ; n2(nz+1) = 0.0
971 pres(k), rho_here, tv%eqn_of_state)
972 n2(k) = (gv%g_Earth * rho_here / (0.5*gv%H_to_m*(h_tr(k-1) + h_tr(k)))) * &
973 ( 0.5*(dsv_dt(k-1) + dsv_dt(k)) * (t0(k-1) - t0(k)) + &
974 0.5*(dsv_ds(k-1) + dsv_ds(k)) * (s0(k-1) - s0(k)) )
978 if (cs%id_N2_f>0)
then 979 n2(1) = 0.0 ; n2(nz+1) = 0.0
982 pres(k), rho_here, tv%eqn_of_state)
983 n2(k) = (gv%g_Earth * rho_here / (0.5*gv%H_to_m*(h_tr(k-1) + h_tr(k)))) * &
984 ( 0.5*(dsv_dt(k-1) + dsv_dt(k)) * (tf(k-1) - tf(k)) + &
985 0.5*(dsv_ds(k-1) + dsv_ds(k)) * (sf(k-1) - sf(k)) )
995 subroutine find_pe_chg(Kddt_h0, dKddt_h, hp_a, hp_b, Th_a, Sh_a, Th_b, Sh_b, &
996 dT_to_dPE_a, dS_to_dPE_a, dT_to_dPE_b, dS_to_dPE_b, &
997 pres, dT_to_dColHt_a, dS_to_dColHt_a, dT_to_dColHt_b, dS_to_dColHt_b, &
998 PE_chg, dPEc_dKd, dPE_max, dPEc_dKd_0, ColHt_cor)
999 real,
intent(in) :: Kddt_h0
1002 real,
intent(in) :: dKddt_h
1005 real,
intent(in) :: hp_a
1009 real,
intent(in) :: hp_b
1013 real,
intent(in) :: Th_a
1016 real,
intent(in) :: Sh_a
1019 real,
intent(in) :: Th_b
1022 real,
intent(in) :: Sh_b
1025 real,
intent(in) :: dT_to_dPE_a
1029 real,
intent(in) :: dS_to_dPE_a
1033 real,
intent(in) :: dT_to_dPE_b
1037 real,
intent(in) :: dS_to_dPE_b
1041 real,
intent(in) :: pres
1044 real,
intent(in) :: dT_to_dColHt_a
1048 real,
intent(in) :: dS_to_dColHt_a
1052 real,
intent(in) :: dT_to_dColHt_b
1056 real,
intent(in) :: dS_to_dColHt_b
1061 real,
optional,
intent(out) :: PE_chg
1063 real,
optional,
intent(out) :: dPEc_dKd
1065 real,
optional,
intent(out) :: dPE_max
1068 real,
optional,
intent(out) :: dPEc_dKd_0
1070 real,
optional,
intent(out) :: ColHt_cor
1093 bdt1 = hp_a * hp_b + kddt_h0 * hps
1094 dt_c = hp_a * th_b - hp_b * th_a
1095 ds_c = hp_a * sh_b - hp_b * sh_a
1096 pec_core = hp_b * (dt_to_dpe_a * dt_c + ds_to_dpe_a * ds_c) - &
1097 hp_a * (dt_to_dpe_b * dt_c + ds_to_dpe_b * ds_c)
1098 colht_core = hp_b * (dt_to_dcolht_a * dt_c + ds_to_dcolht_a * ds_c) - &
1099 hp_a * (dt_to_dcolht_b * dt_c + ds_to_dcolht_b * ds_c)
1101 if (
present(pe_chg))
then 1104 y1 = dkddt_h / (bdt1 * (bdt1 + dkddt_h * hps))
1105 pe_chg = pec_core * y1
1106 colht_chg = colht_core * y1
1107 if (colht_chg < 0.0) pe_chg = pe_chg - pres * colht_chg
1108 if (
present(colht_cor)) colht_cor = -pres * min(colht_chg, 0.0)
1109 else if (
present(colht_cor))
then 1110 y1 = dkddt_h / (bdt1 * (bdt1 + dkddt_h * hps))
1111 colht_cor = -pres * min(colht_core * y1, 0.0)
1114 if (
present(dpec_dkd))
then 1116 y1 = 1.0 / (bdt1 + dkddt_h * hps)**2
1117 dpec_dkd = pec_core * y1
1118 colht_chg = colht_core * y1
1119 if (colht_chg < 0.0) dpec_dkd = dpec_dkd - pres * colht_chg
1122 if (
present(dpe_max))
then 1124 y1 = 1.0 / (bdt1 * hps)
1125 dpe_max = pec_core * y1
1126 colht_chg = colht_core * y1
1127 if (colht_chg < 0.0) dpe_max = dpe_max - pres * colht_chg
1130 if (
present(dpec_dkd_0))
then 1133 dpec_dkd_0 = pec_core * y1
1134 colht_chg = colht_core * y1
1135 if (colht_chg < 0.0) dpec_dkd_0 = dpec_dkd_0 - pres * colht_chg
1145 dT_km1_t2, dS_km1_t2, dT_to_dPE_k, dS_to_dPE_k, &
1146 dT_to_dPEa, dS_to_dPEa, pres, dT_to_dColHt_k, &
1147 dS_to_dColHt_k, dT_to_dColHta, dS_to_dColHta, &
1148 PE_chg, dPEc_dKd, dPE_max, dPEc_dKd_0)
1149 real,
intent(in) :: Kddt_h
1152 real,
intent(in) :: h_k
1153 real,
intent(in) :: b_den_1
1157 real,
intent(in) :: dTe_term
1159 real,
intent(in) :: dSe_term
1161 real,
intent(in) :: dT_km1_t2
1163 real,
intent(in) :: dS_km1_t2
1165 real,
intent(in) :: pres
1168 real,
intent(in) :: dT_to_dPE_k
1172 real,
intent(in) :: dS_to_dPE_k
1176 real,
intent(in) :: dT_to_dPEa
1180 real,
intent(in) :: dS_to_dPEa
1184 real,
intent(in) :: dT_to_dColHt_k
1188 real,
intent(in) :: dS_to_dColHt_k
1192 real,
intent(in) :: dT_to_dColHta
1196 real,
intent(in) :: dS_to_dColHta
1201 real,
optional,
intent(out) :: PE_chg
1203 real,
optional,
intent(out) :: dPEc_dKd
1205 real,
optional,
intent(out) :: dPE_max
1208 real,
optional,
intent(out) :: dPEc_dKd_0
1225 real :: dT_k, dT_km1
1226 real :: dS_k, dS_km1
1227 real :: I_Kr_denom, dKr_dKd
1228 real :: ddT_k_dKd, ddT_km1_dKd
1229 real :: ddS_k_dKd, ddS_km1_dKd
1231 b1 = 1.0 / (b_den_1 + kddt_h)
1239 i_kr_denom = 1.0 / (h_k*b_den_1 + (b_den_1 + h_k)*kddt_h)
1241 dt_k = (kddt_h*i_kr_denom) * dte_term
1242 ds_k = (kddt_h*i_kr_denom) * dse_term
1244 if (
present(pe_chg))
then 1247 dt_km1 = b1kd * ( dt_k + dt_km1_t2 )
1248 ds_km1 = b1kd * ( ds_k + ds_km1_t2 )
1250 pe_chg = (dt_to_dpe_k * dt_k + dt_to_dpea * dt_km1) + &
1251 (ds_to_dpe_k * ds_k + ds_to_dpea * ds_km1)
1252 colht_chg = (dt_to_dcolht_k * dt_k + dt_to_dcolhta * dt_km1) + &
1253 (ds_to_dcolht_k * ds_k + ds_to_dcolhta * ds_km1)
1254 if (colht_chg < 0.0) pe_chg = pe_chg - pres * colht_chg
1257 if (
present(dpec_dkd))
then 1259 dkr_dkd = (h_k*b_den_1) * i_kr_denom**2
1261 ddt_k_dkd = dkr_dkd * dte_term
1262 dds_k_dkd = dkr_dkd * dse_term
1263 ddt_km1_dkd = (b1**2 * b_den_1) * ( dt_k + dt_km1_t2 ) + b1kd * ddt_k_dkd
1264 dds_km1_dkd = (b1**2 * b_den_1) * ( ds_k + ds_km1_t2 ) + b1kd * dds_k_dkd
1267 dpec_dkd = (dt_to_dpe_k * ddt_k_dkd + dt_to_dpea * ddt_km1_dkd) + &
1268 (ds_to_dpe_k * dds_k_dkd + ds_to_dpea * dds_km1_dkd)
1269 dcolht_dkd = (dt_to_dcolht_k * ddt_k_dkd + dt_to_dcolhta * ddt_km1_dkd) + &
1270 (ds_to_dcolht_k * dds_k_dkd + ds_to_dcolhta * dds_km1_dkd)
1271 if (dcolht_dkd < 0.0) dpec_dkd = dpec_dkd - pres * dcolht_dkd
1274 if (
present(dpe_max))
then 1276 dpe_max = (dt_to_dpea * dt_km1_t2 + ds_to_dpea * ds_km1_t2) + &
1277 ((dt_to_dpe_k + dt_to_dpea) * dte_term + &
1278 (ds_to_dpe_k + ds_to_dpea) * dse_term) / (b_den_1 + h_k)
1279 dcolht_max = (dt_to_dcolhta * dt_km1_t2 + ds_to_dcolhta * ds_km1_t2) + &
1280 ((dt_to_dcolht_k + dt_to_dcolhta) * dte_term + &
1281 (ds_to_dcolht_k + ds_to_dcolhta) * dse_term) / (b_den_1 + h_k)
1282 if (dcolht_max < 0.0) dpe_max = dpe_max - pres*dcolht_max
1285 if (
present(dpec_dkd_0))
then 1287 dpec_dkd_0 = (dt_to_dpea * dt_km1_t2 + ds_to_dpea * ds_km1_t2) / (b_den_1) + &
1288 (dt_to_dpe_k * dte_term + ds_to_dpe_k * dse_term) / (h_k*b_den_1)
1289 dcolht_dkd = (dt_to_dcolhta * dt_km1_t2 + ds_to_dcolhta * ds_km1_t2) / (b_den_1) + &
1290 (dt_to_dcolht_k * dte_term + ds_to_dcolht_k * dse_term) / (h_k*b_den_1)
1291 if (dcolht_dkd < 0.0) dpec_dkd_0 = dpec_dkd_0 - pres*dcolht_dkd
1297 type(time_type),
intent(in) :: Time
1300 type(
diag_ctrl),
target,
intent(inout) :: diag
1305 integer,
save :: init_calls = 0
1307 #include "version_variable.h" 1308 character(len=40) :: mdl =
"MOM_diapyc_energy_req" 1309 character(len=256) :: mesg
1311 if (.not.
associated(cs))
then ;
allocate(cs)
1312 else ;
return ;
endif 1314 cs%initialized = .true.
1319 call get_param(param_file, mdl,
"ENERGY_REQ_KH_SCALING", cs%test_Kh_scaling, &
1320 "A scaling factor for the diapycnal diffusivity used in \n"//&
1321 "testing the energy requirements.", default=1.0, units=
"nondim")
1322 call get_param(param_file, mdl,
"ENERGY_REQ_COL_HT_SCALING", cs%ColHt_scaling, &
1323 "A scaling factor for the column height change correction \n"//&
1324 "used in testing the energy requirements.", default=1.0, units=
"nondim")
1325 call get_param(param_file, mdl,
"ENERGY_REQ_USE_TEST_PROFILE", &
1326 cs%use_test_Kh_profile, &
1327 "If true, use the internal test diffusivity profile in \n"//&
1328 "place of any that might be passed in as an argument.", default=.false.)
1331 "Diffusivity Energy Requirements, top-down",
"J m-2")
1333 "Diffusivity Energy Requirements, bottom-up",
"J m-2")
1335 "Diffusivity Energy Requirements, center-last",
"J m-2")
1337 "Diffusivity Energy Requirements, halves",
"J m-2")
1339 "Implicit diffusive coupling coefficient",
"m")
1341 "Diffusivity in test",
"m2 s-1")
1343 "Test column layer thicknesses",
"m")
1345 "Test column layer interface heights",
"m")
1347 "Column Height Correction to Energy Requirements, top-down",
"J m-2")
1349 "Column Height Correction to Energy Requirements, bottom-up",
"J m-2")
1351 "Column Height Correction to Energy Requirements, center-last",
"J m-2")
1353 "Column Height Correction to Energy Requirements, halves",
"J m-2")
1355 "Temperature before mixing",
"deg C")
1357 "Temperature after mixing",
"deg C")
1359 "Salinity before mixing",
"g kg-1")
1361 "Salinity after mixing",
"g kg-1")
1363 "Squared buoyancy frequency before mixing",
"second-2")
1365 "Squared buoyancy frequency after mixing",
"second-2")
1371 if (
associated(cs))
deallocate(cs)
subroutine, public diapyc_energy_req_init(Time, G, param_file, diag, CS)
Ocean grid type. See mom_grid for details.
subroutine, public diapyc_energy_req_end(CS)
Calculates density of sea water from T, S and P.
Provides the ocean grid type.
subroutine, public calculate_specific_vol_derivs(T, S, pressure, dSV_dT, dSV_dS, start, npts, EOS)
Calls the appropriate subroutine to calculate specific volume derivatives for an array.
subroutine find_pe_chg_orig(Kddt_h, h_k, b_den_1, dTe_term, dSe_term, dT_km1_t2, dS_km1_t2, dT_to_dPE_k, dS_to_dPE_k, dT_to_dPEa, dS_to_dPEa, pres, dT_to_dColHt_k, dS_to_dColHt_k, dT_to_dColHta, dS_to_dColHta, PE_chg, dPEc_dKd, dPE_max, dPEc_dKd_0)
This subroutine calculates the change in potential energy and or derivatives for several changes in a...
logical function, public is_root_pe()
subroutine find_pe_chg(Kddt_h0, dKddt_h, hp_a, hp_b, Th_a, Sh_a, Th_b, Sh_b, dT_to_dPE_a, dS_to_dPE_a, dT_to_dPE_b, dS_to_dPE_b, pres, dT_to_dColHt_a, dS_to_dColHt_a, dT_to_dColHt_b, dS_to_dColHt_b, PE_chg, dPEc_dKd, dPE_max, dPEc_dKd_0, ColHt_cor)
This subroutine calculates the change in potential energy and or derivatives for several changes in a...
subroutine, public diapyc_energy_req_calc(h_in, T_in, S_in, Kd, energy_Kd, dt, tv, G, GV, may_print, CS)
This subroutine uses a substantially refactored tridiagonal equation for diapycnal mixing of temperat...
subroutine, public diapyc_energy_req_test(h_3d, dt, tv, G, GV, CS, Kd_int)
subroutine, public mom_mesg(message, verb, all_print)
Provides subroutines for quantities specific to the equation of state.
The thermo_var_ptrs structure contains pointers to an assortment of thermodynamic fields that may be ...
subroutine, public mom_error(level, message, all_print)