20 #include "inc_openmp.h" 32 #include "macro_thermodyn.h" 34 #if defined DEBUG || defined QUICKDEBUG 64 real(RP),
private,
parameter :: OneOverThree = 1.0_rp / 3.0_rp
65 real(RP),
private,
parameter :: TKE_min = 1.e-10_rp
66 real(RP),
private,
parameter :: LT_min = 1.e-6_rp
67 real(RP),
private,
parameter :: Us_min = 1.e-6_rp
69 real(RP),
private :: A1
70 real(RP),
private :: A2
71 real(RP),
private,
parameter :: B1 = 24.0_rp
72 real(RP),
private,
parameter :: B2 = 15.0_rp
73 real(RP),
private :: C1
74 real(RP),
private,
parameter :: C2 = 0.75_rp
75 real(RP),
private,
parameter :: C3 = 0.352_rp
76 real(RP),
private,
parameter :: C5 = 0.2_rp
77 real(RP),
private,
parameter :: G1 = 0.235_rp
78 real(RP),
private :: G2
79 real(RP),
private :: F1
80 real(RP),
private :: F2
81 real(RP),
private :: Rf1
82 real(RP),
private :: Rf2
83 real(RP),
private :: Rfc
84 real(RP),
private :: AF12
85 real(RP),
private,
parameter :: PrN = 0.74_rp
87 real(RP),
private :: SQRT_2PI
88 real(RP),
private :: RSQRT_2PI
89 real(RP),
private :: RSQRT_2
91 integer,
private :: I_TKE
93 integer,
private :: KE_PBL
94 logical,
private :: ATMOS_PHY_TB_MYNN_TKE_INIT = .false.
95 real(RP),
private :: ATMOS_PHY_TB_MYNN_N2_MAX = 1.e+3_rp
96 real(RP),
private :: ATMOS_PHY_TB_MYNN_NU_MIN = 1.e-6_rp
97 real(RP),
private :: ATMOS_PHY_TB_MYNN_NU_MAX = 10000.0_rp
98 real(RP),
private :: ATMOS_PHY_TB_MYNN_KH_MIN = 1.e-6_rp
99 real(RP),
private :: ATMOS_PHY_TB_MYNN_KH_MAX = 10000.0_rp
100 real(RP),
private :: ATMOS_PHY_TB_MYNN_Lt_MAX = 700.0_rp
115 character(len=*),
intent(in) :: type_tb
116 integer,
intent(out) :: i_tke_out
120 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[Turbulence Tracer] / Categ[ATMOS PHYSICS] / Origin[SCALElib]' 121 if(
io_l )
write(
io_fid_log,*)
'*** Tracers for Mellor-Yamada Nakanishi-Niino scheme' 123 if ( type_tb /=
'MYNN' )
then 124 write(*,*)
'xxx ATMOS_PHY_TB_TYPE is not MYNN. Check!' 131 (/
'turbulent kinetic energy (MYNN)' /), &
149 real(RP),
intent(in) :: cdz(
ka)
150 real(RP),
intent(in) :: cdx(
ia)
151 real(RP),
intent(in) :: cdy(
ja)
152 real(RP),
intent(in) :: cz (
ka,
ia,
ja)
154 real(RP) :: atmos_phy_tb_mynn_pbl_max = 1.e+10_rp
156 namelist / param_atmos_phy_tb_mynn / &
157 atmos_phy_tb_mynn_tke_init, &
158 atmos_phy_tb_mynn_pbl_max, &
159 atmos_phy_tb_mynn_n2_max, &
160 atmos_phy_tb_mynn_nu_min, &
161 atmos_phy_tb_mynn_nu_max, &
162 atmos_phy_tb_mynn_kh_min, &
163 atmos_phy_tb_mynn_kh_max, &
164 atmos_phy_tb_mynn_lt_max
171 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[Turbulence] / Categ[ATMOS PHYSICS] / Origin[SCALElib]' 172 if(
io_l )
write(
io_fid_log,*)
'*** Mellor-Yamada Nakanishi-Niino scheme' 176 read(
io_fid_conf,nml=param_atmos_phy_tb_mynn,iostat=ierr)
178 if(
io_l )
write(
io_fid_log,*)
'*** Not found namelist. Default used.' 179 elseif( ierr > 0 )
then 180 write(*,*)
'xxx Not appropriate names in namelist PARAM_ATMOS_PHY_TB_MYNN. Check!' 188 if ( atmos_phy_tb_mynn_pbl_max >= cz(k,i,j) )
then 195 a1 = b1 * (1.0_rp - 3.0_rp * g1) / 6.0_rp
196 a2 = 1.0_rp / (3.0_rp * g1 * b1**(1.0_rp/3.0_rp) * prn )
197 c1 = g1 - 1.0_rp / ( 3.0_rp * a1 * b1**(1.0_rp/3.0_rp) )
198 g2 = ( 2.0_rp * a1 * (3.0_rp - 2.0_rp * c2) + b2 * (1.0_rp - c3) ) / b1
199 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)
200 f2 = b1 * (g1 + g2) - 3.0_rp * a1 * (1.0_rp - c2)
202 rf1 = b1 * (g1 - c1) / f1
206 af12 = a1 * f1 / ( a2 * f2 )
208 sqrt_2pi = sqrt( 2.0_rp * pi )
209 rsqrt_2pi = 1.0_rp / sqrt_2pi
210 rsqrt_2 = 1.0_rp / sqrt( 2.0_rp )
217 qflx_sgs_momz, qflx_sgs_momx, qflx_sgs_momy, &
218 qflx_sgs_rhot, qflx_sgs_rhoq, &
221 MOMZ, MOMX, MOMY, RHOT, DENS, QTRC, N2_in, &
222 SFLX_MW, SFLX_MU, SFLX_MV, SFLX_SH, SFLX_Q, &
223 GSQRT, J13G, J23G, J33G, MAPF, dt )
251 atmos_thermodyn_temp_pres
253 hydrometeor_lhv => atmos_hydrometeor_lhv, &
254 hydrometeor_lhs => atmos_hydrometeor_lhs, &
259 atmos_saturation_dens2qsat => atmos_saturation_dens2qsat_all
266 real(RP),
intent(out) :: qflx_sgs_momz(
ka,
ia,
ja,3)
267 real(RP),
intent(out) :: qflx_sgs_momx(
ka,
ia,
ja,3)
268 real(RP),
intent(out) :: qflx_sgs_momy(
ka,
ia,
ja,3)
269 real(RP),
intent(out) :: qflx_sgs_rhot(
ka,
ia,
ja,3)
270 real(RP),
intent(out) :: qflx_sgs_rhoq(
ka,
ia,
ja,3,
qa)
272 real(RP),
intent(inout) :: rhoq_t (
ka,
ia,
ja,
qa)
274 real(RP),
intent(out) :: nu (
ka,
ia,
ja)
275 real(RP),
intent(out) :: ri (
ka,
ia,
ja)
276 real(RP),
intent(out) :: pr (
ka,
ia,
ja)
278 real(RP),
intent(in) :: momz (
ka,
ia,
ja)
279 real(RP),
intent(in) :: momx (
ka,
ia,
ja)
280 real(RP),
intent(in) :: momy (
ka,
ia,
ja)
281 real(RP),
intent(in) :: rhot (
ka,
ia,
ja)
282 real(RP),
intent(in) :: dens (
ka,
ia,
ja)
283 real(RP),
intent(in) :: qtrc (
ka,
ia,
ja,
qa)
284 real(RP),
intent(in) :: n2_in (
ka,
ia,
ja)
286 real(RP),
intent(in) :: sflx_mw (
ia,
ja)
287 real(RP),
intent(in) :: sflx_mu (
ia,
ja)
288 real(RP),
intent(in) :: sflx_mv (
ia,
ja)
289 real(RP),
intent(in) :: sflx_sh (
ia,
ja)
290 real(RP),
intent(in) :: sflx_q (
ia,
ja,
qa)
292 real(RP),
intent(in) :: gsqrt (
ka,
ia,
ja,7)
293 real(RP),
intent(in) :: j13g (
ka,
ia,
ja,7)
294 real(RP),
intent(in) :: j23g (
ka,
ia,
ja,7)
295 real(RP),
intent(in) :: j33g
296 real(RP),
intent(in) :: mapf (
ia,
ja,2,4)
297 real(DP),
intent(in) :: dt
302 real(RP) :: phin (
ka,
ia,
ja)
308 real(RP) :: dudz2(
ka,
ia,
ja)
309 real(RP) :: q2_2 (
ka,
ia,
ja)
311 real(RP) :: rhokh(
ka,
ia,
ja)
313 real(RP) :: sflx_pt(
ia,
ja)
320 real(RP) :: tke_n(
ka,
ia,
ja)
323 real(RP) :: pott(
ka,
ia,
ja)
324 real(RP) :: potv(
ka,
ia,
ja)
325 real(RP) :: potl(
ka,
ia,
ja)
326 real(RP) :: teml(
ka,
ia,
ja)
329 real(RP) :: qdry(
ka,
ia,
ja)
334 real(RP) :: temp(
ka,
ia,
ja)
335 real(RP) :: pres(
ka,
ia,
ja)
337 real(RP) :: lhv (
ka,
ia,
ja)
338 real(RP) :: lhs (
ka,
ia,
ja)
364 integer :: k, i, j, iq
367 if(
io_l )
write(
io_fid_log, *)
"*** Atmos physics step: Turbulence (MYNN)" 375 #if defined DEBUG || defined QUICKDEBUG 376 qflx_sgs_momz(
ks:
ke, 1:
is-1, : ,:) = undef
377 qflx_sgs_momz(
ks:
ke,
ie+1:
ia , : ,:) = undef
378 qflx_sgs_momz(
ks:
ke, : , 1:
js-1,:) = undef
379 qflx_sgs_momz(
ks:
ke, : ,
je+1:
ja ,:) = undef
380 qflx_sgs_momx(
ks:
ke, 1:
is-1, : ,:) = undef
381 qflx_sgs_momx(
ks:
ke,
ie+1:
ia , : ,:) = undef
382 qflx_sgs_momx(
ks:
ke, : , 1:
js-1,:) = undef
383 qflx_sgs_momx(
ks:
ke, : ,
je+1:
ja ,:) = undef
384 qflx_sgs_momy(
ks:
ke, 1:
is-1, : ,:) = undef
385 qflx_sgs_momy(
ks:
ke,
ie+1:
ia , : ,:) = undef
386 qflx_sgs_momy(
ks:
ke, : , 1:
js-1,:) = undef
387 qflx_sgs_momy(
ks:
ke, : ,
je+1:
ja ,:) = undef
394 qflx_sgs_momz(k,i,j,
xdir) = 0.0_rp
402 qflx_sgs_momx(k,i,j,
xdir) = 0.0_rp
411 qflx_sgs_momy(k,i,j,
xdir) = 0.0_rp
419 qflx_sgs_rhot(k,i,j,
xdir) = 0.0_rp
428 qflx_sgs_rhoq(k,i,j,
xdir,iq) = 0.0_rp
438 qflx_sgs_momz(k,i,j,
ydir) = 0.0_rp
446 qflx_sgs_momx(k,i,j,
ydir) = 0.0_rp
454 qflx_sgs_momy(k,i,j,
ydir) = 0.0_rp
462 qflx_sgs_rhot(k,i,j,
ydir) = 0.0_rp
471 qflx_sgs_rhoq(k,i,j,
ydir,iq) = 0.0_rp
480 qflx_sgs_momz(k,i,j,
zdir) = 0.0_rp
496 u(k,i,j) = 0.5_rp * ( momx(k,i,j) + momx(k,i-1,j) ) / dens(k,i,j)
505 v(k,i,j) = 0.5_rp * ( momy(k,i,j) + momy(k,i,j-1) ) / dens(k,i,j)
513 call atmos_thermodyn_temp_pres( temp, pres, &
518 call hydrometeor_lhv( lhv(:,:,:), temp(:,:,:) )
519 call hydrometeor_lhs( lhs(:,:,:), temp(:,:,:) )
535 if (
i_qv > 0 ) qv = qtrc(k,i,j,
i_qv)
538 if (
i_qc > 0 ) ql = qtrc(k,i,j,
i_qc)
543 if (
i_qi > 0 ) qs = qtrc(k,i,j,
i_qi)
547 calc_qdry(qdry(k,i,j), qtrc,
tracer_mass, k, i, j, iq)
549 qw(k,i,j) = qv + ql + qs
551 cptot = cpdry * qdry(k,i,j) + cpvap * qv
553 pott(k,i,j) = rhot(k,i,j) / dens(k,i,j)
555 potl(k,i,j) = pott(k,i,j) * (1.0_rp - 1.0_rp * (lhv(k,i,j) * ql + lhs(k,i,j) * qs) / ( temp(k,i,j) * cptot ) )
556 teml(k,i,j) = potl(k,i,j) * temp(k,i,j) / pott(k,i,j)
560 potv(k,i,j) = ( qdry(k,i,j) + (epstvap+1.0_rp) * qv ) * pott(k,i,j)
564 sflx_pt(i,j) = sflx_sh(i,j) / ( cpdry * dens(
ks,i,j) ) &
565 * pott(
ks,i,j) / temp(
ks,i,j)
568 n2(k,i,j) = min( atmos_phy_tb_mynn_n2_max, n2_in(k,i,j) )
571 dudz2(
ks,i,j) = ( ( u(
ks+1,i,j) - u(
ks,i,j) )**2 + ( v(
ks+1,i,j) - v(
ks,i,j) )**2 ) &
572 / ( cz(
ks+1,i,j) - cz(
ks,i,j) )**2
574 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 ) &
575 / ( cz(k+1,i,j) - cz(k-1,i,j) )**2
579 ri(k,i,j) = n2(k,i,j) / max(dudz2(k,i,j), 1e-10_rp)
585 if ( atmos_phy_tb_mynn_tke_init )
then 590 q(k,i,j) = sqrt( tke_min*2.0_rp )
599 q(k,i,j) = sqrt( max(qtrc(k,i,j,i_tke), tke_min)*2.0_rp )
610 sflx_mu, sflx_mv, sflx_pt, &
617 if ( atmos_phy_tb_mynn_tke_init )
then 622 tke = max(q2_2(k,i,j) * 0.5_rp, tke_min)
623 q(k,i,j) = sqrt( tke * 2.0_rp )
628 atmos_phy_tb_mynn_tke_init = .false.
631 call get_smsh( sm, sh, &
635 #if defined DEBUG || defined QUICKDEBUG 639 teml(k,i,j) = 300.0_rp
646 teml(k,i,j) = 300.0_rp
653 teml(k,i,j) = 300.0_rp
658 teml(k,i,j) = 300.0_rp
674 call atmos_saturation_dens2qsat( qsl(:), &
675 teml(:,i,j), dens(:,i,j) )
677 call hydrometeor_lhv( lhvl(:), teml(:,i,j) )
681 dqsl = ( qsl(k) * lhvl(k) / ( rvap * teml(k,i,j) ) - qsl(k) ) / teml(k,i,j)
682 cptot = qdry(k,i,j) * cpdry + qsl(k) * cpvap
683 aa = 1.0_rp / ( 1.0_rp + lhvl(k)/cptot * dqsl )
684 bb = temp(k,i,j) / pott(k,i,j) * dqsl
685 ac = min( q(k,i,j)/sqrt(q2_2(k,i,j)), 1.0_rp )
686 sigma_s = max( sqrt( 0.25_rp * aa**2 * l(k,i,j)**2 * ac * b2 * sh(k,i,j) ) &
687 * abs( qw(k+1,i,j) - qw(k-1,i,j) - bb * ( potl(k+1,i,j)-potl(k-1,i,j) ) ) &
688 / ( cz(k+1,i,j) - cz(k-1,i,j) ), &
690 q1 = aa * ( qw(k,i,j) - qsl(k) ) * 0.5_rp / sigma_s
691 rr = min( max( 0.5_rp * ( 1.0_rp + erf(q1*rsqrt_2) ), 0.0_rp ), 1.0_rp )
692 #if defined(PGI) || defined(SX) 693 ql = min( max( 2.0_rp * sigma_s * ( rr * q1 + rsqrt_2pi * exp( -min( 0.5_rp*q1**2, 1.e+3_rp ) ) ), &
695 ql = min( max( 2.0_rp * sigma_s * ( rr * q1 + rsqrt_2pi * exp(-0.5_rp*q1**2) ), &
699 cc = ( 1.0_rp + epstvap * qw(k,i,j) - (1.0_rp+epstvap) * ql ) * pott(k,i,j)/temp(k,i,j) * lhvl(k) / cptot &
700 - (1.0_rp+epstvap) * pott(k,i,j)
701 #if defined(PGI) || defined(SX) 702 rt = min( max( rr - ql / (2.0_rp*sigma_s*sqrt_2pi) * exp( -min( 0.5_rp*q1**2, 1.e+3_rp ) ), 0.0_rp ), 1.0_rp )
704 rt = min( max( rr - ql / (2.0_rp*sigma_s*sqrt_2pi) * exp(-q1**2 * 0.5_rp), 0.0_rp ), 1.0_rp )
706 betat = 1.0_rp + epstvap * qw(k,i,j) - (1.0_rp+epstvap) * ql - rt * aa * bb * cc
707 betaq = epstvap * pott(k,i,j) + rt * aa * cc
708 n2(k,i,j) = min(atmos_phy_tb_mynn_n2_max, &
709 grav * ( ( potl(k+1,i,j) - potl(k-1,i,j) ) * betat &
710 + ( qw(k+1,i,j) - qw(k-1,i,j) ) * betaq ) &
711 / ( cz(k+1,i,j) - cz(k-1,i,j) ) / potv(k,i,j) )
713 n2(
ks,i,j) = n2(
ks+1,i,j)
716 ri(k,i,j) = n2(k,i,j) / max(dudz2(k,i,j), 1e-10_rp)
731 sflx_mu, sflx_mv, sflx_pt, &
753 nu(k,i,j) = max( min( l(k,i,j) * q(k,i,j) * sm(k,i,j), &
754 atmos_phy_tb_mynn_nu_max ), &
755 atmos_phy_tb_mynn_nu_min )
762 kh = max( min( l(k,i,j) * q(k,i,j) * sh(k,i,j), &
763 atmos_phy_tb_mynn_kh_max ), &
764 atmos_phy_tb_mynn_kh_min )
765 rhokh(k,i,j) = dens(k,i,j) * kh
766 pr(k,i,j) = nu(k,i,j) / kh
774 call comm_vars( nu, 1 )
787 ap = - dt * 0.5_rp * ( dens(
ks ,i,j)*nu(
ks ,i,j) &
788 + dens(
ks+1,i,j)*nu(
ks+1,i,j) ) &
790 a(
ks,i,j) = ap * rcdz(
ks) / ( dens(
ks,i,j) * gsqrt(
ks,i,j,
i_xyz) )
792 b(
ks,i,j) = - a(
ks,i,j) + 1.0_rp
793 do k =
ks+1, ke_pbl-1
794 c(k,i,j) = ap * rcdz(k) / ( dens(k,i,j) * gsqrt(k,i,j,
i_xyz) )
795 ap = - dt * 0.5_rp * ( dens(k ,i,j)*nu(k ,i,j) &
796 + dens(k+1,i,j)*nu(k+1,i,j) ) &
797 * rfdz(k) / gsqrt(k,i,j,
i_xyw)
798 a(k,i,j) = ap * rcdz(k) / ( dens(k,i,j) * gsqrt(k,i,j,
i_xyz) )
799 b(k,i,j) = - a(k,i,j) - c(k,i,j) + 1.0_rp
801 a(ke_pbl,i,j) = 0.0_rp
802 c(ke_pbl,i,j) = ap * rcdz(ke_pbl) / ( dens(ke_pbl,i,j) * gsqrt(ke_pbl,i,j,
i_xyz) )
803 b(ke_pbl,i,j) = - c(ke_pbl,i,j) + 1.0_rp
805 d(
ks,i,j) = u(
ks,i,j) + dt * sflx_mu(i,j) * rcdz(
ks) / ( dens(
ks,i,j) * gsqrt(
ks,i,j,
i_xyz) )
809 call diffusion_solver( &
811 a(:,i,j), b(:,i,j), c(:,i,j), d(:,i,j), &
816 call comm_vars( phin, 2 )
817 call comm_wait( nu, 1 )
818 call comm_wait( phin, 2 )
829 qflx_sgs_momx(k,i,j,
zdir) = - 0.03125_rp &
830 * ( dens(k,i,j) + dens(k+1,i,j) + dens(k,i+1,j) + dens(k+1,i+1,j) ) &
831 * ( nu(k,i,j) + nu(k+1,i,j) + nu(k,i+1,j) + nu(k+1,i+1,j) ) &
832 * ( (phin(k+1,i,j)+phin(k+1,i+1,j)) - (phin(k,i,j)+phin(k,i+1,j)) ) &
833 * j33g * rfdz(k) / gsqrt(k,i,j,
i_uyw)
839 qflx_sgs_momx(
ks-1,i,j,
zdir) = 0.0_rp
845 qflx_sgs_momx(k,i,j,
zdir) = 0.0_rp
858 d(
ks,i,j) = v(
ks,i,j) + dt * sflx_mv(i,j) * rcdz(
ks) / ( dens(
ks,i,j) * gsqrt(
ks,i,j,
i_xyz) )
862 call diffusion_solver( &
864 a(:,i,j), b(:,i,j), c(:,i,j), d(:,i,j), &
872 call comm_vars( phin, 1 )
873 call comm_wait( phin, 1 )
882 qflx_sgs_momy(
ks-1,i,j,
zdir) = 0.0_rp
884 qflx_sgs_momy(k,i,j,
zdir) = - 0.03125_rp &
885 * ( dens(k,i,j) + dens(k+1,i,j) + dens(k,i,j+1) + dens(k+1,i,j+1) ) &
886 * ( nu(k,i,j) + nu(k+1,i,j) + nu(k,i,j+1) + nu(k+1,i,j+1) ) &
887 * ( (phin(k+1,i,j)+phin(k+1,i,j+1)) - (phin(k,i,j)+phin(k,i,j+1)) ) &
888 * j33g * rfdz(k) / gsqrt(k,i,j,
i_xvw)
891 qflx_sgs_momy(k,i,j,
zdir) = 0.0_rp
902 ap = - dt * 0.5_rp * ( rhokh(
ks,i,j) + rhokh(
ks+1,i,j) ) &
904 a(
ks,i,j) = ap * rcdz(
ks) / (dens(
ks,i,j) * gsqrt(
ks,i,j,
i_xyz) )
906 b(
ks,i,j) = - a(
ks,i,j) + 1.0_rp
907 do k =
ks+1, ke_pbl-1
908 c(k,i,j) = ap * rcdz(k) / (dens(k,i,j) * gsqrt(k,i,j,
i_xyz) )
909 ap = - dt * 0.5_rp * ( rhokh(k,i,j) + rhokh(k+1,i,j) ) &
910 * rfdz(k) / gsqrt(k,i,j,
i_xyw)
911 a(k,i,j) = ap * rcdz(k) / ( dens(k,i,j) * gsqrt(k,i,j,
i_xyz) )
912 b(k,i,j) = - a(k,i,j) - c(k,i,j) + 1.0_rp
914 a(ke_pbl,i,j) = 0.0_rp
915 c(ke_pbl,i,j) = ap * rcdz(ke_pbl) / (dens(ke_pbl,i,j) * gsqrt(ke_pbl,i,j,
i_xyz) )
916 b(ke_pbl,i,j) = - c(ke_pbl,i,j) + 1.0_rp
917 d(
ks,i,j) = pott(
ks,i,j) + dt * sflx_pt(i,j) * rcdz(
ks) / gsqrt(
ks,i,j,
i_xyz)
919 d(k,i,j) = pott(k,i,j)
921 call diffusion_solver( &
923 a(:,i,j), b(:,i,j), c(:,i,j), d(:,i,j), &
933 qflx_sgs_rhot(
ks-1,i,j,
zdir) = 0.0_rp
935 qflx_sgs_rhot(k,i,j,
zdir) = - 0.5_rp &
936 * ( rhokh(k,i,j) + rhokh(k+1,i,j) ) &
937 * j33g * ( phin(k+1,i,j) - phin(k,i,j) ) * rfdz(k) / gsqrt(k,i,j,
i_xyw)
940 qflx_sgs_rhot(k,i,j,
zdir) = 0.0_rp
949 if ( iq == i_tke )
then 950 qflx_sgs_rhoq(:,:,:,
zdir,iq) = 0.0_rp
962 d(
ks,i,j) = qtrc(
ks,i,j,iq) &
963 + dt * sflx_q(i,j,iq) * rcdz(
ks) / ( dens(
ks,i,j) * gsqrt(
ks,i,j,
i_xyz) )
966 d(k,i,j) = qtrc(k,i,j,iq)
969 call diffusion_solver( &
971 a(:,i,j), b(:,i,j), c(:,i,j), d(:,i,j), &
982 qflx_sgs_rhoq(
ks-1,i,j,
zdir,iq) = 0.0_rp
984 qflx_sgs_rhoq(k,i,j,
zdir,iq) = - 0.5_rp &
985 * ( rhokh(k,i,j) + rhokh(k+1,i,j) ) &
986 * j33g * ( phin(k+1,i,j) - phin(k,i,j) ) * rfdz(k) / gsqrt(k,i,j,
i_xyw)
989 qflx_sgs_rhoq(k,i,j,
zdir,iq) = 0.0_rp
1002 tke = q(
ks,i,j)**2 * 0.5
1004 + dt * nu(
ks,i,j) * ( dudz2(
ks,i,j) - n2(
ks,i,j)/pr(
ks,i,j) )
1006 gen(
ks,i,j) = nu(
ks,i,j) * ( dudz2(
ks,i,j) - n2(
ks,i,j)/pr(
ks,i,j) )
1008 do k =
ks+1, ke_pbl-1
1009 tke = q(k,i,j)**2 * 0.5
1011 + dt * nu(k,i,j) * ( dudz2(k,i,j) - n2(k,i,j)/pr(k,i,j) )
1013 gen(k,i,j) = nu(k,i,j) * ( dudz2(k,i,j) - n2(k,i,j)/pr(k,i,j) )
1016 tke = q(ke_pbl,i,j)**2 * 0.5
1017 d(ke_pbl,i,j) = tke &
1018 + dt * nu(ke_pbl,i,j) * ( dudz2(ke_pbl,i,j) - n2(ke_pbl,i,j)/pr(ke_pbl,i,j) )
1020 gen(ke_pbl,i,j) = nu(ke_pbl,i,j) * ( dudz2(ke_pbl,i,j) - n2(ke_pbl,i,j)/pr(ke_pbl,i,j) )
1032 ap = - dt * 1.5_rp * ( dens(
ks ,i,j)*nu(
ks ,i,j) &
1033 + dens(
ks+1,i,j)*nu(
ks+1,i,j) ) &
1035 a(
ks,i,j) = ap * rcdz(
ks) / ( dens(
ks,i,j) * gsqrt(
ks,i,j,
i_xyz) )
1037 b(
ks,i,j) = - a(
ks,i,j) + 1.0_rp + 2.0_rp * dt * q(
ks,i,j) / ( b1 * l(
ks,i,j) )
1038 do k =
ks+1, ke_pbl-1
1039 c(k,i,j) = ap * rcdz(k) / ( dens(k,i,j) * gsqrt(k,i,j,
i_xyz) )
1040 ap = - dt * 1.5_rp * ( dens(k ,i,j)*nu(k ,i,j) &
1041 + dens(k+1,i,j)*nu(k+1,i,j)) &
1042 * rfdz(k) / gsqrt(k,i,j,
i_xyw)
1043 a(k,i,j) = ap * rcdz(k) / ( dens(k,i,j) * gsqrt(k,i,j,
i_xyz) )
1044 b(k,i,j) = - a(k,i,j) - c(k,i,j) + 1.0_rp + 2.0_rp * dt * q(k,i,j) / ( b1 * l(k,i,j) )
1047 a(ke_pbl,i,j) = 0.0_rp
1048 c(ke_pbl,i,j) = ap * rcdz(ke_pbl) / ( dens(ke_pbl,i,j) * gsqrt(ke_pbl,i,j,
i_xyz) )
1049 b(ke_pbl,i,j) = - c(ke_pbl,i,j) + 1.0_rp + 2.0_rp * dt * q(ke_pbl,i,j) / ( b1 * l(ke_pbl,i,j) )
1050 call diffusion_solver( &
1052 a(:,i,j), b(:,i,j), c(:,i,j), d(:,i,j), &
1055 rhoq_t(k,i,j,i_tke) = ( max(tke_n(k,i,j), tke_min) - qtrc(k,i,j,i_tke) ) * dens(k,i,j) / dt
1058 rhoq_t(k,i,j,i_tke) = 0.0_rp
1068 gen(ke_pbl+1:
ke,:,:) = 0.0_rp
1069 dudz2(ke_pbl+1:
ke,:,:) = 0.0_rp
1070 l(ke_pbl+1:
ke,:,:) = 0.0_rp
1071 potv(ke_pbl+1:
ke,:,:) = 0.0_rp
1072 potl(ke_pbl+1:
ke,:,:) = 0.0_rp
1073 call hist_in(gen,
'TKE_gen',
'generation of TKE',
'm2/s3', nohalo=.true.)
1074 call hist_in(dudz2,
'dUdZ2',
'dudz2',
'm2/s2', nohalo=.true.)
1075 call hist_in(l,
'L_mix',
'minxing length',
'm', nohalo=.true.)
1076 call hist_in(potv,
'POTV',
'virtual potential temperature',
'K', nohalo=.true.)
1077 call hist_in(potl,
'POTL',
'liquid potential temperature',
'K', nohalo=.true.)
1087 SFLX_MU, SFLX_MV, SFLX_PT, &
1098 real(RP),
intent(out) :: l(KA,IA,JA)
1099 real(RP),
intent(in) :: DENS(KA,IA,JA)
1100 real(RP),
intent(in) :: q(KA,IA,JA)
1101 real(RP),
intent(in) :: n2(KA,IA,JA)
1102 real(RP),
intent(in) :: SFLX_MU(IA,JA)
1103 real(RP),
intent(in) :: SFLX_MV(IA,JA)
1104 real(RP),
intent(in) :: SFLX_PT(IA,JA)
1105 real(RP),
intent(in) :: PT0(KA,IA,JA)
1137 qdz = q(k,i,j) * ( fz(k,i,j) - fz(k-1,i,j) )
1138 int_qz = int_qz + ((fz(k,i,j)+fz(k-1,i,j))*0.5_rp-fz(
ks-1,i,j)) * qdz
1142 lt = min( max(0.23_rp * int_qz / (int_q + eps), &
1144 atmos_phy_tb_mynn_lt_max )
1147 us = sqrt( sqrt( sflx_mu(i,j)**2 + sflx_mv(i,j)**2 ) / dens(
ks,i,j) )
1148 us = max(us, us_min)
1149 rlm = - karman * grav * sflx_pt(i,j) / (pt0(
ks,i,j) * us**3 )
1151 qc = (grav/pt0(
ks,i,j)*max(sflx_pt(i,j),0.0_rp)*lt)**oneoverthree
1154 z = ( fz(k,i,j)+fz(k-1,i,j) )*0.5_rp - fz(
ks-1,i,j)
1158 sw = sign(0.5_rp, zeta) + 0.5_rp
1160 * ( sw / (1.0_rp + 2.7_rp*min(zeta,1.0_rp)*sw ) &
1161 + ( (1.0_rp - 100.0_rp*zeta)*(1.0_rp-sw) )**0.2_rp )
1164 sw = sign(0.5_rp, n2(k,i,j)-eps) + 0.5_rp
1165 rn2sr = 1.0_rp / ( sqrt(n2(k,i,j)*sw) + 1.0_rp-sw)
1166 lb = (1.0_rp + 5.0_rp * sqrt(qc*rn2sr/lt)) * q(k,i,j) * rn2sr * sw &
1167 + 999.e10_rp * (1.0_rp-sw)
1170 l(k,i,j) = 1.0_rp / ( 1.0_rp/ls + rlt + 1.0_rp/lb )
1183 real(RP),
intent(out) :: q2_2(KA,IA,JA)
1184 real(RP),
intent(in) :: dudz2(KA,IA,JA)
1185 real(RP),
intent(in) :: Ri(KA,IA,JA)
1186 real(RP),
intent(in) :: l(KA,IA,JA)
1202 rf = min(0.5_rp / af12 * ( ri(k,i,j) &
1204 - sqrt(ri(k,i,j)**2 + 2.0_rp*af12*(rf1-2.0_rp*rf2)*ri(k,i,j) + (af12*rf1)**2) ), &
1206 sh_2 = 3.0_rp * a2 * (g1+g2) * (rfc-rf) / (1.0_rp-rf)
1207 sm_2 = sh_2 * af12 * (rf1-rf) / (rf2-rf)
1208 q2 = b1 * l(k,i,j)**2 * sm_2 * (1.0_rp-rf) * dudz2(k,i,j)
1209 q2_2(k,i,j) = max( q2, 1.e-10_rp )
1217 subroutine get_smsh( &
1222 real(RP),
intent(out) :: sm(KA,IA,JA)
1223 real(RP),
intent(out) :: sh(KA,IA,JA)
1224 real(RP),
intent(in) :: q(KA,IA,JA)
1225 real(RP),
intent(in) :: q2_2(KA,IA,JA)
1226 real(RP),
intent(in) :: l(KA,IA,JA)
1227 real(RP),
intent(in) :: n2(KA,IA,JA)
1228 real(RP),
intent(in) :: dudz2(KA,IA,JA)
1252 ac = min(q(k,i,j)/sqrt(q2_2(k,i,j)), 1.0_rp)
1254 l2q2 = ( l(k,i,j) / q(k,i,j) )**2
1255 gh = - n2(k,i,j) * l2q2
1257 p1 = 1.0_rp - 3.0_rp * ac2 * a2 * b2 * (1.0_rp-c3) * gh
1258 p2 = 1.0_rp - 9.0_rp * ac2 * a1 * a2 * (1.0_rp-c2) * gh
1259 p3 = p1 + 9.0_rp * ac2 * a2**2 * (1.0_rp-c2) * (1.0_rp-c5) * gh
1260 p4 = p1 - 12.0_rp * ac2 * a1 * a2 * (1.0_rp-c2) * gh
1261 p5 = 6.0_rp * ac2 * a1**2 * dudz2(k,i,j) * l2q2
1263 rd25 = 1.0_rp / max(p2 * p4 + p5 * p3, 1.e-20_rp)
1264 sm(k,i,j) = max( ac * a1 * (p3 - 3.0_rp * c1 * p4) * rd25, 0.0_rp )
1265 sh(k,i,j) = max( ac * a2 * (p2 + 3.0_rp * c1 * p5) * rd25, 0.0_rp )
1271 end subroutine get_smsh
1274 real(RP),
parameter :: a = 0.1400122886866665_rp
1275 real(RP),
parameter :: fourpi = 1.2732395447351628_rp
1277 real(RP),
intent(in) :: x
1284 #if defined(PGI) || defined(SX) 1285 tmp = min( x2 * ( fourpi + a*x2 ) / ( 1.0_rp + a*x2 ), 1.e+3_rp )
1286 erf = sign( sqrt( 1.0_rp - exp(-tmp) ), x )
1288 erf = sign( sqrt( 1.0_rp - exp(-x2 * (fourpi+a*x2)/(1.0_rp+a*x2) ) ), x )
integer, public is
start point of inner domain: x, local
integer, public je
end point of inner domain: y, local
real(rp), public const_cpdry
specific heat (dry air,constant pressure) [J/kg/K]
module ATMOSPHERE / Saturation adjustment
subroutine, public prc_mpistop
Abort MPI.
subroutine, public atmos_phy_tb_diffusion_solver(phi, a, b, c, d, KE_TB)
real(rp), dimension(qa_max), public tracer_r
integer, public iblock
block size for cache blocking: x
logical, public io_l
output log or not? (this process)
integer, parameter, public zdir
subroutine get_length(l, DENS, q, n2, SFLX_MU, SFLX_MV, SFLX_PT, PT0)
integer, parameter, public ydir
integer, public ke
end point of inner domain: z, local
integer, parameter, public xdir
real(rp), dimension(:,:,:), allocatable, public real_fz
geopotential height [m] (cell face )
subroutine get_q2_level2(q2_2, dudz2, Ri, l)
logical, dimension(qa_max), public tracer_advc
real(rp), dimension(:,:,:), allocatable, public real_cz
geopotential height [m] (cell center)
subroutine, public atmos_phy_tb_mynn_setup(CDZ, CDX, CDY, CZ)
Setup.
subroutine, public check(current_line, v)
Undefined value checker.
real(rp), dimension(:), allocatable, public grid_rcdz
reciprocal of center-dz
real(rp), parameter, public const_karman
von Karman constant
real(rp), dimension(qa_max), public tracer_cv
real(rp), public const_rdry
specific gas constant (dry air) [J/kg/K]
real(rp), public const_undef
logical, public io_nml
output log or not? (for namelist, this process)
integer, public ia
of whole cells: x, local, with HALO
integer, public ka
of whole cells: z, local, with HALO
real(rp), parameter, public const_lhv0
latent heat of vaporizaion at 0C [J/kg]
integer, public jblock
block size for cache blocking: y
subroutine, public atmos_phy_tb_mynn(qflx_sgs_momz, qflx_sgs_momx, qflx_sgs_momy, qflx_sgs_rhot, qflx_sgs_rhoq, RHOQ_t, Nu, Ri, Pr, MOMZ, MOMX, MOMY, RHOT, DENS, QTRC, N2_in, SFLX_MW, SFLX_MU, SFLX_MV, SFLX_SH, SFLX_Q, GSQRT, J13G, J23G, J33G, MAPF, dt)
real(rp), public const_grav
standard acceleration of gravity [m/s2]
integer, public js
start point of inner domain: y, local
integer, parameter, public const_undef2
undefined value (INT2)
subroutine, public atmos_phy_tb_mynn_config(TYPE_TB, I_TKE_out)
Config.
real(rp), public const_epstvap
1 / epsilon - 1
real(rp), parameter, public const_rvap
specific gas constant (water vapor) [J/kg/K]
integer, public ks
start point of inner domain: z, local
module ATMOSPHERE / Physics Turbulence
integer, public ie
end point of inner domain: x, local
real(rp), public const_eps
small number
module ATMOSPHERE / Thermodynamics
real(rp), public const_pi
pi
real(rp), dimension(:), allocatable, public grid_rfdz
reciprocal of face-dz
integer, public io_fid_conf
Config file ID.
subroutine, public tracer_regist(QS, NQ, NAME, DESC, UNIT, CV, CP, R, ADVC, MASS)
Regist tracer.
integer, public io_fid_log
Log file ID.
real(rp), parameter, public const_cpvap
specific heat (water vapor, constant pressure) [J/kg/K]
module ATMOSPHERE / Physics Turbulence
integer, public io_fid_nml
Log file ID (only for output namelist)
real(rp), dimension(qa_max), public tracer_mass
integer, public ja
of whole cells: y, local, with HALO