27 #if defined DEBUG || defined QUICKDEBUG 41 public :: atmos_phy_bl_mynn_tracer_setup
42 public :: atmos_phy_bl_mynn_setup
43 public :: atmos_phy_bl_mynn_tendency
44 public :: atmos_phy_bl_mynn_tendency_tracer
50 integer,
public :: atmos_phy_bl_mynn_ntracer
51 character(len=H_SHORT),
public,
allocatable :: atmos_phy_bl_mynn_name(:)
52 character(len=H_LONG),
public,
allocatable :: atmos_phy_bl_mynn_desc(:)
53 character(len=H_SHORT),
public,
allocatable :: atmos_phy_bl_mynn_units(:)
63 integer,
private,
parameter :: i_tke = 1
64 integer,
private,
parameter :: i_tsq = 2
65 integer,
private,
parameter :: i_qsq = 3
66 integer,
private,
parameter :: i_cov = 4
68 real(RP),
private,
parameter :: oneoverthree = 1.0_rp / 3.0_rp
69 real(RP),
private,
parameter :: lt_min = 1.e-6_rp
71 real(RP),
private :: a1
72 real(RP),
private :: a2
73 real(RP),
private,
parameter :: b1 = 24.0_rp
74 real(RP),
private,
parameter :: b2 = 15.0_rp
75 real(RP),
private :: c1
76 real(RP),
private,
parameter :: c2 = 0.75_rp
77 real(RP),
private,
parameter :: c3 = 0.352_rp
78 real(RP),
private,
parameter :: c5 = 0.2_rp
79 real(RP),
private,
parameter :: g1 = 0.235_rp
80 real(RP),
private :: g2
81 real(RP),
private :: f1
82 real(RP),
private :: f2
83 real(RP),
private :: rf1
84 real(RP),
private :: rf2
85 real(RP),
private :: rfc
86 real(RP),
private :: af12
87 real(RP),
private,
parameter :: prn = 0.74_rp
89 real(RP),
private :: sqrt_2pi
90 real(RP),
private :: rsqrt_2pi
91 real(RP),
private :: rsqrt_2
93 integer,
private :: ke_pbl
95 real(RP),
private :: atmos_phy_bl_mynn_pbl_max = 1.e+10_rp
96 real(RP),
private :: atmos_phy_bl_mynn_tke_min = 1.e-10_rp
97 real(RP),
private :: atmos_phy_bl_mynn_n2_max = 1.e+3_rp
98 real(RP),
private :: atmos_phy_bl_mynn_nu_min = 1.e-6_rp
99 real(RP),
private :: atmos_phy_bl_mynn_nu_max = 10000.0_rp
100 real(RP),
private :: atmos_phy_bl_mynn_kh_min = 1.e-6_rp
101 real(RP),
private :: atmos_phy_bl_mynn_kh_max = 10000.0_rp
102 real(RP),
private :: atmos_phy_bl_mynn_lt_max = 700.0_rp
104 character(len=H_SHORT),
private :: atmos_phy_bl_mynn_level =
"2.5" 106 namelist / param_atmos_phy_bl_mynn / &
107 atmos_phy_bl_mynn_pbl_max, &
108 atmos_phy_bl_mynn_n2_max, &
109 atmos_phy_bl_mynn_nu_min, &
110 atmos_phy_bl_mynn_nu_max, &
111 atmos_phy_bl_mynn_kh_min, &
112 atmos_phy_bl_mynn_kh_max, &
113 atmos_phy_bl_mynn_lt_max, &
114 atmos_phy_bl_mynn_level
123 subroutine atmos_phy_bl_mynn_tracer_setup( )
130 log_info(
"ATMOS_PHY_BL_MYNN_tracer_setup",*)
'Tracer Setup' 131 log_info(
"ATMOS_PHY_BL_MYNN_tracer_setup",*)
'Mellor-Yamada Nakanishi-Niino scheme' 135 read(
io_fid_conf,nml=param_atmos_phy_bl_mynn,iostat=ierr)
137 log_error(
"ATMOS_PHY_BL_MYNN_tracer_setup",*)
'Not appropriate names in namelist PARAM_ATMOS_PHY_BL_MYNN. Check!' 141 select case ( atmos_phy_bl_mynn_level )
143 atmos_phy_bl_mynn_ntracer = 1
144 allocate( atmos_phy_bl_mynn_name(1), atmos_phy_bl_mynn_desc(1), atmos_phy_bl_mynn_units(1) )
145 atmos_phy_bl_mynn_name(:) = (/
'TKE_MYNN' /)
146 atmos_phy_bl_mynn_desc(:) = (/
'turbulent kinetic energy (MYNN)' /)
147 atmos_phy_bl_mynn_units(:) = (/
'm2/s2' /)
149 atmos_phy_bl_mynn_ntracer = 4
150 allocate( atmos_phy_bl_mynn_name(4), atmos_phy_bl_mynn_desc(4), atmos_phy_bl_mynn_units(4) )
151 atmos_phy_bl_mynn_name(:) = (/
'TKE_MYNN', &
155 atmos_phy_bl_mynn_desc(:) = (/
'turbulent kinetic energy (MYNN) ', &
156 'sub-grid variance of liquid water potential temperature (MYNN) ', &
157 'sub-grid variance of total water content (MYNN) ', &
158 'sub-grid covariance of liquid water potential temperature and total water content (MYNN)' /)
159 atmos_phy_bl_mynn_units(:) = (/
'm2/s2 ', &
164 log_error(
"ATMOS_PHY_BL_MYNN_tracer_setup",*)
'only level 2.5 and 3 are supported at this moment' 169 end subroutine atmos_phy_bl_mynn_tracer_setup
175 subroutine atmos_phy_bl_mynn_setup( &
176 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
185 integer,
intent(in) ::
ka,
ks,
ke 186 integer,
intent(in) ::
ia,
is,
ie 187 integer,
intent(in) ::
ja,
js,
je 188 real(RP),
intent(in) :: cz (
ka,
ia,
ja)
190 real(RP),
intent(in),
optional :: tke_min
191 real(RP),
intent(in),
optional :: pbl_max
198 log_info(
"ATMOS_PHY_BL_MYNN_setup",*)
'Setup' 199 log_info(
"ATMOS_PHY_BL_MYNN_setup",*)
'Mellor-Yamada Nakanishi-Niino scheme' 201 if (
present(tke_min) ) atmos_phy_bl_mynn_tke_min = tke_min
202 if (
present(pbl_max) ) atmos_phy_bl_mynn_pbl_max = pbl_max
206 read(
io_fid_conf,nml=param_atmos_phy_bl_mynn,iostat=ierr)
208 log_info(
"ATMOS_PHY_BL_MYNN_setup",*)
'Not found namelist. Default used.' 209 elseif( ierr > 0 )
then 210 log_error(
"ATMOS_PHY_BL_MYNN_setup",*)
'Not appropriate names in namelist PARAM_ATMOS_PHY_BL_MYNN. Check!' 213 log_nml(param_atmos_phy_bl_mynn)
215 a1 = b1 * (1.0_rp - 3.0_rp * g1) / 6.0_rp
216 a2 = 1.0_rp / (3.0_rp * g1 * b1**(1.0_rp/3.0_rp) * prn )
217 c1 = g1 - 1.0_rp / ( 3.0_rp * a1 * b1**(1.0_rp/3.0_rp) )
218 g2 = ( 2.0_rp * a1 * (3.0_rp - 2.0_rp * c2) + b2 * (1.0_rp - c3) ) / b1
219 f1 = b1 * (g1 - c1) + 2.0_rp * a1 * (3.0_rp - 2.0_rp * c2) + 3.0_rp * a2 * (1.0_rp - c2) * (1.0_rp - c5)
220 f2 = b1 * (g1 + g2) - 3.0_rp * a1 * (1.0_rp - c2)
222 rf1 = b1 * (g1 - c1) / f1
226 af12 = a1 * f1 / ( a2 * f2 )
228 sqrt_2pi = sqrt( 2.0_rp * pi )
229 rsqrt_2pi = 1.0_rp / sqrt_2pi
230 rsqrt_2 = 1.0_rp / sqrt( 2.0_rp )
235 if ( atmos_phy_bl_mynn_pbl_max >= cz(k,i,j) )
then 242 if ( atmos_phy_bl_mynn_level ==
"3" )
then 243 log_warn(
"ATMOS_PHY_BL_MYNN_setup", *)
"At this moment, level 3 is still experimental" 247 end subroutine atmos_phy_bl_mynn_setup
253 subroutine atmos_phy_bl_mynn_tendency( &
254 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
255 DENS, U, V, POTT, PROG, &
257 QDRY, QV, Qw, POTL, POTV, &
258 SFLX_MU, SFLX_MV, SFLX_SH, SFLX_QV, &
261 RHOU_t, RHOV_t, RHOT_t, RPROG_t, &
274 hydrometeor_lhv => atmos_hydrometeor_lhv, &
277 matrix_solver_tridiagonal
279 atmos_saturation_dens2qsat => atmos_saturation_dens2qsat_all
284 integer,
intent(in) ::
ka,
ks,
ke 285 integer,
intent(in) ::
ia,
is,
ie 286 integer,
intent(in) ::
ja,
js,
je 288 real(RP),
intent(in) :: dens (
ka,
ia,
ja)
289 real(RP),
intent(in) :: u (
ka,
ia,
ja)
290 real(RP),
intent(in) :: v (
ka,
ia,
ja)
291 real(RP),
intent(in) :: pott (
ka,
ia,
ja)
292 real(RP),
intent(in) :: prog (
ka,
ia,
ja,atmos_phy_bl_mynn_ntracer)
293 real(RP),
intent(in) :: pres (
ka,
ia,
ja)
294 real(RP),
intent(in) :: exner (
ka,
ia,
ja)
295 real(RP),
intent(in) :: n2 (
ka,
ia,
ja)
296 real(RP),
intent(in) :: qdry (
ka,
ia,
ja)
297 real(RP),
intent(in) :: qv (
ka,
ia,
ja)
298 real(RP),
intent(in) :: qw (
ka,
ia,
ja)
299 real(RP),
intent(in) :: potl (
ka,
ia,
ja)
300 real(RP),
intent(in) :: potv (
ka,
ia,
ja)
301 real(RP),
intent(in) :: sflx_mu(
ia,
ja)
302 real(RP),
intent(in) :: sflx_mv(
ia,
ja)
303 real(RP),
intent(in) :: sflx_sh(
ia,
ja)
304 real(RP),
intent(in) :: sflx_qv(
ia,
ja)
305 real(RP),
intent(in) :: l_mo (
ia,
ja)
307 real(RP),
intent(in) :: cz(
ka,
ia,
ja)
308 real(RP),
intent(in) :: fz(0:
ka,
ia,
ja)
309 real(DP),
intent(in) :: dt_dp
311 real(RP),
intent(out) :: rhou_t(
ka,
ia,
ja)
312 real(RP),
intent(out) :: rhov_t(
ka,
ia,
ja)
313 real(RP),
intent(out) :: rhot_t(
ka,
ia,
ja)
314 real(RP),
intent(out) :: rprog_t(
ka,
ia,
ja,atmos_phy_bl_mynn_ntracer)
315 real(RP),
intent(out) :: nu (
ka,
ia,
ja)
316 real(RP),
intent(out) :: kh (
ka,
ia,
ja)
320 real(RP) :: prod (
ka,
ia,
ja)
321 real(RP) :: diss (
ka,
ia,
ja)
322 real(RP) :: dudz2(
ka,
ia,
ja)
325 real(RP) :: flxu(
ka,
ia,
ja)
326 real(RP) :: flxv(
ka,
ia,
ja)
327 real(RP) :: flxt(
ka,
ia,
ja)
329 real(RP) :: teml (
ka)
330 real(RP) :: rhonu (
ka)
331 real(RP) :: rhokh (
ka)
332 real(RP) :: lhvl (
ka)
334 real(RP) :: n2_new(
ka)
339 real(RP) :: q2_2 (
ka)
343 real(RP) :: tvsq (
ka)
344 real(RP) :: tvsq25(
ka)
361 real(RP) :: dtldz(
ka)
362 real(RP) :: dqwdz(
ka)
377 real(RP) :: phi_n(
ka)
378 real(RP) :: dummy(
ka)
382 real(RP) :: us, us3, zeta, phi_m, phi_h
384 real(RP) :: f2h(
ka,2)
387 logical :: mynn_level3
396 log_progress(*)
"atmosphere / physics / pbl / MYNN" 398 mynn_level3 = ( atmos_phy_bl_mynn_level ==
"3" )
421 z1 = cz(
ks,i,j) - fz(
ks-1,i,j)
423 sflx_pt = sflx_sh(i,j) / ( cpdry * dens(
ks,i,j) * exner(
ks,i,j) )
427 dudz2(
ks,i,j) = ( ( u(
ks+1,i,j) - u(
ks,i,j) )**2 + ( v(
ks+1,i,j) - v(
ks,i,j) )**2 ) &
428 / ( cz(
ks+1,i,j) - cz(
ks,i,j) )**2
430 dudz2(k,i,j) = ( ( u(k+1,i,j) - u(k-1,i,j) )**2 + ( v(k+1,i,j) - v(k-1,i,j) )**2 ) &
431 / ( cz(k+1,i,j) - cz(k-1,i,j) )**2
438 n2_new(k) = min( atmos_phy_bl_mynn_n2_max, n2(k,i,j) )
439 ri(k,i,j) = n2_new(k) / max(dudz2(k,i,j), 1e-10_rp)
446 q(k) = sqrt( max(prog(k,i,j,i_tke), atmos_phy_bl_mynn_tke_min)*2.0_rp )
454 dtldz(
ks) = ( potl(
ks+1,i,j) - potl(
ks,i,j) ) / ( cz(
ks+1,i,j) - cz(
ks,i,j) )
455 dqwdz(
ks) = ( qw(
ks+1,i,j) - qw(
ks,i,j) ) / ( cz(
ks+1,i,j) - cz(
ks,i,j) )
457 dtldz(k) = ( potl(k+1,i,j) - potl(k-1,i,j) ) / ( cz(k+1,i,j) - cz(k-1,i,j) )
458 dqwdz(k) = ( qw(k+1,i,j) - qw(k-1,i,j) ) / ( cz(k+1,i,j) - cz(k-1,i,j) )
466 pott(
ks,i,j), q(:), n2_new(:), &
467 sflx_pt, l_mo(i,j), &
471 call get_q2_level2( &
473 dudz2(:,i,j), ri(:,i,j), l(:,i,j), &
477 ac(k) = min( q(k) / sqrt(q2_2(k)), 1.0_rp )
483 l(:,i,j), n2_new(:), &
484 pott(:,i,j), dudz2(:,i,j), &
485 tvsq(:), tvsq25(:), &
493 teml(k) = potl(k,i,j) * exner(k,i,j)
496 call atmos_saturation_dens2qsat( &
498 teml(:), dens(:,i,j), &
501 call hydrometeor_lhv( &
508 dqsl = qsl(k) * lhvl(k) / ( rvap * teml(k)**2 )
509 cptot = qdry(k,i,j) * cpdry + qsl(k) * cpvap
510 aa = 1.0_rp / ( 1.0_rp + lhvl(k)/cptot * dqsl )
511 bb = exner(k,i,j) * dqsl
513 if ( mynn_level3 )
then 515 tsq(k) = max( prog(k,i,j,i_tsq), 0.0_rp )
516 qsq(k) = max( prog(k,i,j,i_qsq), 0.0_rp )
517 cov(k) = prog(k,i,j,i_cov)
518 cov(k) = sign( min( abs(cov(k)), sqrt(tsq(k) * qsq(k))), cov(k) )
519 sigma_s = 0.5_rp * aa * sqrt( max( qsq(k) - 2.0_rp * bb * cov(k) + bb**2 * tsq(k), 1.0e-20_rp ) )
522 sigma_s = max( 0.5_rp * aa * l(k,i,j) * sqrt( ac(k) * b2 * sh(k) ) * abs( dqwdz(k) - bb * dtldz(k) ), &
526 q1 = aa * ( qw(k,i,j) - qsl(k) ) * 0.5_rp / sigma_s
527 rr = min( max( 0.5_rp * ( 1.0_rp + erf(q1*rsqrt_2) ), 0.0_rp ), 1.0_rp )
528 qlp = min( max( 2.0_rp * sigma_s * ( rr * q1 + rsqrt_2pi &
529 #if defined(PGI) || defined(SX) 530 * exp( -min( 0.5_rp*q1**2, 1.e+3_rp ) ) &
532 * exp(-0.5_rp*q1**2) &
534 ), 0.0_rp ), qw(k,i,j) * 0.5_rp )
535 cc = ( 1.0_rp + epstvap * qw(k,i,j) - (1.0_rp+epstvap) * qlp ) / exner(k,i,j) * lhvl(k) / cptot &
536 - (1.0_rp+epstvap) * pott(k,i,j)
537 rt = min( max( rr - qlp / (2.0_rp*sigma_s*sqrt_2pi) &
538 #if defined(PGI) || defined(SX) 539 * exp( -min( 0.5_rp*q1**2, 1.e+3_rp ) ) &
541 * exp(-q1**2 * 0.5_rp) &
544 betat = 1.0_rp + epstvap * qw(k,i,j) - (1.0_rp+epstvap) * qlp - rt * aa * bb * cc
545 betaq = epstvap * pott(k,i,j) + rt * aa * cc
547 if ( mynn_level3 )
then 551 us = max(- l_mo(i,j) * karman * grav * sflx_pt / pott(
ks,i,j), 0.0_rp)**(1.0_rp/3.0_rp)
552 zeta = z1 / l_mo(i,j)
561 phi_h = - 2.0_rp / 3.0_rp * ( 0.35_rp * zeta - 6.0_rp ) * exp(-0.35_rp*zeta) + zeta * sqrt( 1.0_rp + 2.0_rp * zeta / 3.0_rp ) + 1.0_rp
563 phi_h = 1.0_rp / sqrt( 1.0_rp - 16.0_rp * zeta )
566 prod_t1 = 1.0_rp / us * phi_h / ( karman * z1 ) * sflx_pt**2
568 prod_q1 = 1.0_rp / us * phi_h / ( karman * z1 ) * ( sflx_qv(i,j) / dens(
ks,i,j) )**2
570 prod_c1 = 1.0_rp / us * phi_h * ( karman * z1 ) * sflx_pt * sflx_qv(i,j) / dens(
ks,i,j)
571 tsq25 = prod_t1 * b2 * l(k,i,j) / q(k) * 0.5_rp
572 qsq25 = prod_q1 * b2 * l(k,i,j) / q(k) * 0.5_rp
573 cov25 = prod_c1 * b2 * l(k,i,j) / q(k) * 0.5_rp
575 tsq25 = b2 * l(k,i,j)**2 * sh(k) * dtldz(k)**2
576 qsq25 = b2 * l(k,i,j)**2 * sh(k) * dqwdz(k)**2
577 cov25 = b2 * l(k,i,j)**2 * sh(k) * dtldz(k) * dqwdz(k)
579 tltv = betat * tsq25 + betaq * cov25
580 qwtv = betat * cov25 + betaq * qsq25
581 tvsq25(k) = max(betat * tltv + betaq * qwtv, 0.0_rp)
583 if ( tsq(k) == 0.0_rp )
then 589 tltv = betat * tsq(k) + betaq * cov(k)
590 qwtv = betat * cov(k) + betaq * qsq(k)
591 tvsq(k) = max(betat * tltv + betaq * qwtv, 0.0_rp)
594 n2_new(k) = min(atmos_phy_bl_mynn_n2_max, &
595 grav * ( dtldz(k) * betat + dqwdz(k) * betaq ) / potv(k,i,j) )
599 ri(k,i,j) = n2_new(k) / max(dudz2(k,i,j), 1e-10_rp)
610 pott(
ks,i,j), q(:), n2_new(:), &
611 sflx_pt, l_mo(i,j), &
615 call get_q2_level2( &
617 dudz2(:,i,j), ri(:,i,j), l(:,i,j), &
621 ac(k) = min( q(k) / sqrt(q2_2(k)), 1.0_rp )
627 l(:,i,j), n2_new(:), &
628 pott(:,i,j), dudz2(:,i,j), &
629 tvsq(:), tvsq25(:), &
635 nu(k,i,j) = max( min( l(k,i,j) * q(k) * sm(k), &
636 atmos_phy_bl_mynn_nu_max ), &
637 atmos_phy_bl_mynn_nu_min )
638 kh(k,i,j) = max( min( l(k,i,j) * q(k) * sh(k), &
639 atmos_phy_bl_mynn_kh_max ), &
640 atmos_phy_bl_mynn_kh_min )
641 pr(k,i,j) = nu(k,i,j) / kh(k,i,j)
651 rhonu(k) = f2h(k,1) * dens(k+1,i,j) * nu(k+1,i,j) &
652 + f2h(k,2) * dens(k ,i,j) * nu(k ,i,j)
653 rhokh(k) = f2h(k,1) * dens(k+1,i,j) * kh(k+1,i,j) &
654 + f2h(k,2) * dens(k ,i,j) * kh(k ,i,j)
662 sf_t = sflx_mu(i,j) / ( fz(
ks,i,j) - fz(
ks-1,i,j) )
663 d(
ks) = u(
ks,i,j) + dt * sf_t / dens(
ks,i,j)
669 ap = - dt * rhonu(k) / ( cz(k+1,i,j) - cz(k,i,j) )
670 a(k) = ap / ( dens(k,i,j) * ( fz(k,i,j) - fz(k-1,i,j) ) )
671 b(k) = - a(k) - c(k) + 1.0_rp
672 c(k+1) = ap / ( dens(k+1,i,j) * ( fz(k+1,i,j) - fz(k,i,j) ) )
675 b(ke_pbl) = - c(ke_pbl) + 1.0_rp
677 call matrix_solver_tridiagonal( &
679 a(:), b(:), c(:), d(:), &
684 rhou_t(
ks,i,j) = ( phi_n(
ks) - u(
ks,i,j) ) * dens(
ks,i,j) / dt - sf_t
686 rhou_t(k,i,j) = ( phi_n(k) - u(k,i,j) ) * dens(k,i,j) / dt
689 rhou_t(k,i,j) = 0.0_rp
692 flxu(k,i,j) = - rhonu(k) * ( phi_n(k+1) - phi_n(k) ) / ( cz(k+1,i,j) - cz(k,i,j) )
700 sf_t = sflx_mv(i,j) / ( fz(
ks,i,j) - fz(
ks-1,i,j) )
701 d(
ks) = v(
ks,i,j) + dt * sf_t / dens(
ks,i,j)
707 call matrix_solver_tridiagonal( &
709 a(:), b(:), c(:), d(:), &
712 rhov_t(
ks,i,j) = ( phi_n(
ks) - v(
ks,i,j) ) * dens(
ks,i,j) / dt - sf_t
714 rhov_t(k,i,j) = ( phi_n(k) - v(k,i,j) ) * dens(k,i,j) / dt
717 rhov_t(k,i,j) = 0.0_rp
720 flxv(k,i,j) = - rhonu(k) * ( phi_n(k+1) - phi_n(k) ) / ( cz(k+1,i,j) - cz(k,i,j) )
728 sf_t = sflx_pt / ( fz(
ks,i,j) - fz(
ks-1,i,j) )
729 d(
ks) = pott(
ks,i,j) + dt * sf_t
736 ap = - dt * rhokh(k) / ( cz(k+1,i,j) - cz(k,i,j) )
737 a(k) = ap / ( dens(k,i,j) * ( fz(k,i,j) - fz(k-1,i,j) ) )
738 b(k) = - a(k) - c(k) + 1.0_rp
739 c(k+1) = ap / ( dens(k+1,i,j) * ( fz(k+1,i,j) - fz(k,i,j) ) )
742 b(ke_pbl) = - c(ke_pbl) + 1.0_rp
744 call matrix_solver_tridiagonal( &
746 a(:), b(:), c(:), d(:), &
749 rhot_t(
ks,i,j) = ( ( phi_n(
ks) - pott(
ks,i,j) ) / dt - sf_t ) * dens(
ks,i,j)
751 rhot_t(k,i,j) = ( phi_n(k) - pott(k,i,j) ) * dens(k,i,j) / dt
754 rhot_t(k,i,j) = 0.0_rp
757 flxt(k,i,j) = - rhokh(k) * ( phi_n(k+1) - phi_n(k) ) / ( cz(k+1,i,j) - cz(k,i,j) )
766 us3 = - l_mo(i,j) * karman * grav * sflx_pt / pott(
ks,i,j)
767 zeta = z1 / l_mo(i,j)
776 phi_m = - 2.0_rp / 3.0_rp * ( 0.35_rp * zeta - 6.0_rp ) * zeta * exp(-0.35_rp*zeta) + zeta + 1.0_rp
778 phi_m = 1.0_rp / sqrt(sqrt(1.0_rp - 16.0_rp * zeta))
780 prod(
ks,i,j) = us3 / ( karman * z1 ) * ( phi_m - zeta )
783 prod(k,i,j) = nu(k,i,j) * dudz2(k,i,j) - kh(k,i,j) * n2_new(k)
786 tke_p = q(k)**2 * 0.5_rp
787 prod(k,i,j) = max( prod(k,i,j), - tke_p / dt)
788 d(k) = tke_p + dt * prod(k,i,j)
795 ap = - dt * 3.0_rp * rhonu(k) / ( cz(k+1,i,j) - cz(k,i,j) )
796 a(k) = ap / ( dens(k,i,j) * ( fz(k,i,j) - fz(k-1,i,j) ) )
797 diss(k,i,j) = 2.0_rp * q(k) / ( b1 * l(k,i,j) )
798 b(k) = - a(k) - c(k) + 1.0_rp + diss(k,i,j) * dt
799 c(k+1) = ap / ( dens(k+1,i,j) * ( fz(k+1,i,j) - fz(k,i,j) ) )
802 diss(ke_pbl,i,j) = 2.0_rp * q(ke_pbl) / ( b1 * l(ke_pbl,i,j) )
803 b(ke_pbl) = - c(ke_pbl) + 1.0_rp + diss(ke_pbl,i,j) * dt
808 call matrix_solver_tridiagonal( &
810 a(:), b(:), c(:), d(:), &
814 diss(k,i,j) = diss(k,i,j) * phi_n(k)
815 rprog_t(k,i,j,i_tke) = ( max(phi_n(k), atmos_phy_bl_mynn_tke_min) - prog(k,i,j,i_tke) ) * dens(k,i,j) / dt
818 rprog_t(k,i,j,i_tke) = 0.0_rp
823 if ( .not. mynn_level3 ) cycle
827 d(
ks) = max(tsq(
ks) + dt * prod_t1, 0.0_rp)
830 d(k) = max(tsq(k) + dt * 2.0_rp * l(k,i,j) * q(k) * sh(k) * dtldz(k)**2, 0.0_rp)
834 ap = - dt * rhonu(k) / ( cz(k+1,i,j) - cz(k,i,j) )
835 a(k) = ap / ( dens(k,i,j) * ( fz(k,i,j) - fz(k-1,i,j) ) )
836 b(k) = - a(k) - c(k) + 1.0_rp + dt * 2.0_rp * q(k) / ( b2 * l(k,i,j) )
837 c(k+1) = ap / ( dens(k+1,i,j) * ( fz(k+1,i,j) - fz(k,i,j) ) )
840 b(ke_pbl) = - c(ke_pbl) + 1.0_rp + dt * 2.0_rp * q(ke_pbl) / ( b2 * l(ke_pbl,i,j) )
842 call matrix_solver_tridiagonal( &
844 a(:), b(:), c(:), d(:), &
848 rprog_t(k,i,j,i_tsq) = ( max(tsq(k), 0.0_rp) - prog(k,i,j,i_tsq) ) * dens(k,i,j) / dt
851 rprog_t(k,i,j,i_tsq) = 0.0_rp
856 d(
ks) = max(qsq(
ks) + dt * prod_q1, 0.0_rp)
859 d(k) = max(qsq(k) + dt * 2.0_rp * l(k,i,j) * q(k) * sh(k) * dqwdz(k)**2, 0.0_rp)
863 call matrix_solver_tridiagonal( &
865 a(:), b(:), c(:), d(:), &
869 rprog_t(k,i,j,i_qsq) = ( max(qsq(k), 0.0_rp) - prog(k,i,j,i_qsq) ) * dens(k,i,j) / dt
872 rprog_t(k,i,j,i_qsq) = 0.0_rp
877 d(
ks) = cov(
ks) + dt * prod_c1
880 d(k) = cov(k) + dt * 2.0_rp * l(k,i,j) * q(k) * sh(k) * dtldz(k) * dqwdz(k)
884 call matrix_solver_tridiagonal( &
886 a(:), b(:), c(:), d(:), &
890 rprog_t(k,i,j,i_cov) = ( cov(k) - prog(k,i,j,i_cov) ) * dens(k,i,j) / dt
893 rprog_t(k,i,j,i_cov) = 0.0_rp
901 l(ke_pbl+1:
ke,:,:) = 0.0_rp
902 call file_history_in(ri(:,:,:),
'Ri_MYNN',
'Richardson number',
'1', fill_halo=.true. )
903 call file_history_in(pr(:,:,:),
'Pr_MYNN',
'Prandtl number',
'1', fill_halo=.true. )
904 call file_history_in(prod(:,:,:),
'TKE_prod_MYNN',
'TKE production',
'm2/s3', fill_halo=.true.)
905 call file_history_in(diss(:,:,:),
'TKE_diss_MYNN',
'TKE dissipation',
'm2/s3', fill_halo=.true.)
906 call file_history_in(dudz2(:,:,:),
'dUdZ2_MYNN',
'dudz2',
'm2/s2', fill_halo=.true.)
907 call file_history_in(l(:,:,:),
'L_mix_MYNN',
'minxing length',
'm', fill_halo=.true.)
909 call file_history_in(flxu(:,:,:),
'ZFLX_RHOU_MYNN',
'Z FLUX of RHOU (MYNN)',
'kg/m/s2', fill_halo=.true.)
910 call file_history_in(flxv(:,:,:),
'ZFLX_RHOV_MYNN',
'Z FLUX of RHOV (MYNN)',
'kg/m/s2', fill_halo=.true.)
911 call file_history_in(flxt(:,:,:),
'ZFLX_RHOT_MYNN',
'Z FLUX of RHOT (MYNN)',
'K kg/m2/s', fill_halo=.true.)
914 end subroutine atmos_phy_bl_mynn_tendency
920 subroutine atmos_phy_bl_mynn_tendency_tracer( &
921 KA, KS, KE, IA, IS, IE, JA, JS, JE, &
922 DENS, QTRC, SFLX_Q, Kh, &
923 CZ, FZ, DT, TRACER_NAME, &
926 matrix_solver_tridiagonal
929 integer,
intent(in) ::
ka,
ks,
ke 930 integer,
intent(in) ::
ia,
is,
ie 931 integer,
intent(in) ::
ja,
js,
je 933 real(RP),
intent(in) :: dens (
ka,
ia,
ja)
934 real(RP),
intent(in) :: qtrc (
ka,
ia,
ja)
935 real(RP),
intent(in) :: sflx_q(
ia,
ja)
936 real(RP),
intent(in) :: kh (
ka,
ia,
ja)
937 real(RP),
intent(in) :: cz (
ka,
ia,
ja)
938 real(RP),
intent(in) :: fz (0:
ka,
ia,
ja)
939 real(DP),
intent(in) :: dt
942 real(RP),
intent(out) :: rhoq_t(
ka,
ia,
ja)
944 real(RP) :: qtrc_n(
ka)
945 real(RP) :: rhokh(
ka)
955 real(RP) :: f2h(
ka,2)
975 rhokh(k) = f2h(k,1) * dens(k+1,i,j) * kh(k+1,i,j) &
976 + f2h(k,2) * dens(k ,i,j) * kh(k ,i,j)
979 sf_t = sflx_q(i,j) / ( fz(
ks,i,j) - fz(
ks-1,i,j) )
980 d(
ks) = qtrc(
ks,i,j) + dt * sf_t / dens(
ks,i,j)
987 ap = - dt * rhokh(k) / ( cz(k+1,i,j) - cz(k,i,j) )
988 a(k) = ap / ( dens(k,i,j) * ( fz(k,i,j) - fz(k-1,i,j) ) )
989 b(k) = - a(k) - c(k) + 1.0_rp
990 c(k+1) = ap / ( dens(k+1,i,j) * ( fz(k+1,i,j) - fz(k,i,j) ) )
993 b(ke_pbl) = - c(ke_pbl) + 1.0_rp
995 call matrix_solver_tridiagonal( &
997 a(:), b(:), c(:), d(:), &
1000 rhoq_t(
ks,i,j) = ( qtrc_n(
ks) - qtrc(
ks,i,j) ) * dens(
ks,i,j) / dt - sf_t
1002 rhoq_t(k,i,j) = ( qtrc_n(k) - qtrc(k,i,j) ) * dens(k,i,j) / dt
1005 rhoq_t(k,i,j) = 0.0_rp
1009 flx(k,i,j) = - rhokh(k) * ( qtrc_n(k+1) - qtrc_n(k) ) / ( cz(k+1,i,j) - cz(k,i,j) )
1018 call file_history_in(flx(:,:,:),
'ZFLX_'//trim(
tracer_name)//
'_MYNN',
'Z FLUX of DENS * '//trim(
tracer_name)//
' (MYNN)',
'kg/m2/s', fill_halo=.true.)
1021 end subroutine atmos_phy_bl_mynn_tendency_tracer
1028 subroutine get_length( &
1040 integer,
intent(in) ::
ka,
ks, ke_pbl
1042 real(RP),
intent(in) :: pt0
1043 real(RP),
intent(in) :: q(
ka)
1044 real(RP),
intent(in) :: n2(
ka)
1045 real(RP),
intent(in) :: sflx_pt
1046 real(RP),
intent(in) :: l_mo
1047 real(RP),
intent(in) :: fz(0:
ka)
1049 real(RP),
intent(out) :: l(
ka)
1072 qdz = q(k) * ( fz(k) - fz(k-1) )
1073 int_qz = int_qz + ((fz(k)+fz(k-1))*0.5_rp-fz(
ks-1)) * qdz
1077 lt = min( max(0.23_rp * int_qz / (int_q + eps), &
1079 atmos_phy_bl_mynn_lt_max )
1084 qc = ( grav / pt0 * max(sflx_pt,0.0_rp) * lt )**oneoverthree
1087 z = ( fz(k)+fz(k-1) )*0.5_rp - fz(
ks-1)
1091 sw = sign(0.5_rp, zeta) + 0.5_rp
1093 * ( sw / (1.0_rp + 2.7_rp*min(zeta,1.0_rp)*sw ) &
1094 + ( (1.0_rp - 100.0_rp*zeta)*(1.0_rp-sw) )**0.2_rp )
1097 sw = sign(0.5_rp, n2(k)-eps) + 0.5_rp
1098 rn2sr = 1.0_rp / ( sqrt(n2(k)*sw) + 1.0_rp-sw)
1099 lb = (1.0_rp + 5.0_rp * sqrt(qc*rn2sr/lt)) * q(k) * rn2sr * sw &
1100 + 999.e10_rp * (1.0_rp-sw)
1103 l(k) = 1.0_rp / ( 1.0_rp/ls + rlt + 1.0_rp/lb )
1107 end subroutine get_length
1110 subroutine get_q2_level2( &
1115 integer,
intent(in) ::
ka,
ks, ke_pbl
1117 real(RP),
intent(in) :: dudz2(
ka)
1118 real(RP),
intent(in) :: ri(
ka)
1119 real(RP),
intent(in) :: l(
ka)
1121 real(RP),
intent(out) :: q2_2(
ka)
1131 rf = min(0.5_rp / af12 * ( ri(k) &
1133 - sqrt(ri(k)**2 + 2.0_rp*af12*(rf1-2.0_rp*rf2)*ri(k) + (af12*rf1)**2) ), &
1135 sh_2 = 3.0_rp * a2 * (g1+g2) * (rfc-rf) / (1.0_rp-rf)
1136 sm_2 = sh_2 * af12 * (rf1-rf) / (rf2-rf)
1137 q2 = b1 * l(k)**2 * sm_2 * (1.0_rp-rf) * dudz2(k)
1138 q2_2(k) = max( q2, 1.e-10_rp )
1142 end subroutine get_q2_level2
1145 subroutine get_smsh( &
1157 integer,
intent(in) ::
ka,
ks, ke_pbl
1159 real(RP),
intent(in) :: q(
ka)
1160 real(RP),
intent(in) :: ac(
ka)
1161 real(RP),
intent(in) :: l(
ka)
1162 real(RP),
intent(in) :: n2(
ka)
1163 real(RP),
intent(in) :: pott(
ka)
1164 real(RP),
intent(in) :: dudz2(
ka)
1165 real(RP),
intent(in) :: tvsq(
ka)
1166 real(RP),
intent(in) :: tvsq25(
ka)
1167 logical,
intent(in) :: mynn_level3
1169 real(RP),
intent(out) :: sm (
ka)
1170 real(RP),
intent(out) :: sh (
ka)
1197 l2q2 = ( l(k) / max(q(k),eps) )**2
1201 p1 = 1.0_rp - 3.0_rp * ac2 * a2 * b2 * ( 1.0_rp - c3 ) * gh
1202 p2 = 1.0_rp - 9.0_rp * ac2 * a1 * a2 * ( 1.0_rp - c2 ) * gh
1203 p3 = p1 + 9.0_rp * ac2 * a2**2 * ( 1.0_rp - c2 ) * ( 1.0_rp - c5 ) * gh
1204 p4 = p1 - 12.0_rp * ac2 * a1 * a2 * ( 1.0_rp - c2 ) * gh
1205 p5 = 6.0_rp * ac2 * a1**2 * dudz2(k) * l2q2
1207 rd25 = 1.0_rp / max( p2 * p4 + p5 * p3, eps )
1209 sm(k) = max( ac(k) * a1 * ( p3 - 3.0_rp * c1 * p4 ) * rd25, 0.0_rp )
1210 sh(k) = max( ac(k) * a2 * ( p2 + 3.0_rp * c1 * p5 ) * rd25, 0.0_rp )
1215 if ( mynn_level3 )
then 1220 l2q2 = ( l(k) / max(q(k),eps) )**2
1222 if ( n2(k) > 0 ) l2q2 = min( l2q2, 1.0_rp/n2(k) )
1226 if ( abs(gh) < eps ) gh = eps
1228 p1 = 1.0_rp - 3.0_rp * ac2 * a2 * b2 * ( 1.0_rp - c3 ) * gh
1229 p2 = 1.0_rp - 9.0_rp * ac2 * a1 * a2 * ( 1.0_rp - c2 ) * gh
1230 p3 = p1 + 9.0_rp * ac2 * a2**2 * ( 1.0_rp - c2 ) * ( 1.0_rp - c5 ) * gh
1231 p4 = p1 - 12.0_rp * ac2 * a1 * a2 * ( 1.0_rp - c2 ) * gh
1232 p5 = 6.0_rp * ac2 * a1**2 * dudz2(k) * l2q2
1234 rd25 = 1.0_rp / max( p2 * p4 + p5 * p3, eps )
1235 rdp = 1.0_rp / max( p2 * ( p4 - p1 + 1.0_rp ) + p5 * ( p3 - p1 + 1.0_rp ), eps )
1237 cw25 = p1 * ( p2 + 3.0_rp * c1 * p5 ) * rd25 / 3.0_rp
1239 ew = ( 1.0_rp - c3 ) * ( p2 * ( p1 - p4 ) + p5 * ( p1 - p3 ) ) * rdp
1240 ew = sign( max(abs(ew),eps), ew )
1241 fact = ( l2q2 * grav / ( l(k) * pott(k) ) )**2 * ( tvsq(k) - tvsq25(k) ) / gh
1243 fact = min( max( fact, 0.12_rp - cw25 ), 0.76_rp - cw25 )
1246 em = 3.0_rp * ac(k) * a1 * ( 1.0_rp - c3 ) * ( p3 - p4 ) * rdp
1247 eh = 3.0_rp * ac(k) * a2 * ( 1.0_rp - c3 ) * ( p2 + p5 ) * rdp
1250 sm(k) = sm(k) + em * fact
1251 sh(k) = sh(k) + eh * fact
1258 end subroutine get_smsh
1261 subroutine get_f2h( &
1265 integer,
intent(in) ::
ka,
ks,
ke 1266 real(RP),
intent(in) :: fz(0:
ka)
1267 real(RP),
intent(out) :: f2h(
ka,2)
1269 real(RP) :: dz1, dz2
1273 dz1 = fz(k+1) - fz(k )
1274 dz2 = fz(k) - fz(k-1)
1275 f2h(k,1) = dz2 / ( dz1 + dz2 )
1276 f2h(k,2) = dz1 / ( dz1 + dz2 )
1280 end subroutine get_f2h
real(rp), public const_cpdry
specific heat (dry air,constant pressure) [J/kg/K]
module atmosphere / saturation
integer, public ia
of whole cells: x, local, with HALO
integer, public ja
of whole cells: y, local, with HALO
integer, public io_fid_conf
Config file ID.
subroutine, public check(current_line, v)
Undefined value checker.
real(rp), parameter, public const_karman
von Karman constant
character(len=h_short), dimension(qa_max), public tracer_name
real(rp), public const_rdry
specific gas constant (dry air) [J/kg/K]
real(rp), public const_undef
integer, public is
start point of inner domain: x, local
integer, public ie
end point of inner domain: x, local
module atmosphere / hydrometeor
integer, public ke
end point of inner domain: z, local
integer, public je
end point of inner domain: y, local
real(rp), public const_grav
standard acceleration of gravity [m/s2]
integer, parameter, public const_undef2
undefined value (INT2)
integer, public ks
start point of inner domain: z, local
real(rp), public const_epstvap
1 / epsilon - 1
real(rp), parameter, public const_rvap
specific gas constant (water vapor) [J/kg/K]
subroutine, public prc_abort
Abort Process.
real(rp), public lhv
latent heat of vaporization for use [J/kg]
integer, public js
start point of inner domain: y, local
real(rp), public const_eps
small number
integer, public ka
of whole cells: z, local, with HALO
real(rp), public const_pi
pi
real(rp), parameter, public const_cpvap
specific heat (water vapor, constant pressure) [J/kg/K]
integer, parameter, public rp