11#include "scaleFElib.h"
21 use scale_const,
only: &
22 undef8 => const_undef8
23 use scale_tracer,
only: qa
71 integer :: atm_var_container_typeid
73 logical,
private :: do_precipitation
74 logical,
private :: do_negative_fixer
76 integer,
private :: ntmax_sedimentation
77 real(rp),
private :: max_term_vel
78 real(rp),
private :: cldfrac_threshold
80 real(dp),
private :: dtsec
81 integer,
private :: nstep_sedimentation
82 real(rp),
private :: rnstep_sedimentation
83 real(dp),
private :: dtsec_sedimentation
92 logical :: gfilter_flag
95 logical :: modalfilter_flag
99 logical :: postfilteronlyapplyrhoh
105 procedure,
public :: setup => atmosphymp_setup
106 procedure,
public :: calc_tendency => atmosphymp_calc_tendency
107 procedure,
public :: update => atmosphymp_update
108 procedure,
public :: finalize => atmosphymp_finalize
109 procedure,
public :: set_primary_atmvars_container => atmosphymp_set_primary_atmvars_container
110 procedure,
public :: set_cp_tends_manager => atmosphymp_set_cp_tends_manager
111 procedure,
private :: calc_tendency_core => atmosphymp_calc_tendency_core
113 procedure,
private :: create_postfilter => atmosphymp_create_postfilter
128 integer,
parameter :: mp_typeid_tomita08 = 2
129 integer,
parameter :: mp_typeid_sn14 = 3
130 integer,
parameter :: mp_typeid_lscond = 4
132 logical :: flag_lt = .false.
141 subroutine atmosphymp_setup( this, model_mesh, tm_parent_comp )
142 use scale_const,
only: &
144 use scale_tracer,
only: &
146 use scale_atmos_hydrometeor,
only: &
147 atmos_hydrometeor_regist
148 use scale_atmos_phy_mp_kessler,
only: &
149 atmos_phy_mp_kessler_setup, &
150 atmos_phy_mp_kessler_ntracers, &
151 atmos_phy_mp_kessler_nwaters, &
152 atmos_phy_mp_kessler_nices, &
153 atmos_phy_mp_kessler_tracer_names, &
154 atmos_phy_mp_kessler_tracer_descriptions, &
155 atmos_phy_mp_kessler_tracer_units
156 use scale_atmos_phy_mp_tomita08,
only: &
157 atmos_phy_mp_tomita08_setup, &
158 atmos_phy_mp_tomita08_ntracers, &
159 atmos_phy_mp_tomita08_nwaters, &
160 atmos_phy_mp_tomita08_nices, &
161 atmos_phy_mp_tomita08_tracer_names, &
162 atmos_phy_mp_tomita08_tracer_descriptions, &
163 atmos_phy_mp_tomita08_tracer_units
164 use scale_atmos_phy_mp_sn14,
only: &
165 atmos_phy_mp_sn14_setup, &
166 atmos_phy_mp_sn14_ntracers, &
167 atmos_phy_mp_sn14_nwaters, &
168 atmos_phy_mp_sn14_nices, &
169 atmos_phy_mp_sn14_tracer_names, &
170 atmos_phy_mp_sn14_tracer_descriptions, &
171 atmos_phy_mp_sn14_tracer_units
188 class(modelmeshbase),
target,
intent(in) :: model_mesh
191 real(dp) :: time_dt = undef8
192 character(len=H_SHORT) :: time_dt_unit =
'SEC'
194 character(len=H_MID) :: mp_type =
'KESSLER'
196 logical :: do_precipitation
197 logical :: do_negative_fixer
199 integer :: ntmax_sedimentation
200 real(rp) :: max_term_vel
201 real(rp) :: cldfrac_threshold
203 integer :: atm_var_container_typeid
204 character(len=H_SHORT) :: postglfilter_type =
'None'
205 character(len=H_SHORT) :: postglfilter_convfiltershape =
'GAUSSIAN'
206 integer :: postglfilter_nnodeh1d_reconst = -1
207 real(rp) :: postglfilter_gaussinwidthfac = 1.5_rp
208 real(rp) :: postmodalfilter_alpha_h = 0.0_rp
209 real(rp) :: postmodalfilter_etac_h = 0.0_rp
210 integer :: postmodalfilter_order_h = 16
211 real(rp) :: postmodalfilter_alpha_v = 0.0_rp
212 integer :: postmodalfilter_order_v = 16
213 logical :: postfilteronlyapplyrhoh = .false.
215 namelist /param_atmos_phy_mp/ &
222 ntmax_sedimentation, &
225 atm_var_container_typeid, &
227 postglfilter_nnodeh1d_reconst, &
228 postglfilter_gaussinwidthfac, &
229 postmodalfilter_alpha_h, &
230 postmodalfilter_etac_h, &
231 postmodalfilter_order_h, &
232 postmodalfilter_alpha_v, &
233 postmodalfilter_order_v, &
234 postfilteronlyapplyrhoh
239 class(
meshbase),
pointer :: ptr_mesh
243 integer :: qs_mp, qe_mp, qa_mp
247 integer :: postfilteredtendnum
251 if (.not. this%IsActivated())
return
254 log_info(
"ATMOS_PHY_MP_setup",*)
'Setup'
256 cldfrac_threshold = eps
258 do_precipitation = .true.
259 do_negative_fixer = .true.
261 ntmax_sedimentation = 1
262 max_term_vel = 10.0_rp
268 read(io_fid_conf,nml=param_atmos_phy_mp,iostat=ierr)
270 log_info(
"ATMOS_PHY_MP_setup",*)
'Not found namelist. Default used.'
271 elseif( ierr > 0 )
then
272 log_error(
"ATMOS_PHY_MP_setup",*)
'Not appropriate names in namelist PARAM_ATMOS_PHY_MP. Check!'
275 log_nml(param_atmos_phy_mp)
277 this%cldfrac_threshold = cldfrac_threshold
278 this%do_precipitation = do_precipitation
279 this%do_negative_fixer = do_negative_fixer
280 this%ntmax_sedimentation = ntmax_sedimentation
281 this%max_term_vel = max_term_vel
284 this%atm_var_container_typeid = atm_var_container_typeid
287 log_info(
"ATMOS_PHY_MP_setup",*)
'Enable negative fixer? : ', this%do_negative_fixer
289 log_info(
"ATMOS_PHY_MP_setup",*)
'Enable sedimentation (precipitation)? : ', this%do_precipitation
293 call model_mesh%GetModelMesh( ptr_mesh )
294 select type(model_mesh)
296 atm_mesh => model_mesh
301 call tm_parent_comp%Regist_process(
'ATMOS_PHY_MP', time_dt, time_dt_unit, &
304 this%dtsec = tm_parent_comp%process_list(this%tm_process_id)%dtsec
306 this%ntmax_sedimentation = max( ntmax_sedimentation, nstep_max )
308 this%nstep_sedimentation = ntmax_sedimentation
309 this%rnstep_sedimentation = 1.0_rp / real(ntmax_sedimentation,kind=rp)
310 this%dtsec_sedimentation = this%dtsec * this%rnstep_sedimentation
313 log_info(
"ATMOS_PHY_MP_setup",*)
'Enable negative fixer? : ', this%do_negative_fixer
315 log_info(
"ATMOS_PHY_MP_setup",*)
'Enable sedimentation (precipitation)? : ', this%do_precipitation
316 log_info(
"ATMOS_PHY_MP_setup",*)
'Timestep of sedimentation is divided into : ', this%ntmax_sedimentation,
'step'
317 log_info(
"ATMOS_PHY_MP_setup",*)
'DT of sedimentation : ', this%dtsec_sedimentation,
'[s]'
321 select case( mp_type )
324 call atmos_hydrometeor_regist( &
325 atmos_phy_mp_kessler_nwaters, &
326 atmos_phy_mp_kessler_nices, &
327 atmos_phy_mp_kessler_tracer_names(:), &
328 atmos_phy_mp_kessler_tracer_descriptions(:), &
329 atmos_phy_mp_kessler_tracer_units(:), &
331 qa_mp = atmos_phy_mp_kessler_ntracers
333 this%MP_TYPEID = mp_typeid_tomita08
334 call atmos_hydrometeor_regist( &
335 atmos_phy_mp_tomita08_nwaters, &
336 atmos_phy_mp_tomita08_nices, &
337 atmos_phy_mp_tomita08_tracer_names(:), &
338 atmos_phy_mp_tomita08_tracer_descriptions(:), &
339 atmos_phy_mp_tomita08_tracer_units(:), &
341 qa_mp = atmos_phy_mp_tomita08_ntracers
359 this%MP_TYPEID = mp_typeid_lscond
360 call atmos_hydrometeor_regist( &
369 log_error(
"ATMOS_PHY_MP_setup",*)
'Not appropriate names of MP_TYPE in namelist PARAM_ATMOS_PHY_MP. Check!'
373 qe_mp = qs_mp + qa_mp - 1
376 call this%vars%Init( model_mesh, qs_mp, qe_mp, qa_mp )
380 lcmesh3d => atm_mesh%ptr_mesh%lcmesh_list(1)
381 elem3d => lcmesh3d%refElem3D
383 select case( this%MP_TYPEID )
385 call atmos_phy_mp_kessler_setup()
386 case( mp_typeid_tomita08 )
387 call atmos_phy_mp_tomita08_setup( &
388 elem3d%Nnode_v*lcmesh3d%NeZ, 1, elem3d%Nnode_v*lcmesh3d%NeZ, elem3d%Nnode_h1D**2, 1, elem3d%Nnode_h1D**2, lcmesh3d%Ne2D, 1, lcmesh3d%Ne2D, &
390 case( mp_typeid_sn14 )
391 case( mp_typeid_lscond )
397 call this%elem%Init( elem3d%PolyOrder_h, elem3d%PolyOrder_v, .true. )
398 call this%Dz%Init( this%elem%Dx3, storage_format=
'ELL' )
399 call this%Lift%Init( this%elem%Lift, storage_format=
'ELL' )
401 call this%elem_v1D%Init( elem3d%PolyOrder_v, .false. )
405 select case( trim(postglfilter_type) )
406 case (
'ConvolFilter',
'Reconstruction',
'Reconstruction2')
407 this%gFilter_flag = .true.
408 case (
'None',
'ModalFilter')
409 this%gFilter_flag = .false.
411 log_info(
"ATMOS_PHY_MP_setup",*)
'Not appropriate names of PostGLFilter_Type in namelist PARAM_ATMOS_PHY_MP. Check!'
417 this%PostFilterOnlyApplyRHOH = postfilteronlyapplyrhoh
418 if ( this%PostFilterOnlyApplyRHOH )
then
419 postfilteredtendnum = 1
421 postfilteredtendnum = this%vars%TENDS_NUM_TOT
423 if ( this%gFilter_flag )
then
424 call this%gFilter_phy_mp%Init( postglfilter_type, &
425 postglfilter_convfiltershape, postglfilter_gaussinwidthfac, &
426 postglfilter_nnodeh1d_reconst, &
427 postfilteredtendnum, 0, 0, atm_mesh%ptr_mesh )
430 if ( postmodalfilter_alpha_h > 0.0_rp .or. postmodalfilter_alpha_v > 0.0_rp )
then
431 this%modalFilter_flag = .true.
432 call elemh2d%Init( elem3d%PolyOrder_h, .true. )
433 call this%modalfilter_h2D%Init( elemh2d, postmodalfilter_etac_h, postmodalfilter_alpha_h, postmodalfilter_order_h )
434 call this%modalfilter_3D%Init( this%elem, postmodalfilter_etac_h, postmodalfilter_alpha_h, postmodalfilter_order_h, 0.0_rp, postmodalfilter_alpha_v, postmodalfilter_order_v )
437 this%modalFilter_flag = .false.
441 this%CP_flag = .false.
442 this%ptr_CP_RHOT_t => null()
445 end subroutine atmosphymp_setup
449 subroutine atmosphymp_set_primary_atmvars_container( this, primary_atmvars_container )
455 this%primary_atmvars_container => primary_atmvars_container
457 end subroutine atmosphymp_set_primary_atmvars_container
459 subroutine atmosphymp_set_cp_tends_manager( this, CP_tends_manager )
467 this%CP_flag = .true.
468 call cp_tends_manager%Get( cp_rhot_t_id, this%ptr_CP_RHOT_t )
470 end subroutine atmosphymp_set_cp_tends_manager
482 subroutine atmosphymp_calc_tendency( &
483 this, model_mesh, prgvars_list, trcvars_list, &
484 auxvars_list, forcing_list, is_update )
498 class(modelmeshbase),
intent(in) :: model_mesh
503 logical,
intent(in) :: is_update
513 class(
localmeshfieldbase),
pointer :: ddens_pri, momx_pri, momy_pri, momz_pri, drhot_pri
521 class(
localmeshfieldbase),
pointer :: dens_tp, momx_tp, momy_tp, momz_tp, rhot_tp, rhoh_p
523 class(
localmeshfieldbase),
pointer :: mp_dens_t, mp_momx_t, mp_momy_t, mp_momz_t, mp_rhot_t, mp_rhoh, mp_evap
528 logical,
allocatable :: cp_mask(:,:)
534 real(rp),
allocatable :: filtermat(:,:)
535 real(rp),
allocatable :: filtermat2d(:,:)
538 if (.not. this%IsActivated())
return
540 log_progress(*)
'atmosphere / physics / cloud microphysics'
542 call model_mesh%GetModelMesh( mesh )
546 do n=1, mesh%LOCAL_MESH_NUM
547 call prof_rapstart(
'ATM_PHY_MP_get_localmesh_ptr', 2)
551 mesh, prgvars_list, auxvars_list, &
552 ddens, momx, momy, momz, drhot, &
553 dens_hyd, pres_hyd, rtot, cvtot, cptot, &
557 mesh, trcvars_list, this%vars%QS, qtrc(:) )
560 mesh, auxvars_list, &
566 mesh, this%primary_atmvars_container%PROGVARS_manager, this%primary_atmvars_container%AUXVARS_manager, &
567 ddens_pri, momx_pri, momy_pri, momz_pri, drhot_pri, &
568 dens_hyd_pri, pres_hyd_pri, rtot_pri, cvtot_pri, cptot_pri, &
572 mesh, this%primary_atmvars_container%QTRCVARS_manager, this%vars%QS, qtrc_pri(:) )
575 mesh, this%primary_atmvars_container%AUXVARS_manager, &
581 mesh, forcing_list, &
582 dens_tp, momx_tp, momy_tp, momz_tp, rhot_tp, &
586 mesh, this%vars%tends_manager, &
587 mp_dens_t, mp_momx_t, mp_momy_t, mp_momz_t, mp_rhot_t, mp_rhoh, mp_evap, &
591 mesh, this%vars%auxvars2D_manager, &
592 sflx_rain, sflx_snow, sflx_engi )
595 allocate( cp_mask(lcmesh%refElem3D%Np,lcmesh%Ne) )
596 if ( this%CP_flag )
then
597 call this%ptr_CP_RHOT_t%GetLocalMeshField( n, cp_rhot_t )
598 where ( abs(cp_rhot_t%val(:,lcmesh%NeS:lcmesh%NeE)) > 1.0e-12_rp )
599 cp_mask(:,:) = .true.
601 cp_mask(:,:) = .false.
604 call prof_rapend(
'ATM_PHY_MP_get_localmesh_ptr', 2)
608 call prof_rapstart(
'ATM_PHY_MP_cal_tend', 2)
609 call this%calc_tendency_core( &
610 mp_dens_t%val, mp_momx_t%val, mp_momy_t%val, mp_momz_t%val, mp_rhoq_t, &
611 mp_rhoh%val, mp_evap%val, sflx_rain%val, sflx_snow%val, sflx_engi%val, &
612 ddens%val, ddens_pri%val, momx_pri%val, momy_pri%val, momz_pri%val, pt%val, qtrc, qtrc_pri, &
613 pres%val, pres_pri%val, pres_hyd%val, dens_hyd%val, &
614 rtot%val, rtot_pri%val, cvtot%val, cvtot_pri%val, cptot%val, cptot_pri%val, &
616 model_mesh%DOptrMat(3), model_mesh%LiftOptrMat, &
617 lcmesh, lcmesh%refElem3D, lcmesh%lcmesh2D, lcmesh%lcmesh2D%refElem2D, this%elem_v1D )
618 call prof_rapend(
'ATM_PHY_MP_cal_tend', 2)
620 deallocate( cp_mask )
623 if ( this%gFilter_flag )
then
624 if ( this%PostFilterOnlyApplyRHOH )
then
627 call this%gFilter_phy_mp%Apply( this%vars%tends, this%vars%tends(1)%mesh )
632 if ( this%modalFilter_flag )
then
633 do n=1, mesh%LOCAL_MESH_NUM
635 mesh, this%vars%tends_manager, &
636 mp_dens_t, mp_momx_t, mp_momy_t, mp_momz_t, mp_rhot_t, mp_rhoh, mp_evap, &
639 lcmesh2d => lcmesh%lcmesh2D
640 refelem3d => lcmesh%refElem3D
641 refelem2d => lcmesh2d%refElem2D
643 allocate( filtermat(refelem3d%Np,refelem3d%Np) )
644 allocate( filtermat2d(refelem2d%Np,refelem2d%Np) )
648 do ke=lcmesh%NeS, lcmesh%NeE
649 call this%create_PostFilter( filtermat, &
650 this%modalfilter_3D%FilterMat, lcmesh%Gsqrt(:,ke), refelem3d%Np )
652 if ( .not. this%PostFilterOnlyApplyRHOH )
then
653 mp_dens_t%val(:,ke) = matmul( filtermat, mp_dens_t%val(:,ke) )
654 mp_momx_t%val(:,ke) = matmul( filtermat, mp_momx_t%val(:,ke) )
655 mp_momy_t%val(:,ke) = matmul( filtermat, mp_momy_t%val(:,ke) )
656 mp_momz_t%val(:,ke) = matmul( filtermat, mp_momz_t%val(:,ke) )
658 do iq=this%vars%QS, this%vars%QE
659 mp_rhoq_t(iq)%ptr%val(:,ke) = matmul( filtermat, mp_rhoq_t(iq)%ptr%val(:,ke) )
663 mp_rhoh %val(:,ke) = matmul( filtermat, mp_rhoh %val(:,ke) )
665 if ( .not. this%PostFilterOnlyApplyRHOH )
then
667 do ke=lcmesh2d%NeS, lcmesh2d%NeE
668 call this%create_PostFilter( filtermat2d, &
669 this%modalfilter_h2D%FilterMat, lcmesh2d%Gsqrt(:,ke), refelem2d%Np )
671 this%vars%auxvars2D(1)%local(n)%val(:,ke) = matmul( filtermat2d, this%vars%auxvars2D(1)%local(n)%val(:,ke) )
677 deallocate( filtermat, filtermat2d )
685 do n=1, mesh%LOCAL_MESH_NUM
687 mesh, forcing_list, &
688 dens_tp, momx_tp, momy_tp, momz_tp, rhot_tp, &
692 mesh, this%vars%tends_manager, &
693 mp_dens_t, mp_momx_t, mp_momy_t, mp_momz_t, mp_rhot_t, mp_rhoh, mp_evap, &
698 do ke = lcmesh%NeS, lcmesh%NeE
699 dens_tp%val(:,ke) = dens_tp%val(:,ke) + mp_dens_t%val(:,ke)
700 momx_tp%val(:,ke) = momx_tp%val(:,ke) + mp_momx_t%val(:,ke)
701 momy_tp%val(:,ke) = momy_tp%val(:,ke) + mp_momy_t%val(:,ke)
702 momz_tp%val(:,ke) = momz_tp%val(:,ke) + mp_momz_t%val(:,ke)
703 rhoh_p %val(:,ke) = rhoh_p %val(:,ke) + mp_rhoh %val(:,ke)
707 do iq = this%vars%QS, this%vars%QE
708 do ke = lcmesh%NeS, lcmesh%NeE
709 rhoq_tp(iq)%ptr%val(:,ke) = rhoq_tp(iq)%ptr%val(:,ke) &
710 + mp_rhoq_t(iq)%ptr%val(:,ke)
718 end subroutine atmosphymp_calc_tendency
729 subroutine atmosphymp_update( this, model_mesh, &
730 prgvars_list, trcvars_list, &
731 auxvars_list, forcing_list, is_update )
735 class(modelmeshbase),
intent(in) :: model_mesh
740 logical,
intent(in) :: is_update
743 end subroutine atmosphymp_update
748 subroutine atmosphymp_finalize( this )
753 if (.not. this%IsActivated())
return
755 select case ( this%MP_TYPEID )
757 case( mp_typeid_tomita08 )
758 case( mp_typeid_sn14 )
759 case( mp_typeid_lscond )
762 call this%vars%Final()
765 call this%elem%Final()
766 call this%Dz%Final();
call this%Lift%Final()
767 call this%elem_v1D%Final()
770 end subroutine atmosphymp_finalize
776 subroutine atmosphymp_calc_tendency_core( this, &
777 DENS_t_MP, RHOU_t_MP, RHOV_t_MP, MOMZ_t_MP, RHOQ_t_MP, & ! (out)
778 rhoh_mp, evaporate, sflx_rain, sflx_snow, sflx_engi, &
779 ddens, ddens_pri, rhou, rhov, momz, pt, qtrc, qtrc_pri, &
780 pres, pres_pri, pres_hyd, dens_hyd, &
781 rtot, rtot_pri, cvtot, cvtot_pri, cptot, cptot_pri, &
784 lcmesh, elem3d, lcmesh2d, elem2d, elem_v1d )
786 use scale_const,
only: &
788 use scale_const,
only: &
789 cvdry => const_cvdry, &
791 use scale_atmos_hydrometeor,
only: &
794 use scale_atmos_phy_mp_kessler,
only: &
795 atmos_phy_mp_kessler_terminal_velocity
796 use scale_atmos_phy_mp_tomita08,
only: &
797 atmos_phy_mp_tomita08_terminal_velocity
798 use scale_atmos_phy_mp_sn14,
only: &
799 atmos_phy_mp_sn14_terminal_velocity
818 real(rp),
intent(out) :: dens_t_mp(elem3d%np,lcmesh%nea)
819 real(rp),
intent(out) :: rhou_t_mp(elem3d%np,lcmesh%nea)
820 real(rp),
intent(out) :: rhov_t_mp(elem3d%np,lcmesh%nea)
821 real(rp),
intent(out) :: momz_t_mp(elem3d%np,lcmesh%nea)
823 real(rp),
intent(out) :: rhoh_mp(elem3d%np,lcmesh%nea)
824 real(rp),
intent(out) :: evaporate(elem3d%np,lcmesh%nea)
825 real(rp),
intent(out) :: sflx_rain(elem2d%np,lcmesh2d%nea)
826 real(rp),
intent(out) :: sflx_snow(elem2d%np,lcmesh2d%nea)
827 real(rp),
intent(out) :: sflx_engi(elem2d%np,lcmesh2d%nea)
828 real(rp),
intent(in) :: ddens(elem3d%np,lcmesh%nea)
829 real(rp),
intent(in) :: ddens_pri(elem3d%np,lcmesh%nea)
830 real(rp),
intent(in) :: rhou(elem3d%np,lcmesh%nea)
831 real(rp),
intent(in) :: rhov(elem3d%np,lcmesh%nea)
832 real(rp),
intent(in) :: momz(elem3d%np,lcmesh%nea)
833 real(rp),
intent(in) :: pt (elem3d%np,lcmesh%nea)
836 real(rp),
intent(in) :: pres(elem3d%np,lcmesh%nea)
837 real(rp),
intent(in) :: pres_pri(elem3d%np,lcmesh%nea)
838 real(rp),
intent(in) :: pres_hyd(elem3d%np,lcmesh%nea)
839 real(rp),
intent(in) :: dens_hyd(elem3d%np,lcmesh%nea)
840 real(rp),
intent(in) :: rtot (elem3d%np,lcmesh%nea)
841 real(rp),
intent(in) :: rtot_pri(elem3d%np,lcmesh%nea)
842 real(rp),
intent(in) :: cvtot(elem3d%np,lcmesh%nea)
843 real(rp),
intent(in) :: cvtot_pri(elem3d%np,lcmesh%nea)
844 real(rp),
intent(in) :: cptot(elem3d%np,lcmesh%nea)
845 real(rp),
intent(in) :: cptot_pri(elem3d%np,lcmesh%nea)
846 logical,
intent(in) :: cp_mask(elem3d%np,lcmesh%ne)
850 real(rp) :: dens (elem3d%np,lcmesh%nea)
851 real(rp) :: dens_pri(elem3d%np,lcmesh%nea)
853 real(rp) :: rhoe_t(elem3d%np,lcmesh%nea)
855 real(rp) :: cptot_t(elem3d%np,lcmesh%nea)
856 real(rp) :: cvtot_t(elem3d%np,lcmesh%nea)
858 real(rp) :: vterm(elem3d%np,lcmesh%nez,lcmesh%ne2d,this%vars%qs+1:this%vars%qe)
860 real(rp) :: dens0_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d)
861 real(rp) :: dens2_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d)
862 real(rp) :: rhou2_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d)
863 real(rp) :: rhov2_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d)
864 real(rp) :: momz2_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d)
865 real(rp) :: temp2_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d)
866 real(rp) :: cptot2_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d)
867 real(rp) :: cvtot2_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d)
868 real(rp) :: rhoe_pri (elem3d%np,lcmesh%nez,lcmesh%ne2d)
869 real(rp) :: rhoe2_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d)
871 real(rp) :: rhoq_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d,this%vars%qs+1:this%vars%qe)
872 real(rp) :: rhoq2(elem3d%np,lcmesh%nez,lcmesh%ne2d,this%vars%qs+1:this%vars%qe)
873 real(rp) :: rhoq2_pri(elem3d%np,lcmesh%nez,lcmesh%ne2d,this%vars%qs+1:this%vars%qe)
875 real(rp) :: rhoq2_tmp(elem3d%nnode_v,lcmesh%nez,this%vars%qs+1:this%vars%qe)
876 real(rp) :: dens2_tmp(elem3d%nnode_v,lcmesh%nez)
877 real(rp) :: temp2_tmp(elem3d%nnode_v,lcmesh%nez)
878 real(rp) :: pres2_tmp(elem3d%nnode_v,lcmesh%nez)
879 real(rp) :: ref_dens_tmp(elem3d%nnode_v,lcmesh%nez)
880 real(rp) :: vterm_tmp(elem3d%nnode_v,lcmesh%nez,this%vars%qs+1:this%vars%qe)
882 real(rp) :: flx_hydro(elem3d%np,lcmesh%nez,lcmesh%ne2d)
883 real(rp) :: cp_t(elem3d%np), cv_t(elem3d%np)
888 integer :: ke2d, ke_z
890 integer :: colmask(elem3d%nnode_v)
895 integer :: vmapm(elem3d%nfptot,lcmesh%nez)
896 integer :: vmapp(elem3d%nfptot,lcmesh%nez)
897 real(rp) :: intweight(elem3d%nfaces,elem3d%nfptot)
898 real(rp) :: nz(elem3d%nfptot,lcmesh%nez,lcmesh%ne2d)
900 logical :: lscond_flag
903 rdt_mp = 1.0_rp / this%dtsec
904 domid = lcmesh%lcdomID
906 call lcmesh%GetVmapZ1D( vmapm, vmapp )
912 do ke = lcmesh%NeS, lcmesh%NeE
913 dens(:,ke) = dens_hyd(:,ke) + ddens(:,ke)
914 dens_pri(:,ke) = dens_hyd(:,ke) + ddens_pri(:,ke)
918 lscond_flag = .false.
922 select case( this%MP_TYPEID )
924 call calc_tendency_kessler( this, &
925 rhoq_t_mp, cptot_t, cvtot_t, rhoe_t, evaporate, &
926 dens, qtrc, pres, dens_hyd, rtot, cvtot, cptot, &
927 dens_pri, qtrc_pri, &
928 rdt_mp, lcmesh, elem3d )
930 case( mp_typeid_tomita08 )
931 call calc_tendency_tomita08( this, &
932 rhoq_t_mp, cptot_t, cvtot_t, rhoe_t, evaporate, &
933 dens, qtrc, pres, dens_hyd, rtot, cvtot, cptot, &
934 rdt_mp, lcmesh, elem3d )
936 case( mp_typeid_sn14 )
937 call calc_tendency_sn14( this, &
938 rhoq_t_mp, cptot_t, cvtot_t, rhoe_t, evaporate, &
939 dens, qtrc, pres, dens_hyd, rtot, cvtot, cptot, &
940 rdt_mp, lcmesh, elem3d )
942 case( mp_typeid_lscond )
943 call calc_tendency_lscond( this, &
944 rhoq_t_mp, cptot_t, cvtot_t, rhoe_t, evaporate, &
945 dens, qtrc, pres, dens_hyd, rtot, cvtot, cptot, &
947 rdt_mp, lcmesh, elem3d )
953 do ke = lcmesh%NeS, lcmesh%NeE
954 rhoh_mp(:,ke) = rhoe_t(:,ke) &
955 - ( cptot_t(:,ke) + log( pres_pri(:,ke) / pre00 ) * ( cvtot_pri(:,ke) / cptot_pri(:,ke) * cptot_t(:,ke) - cvtot_t(:,ke) ) ) &
956 * pres_pri(:,ke) / rtot_pri(:,ke)
961 if ( this%do_precipitation )
then
965 do ke2d = 1, lcmesh%Ne2D
966 do ke_z = 1, lcmesh%NeZ
967 ke = ke2d + (ke_z-1)*lcmesh%Ne2D
969 dens0_pri(:,ke_z,ke2d) = dens_hyd(:,ke) + ddens_pri(:,ke)
970 dens2_pri(:,ke_z,ke2d) = dens_hyd(:,ke) + ddens_pri(:,ke)
972 rhou2_pri(:,ke_z,ke2d) = rhou(:,ke)
973 rhov2_pri(:,ke_z,ke2d) = rhov(:,ke)
974 momz2_pri(:,ke_z,ke2d) = momz(:,ke)
976 temp2_pri(:,ke_z,ke2d) = pres_pri(:,ke) / ( dens0_pri(:,ke_z,ke2d) * rtot_pri(:,ke) )
977 cptot2_pri(:,ke_z,ke2d) = cptot_pri(:,ke)
978 cvtot2_pri(:,ke_z,ke2d) = cvtot_pri(:,ke)
979 rhoe_pri(:,ke_z,ke2d) = temp2_pri(:,ke_z,ke2d) * cvtot_pri(:,ke) * dens0_pri(:,ke_z,ke2d)
980 rhoe2_pri(:,ke_z,ke2d) = rhoe_pri(:,ke_z,ke2d)
982 nz(:,ke_z,ke2d) = lcmesh%normal_fn(:,ke,3)
983 flx_hydro(:,ke_z,ke2d) = 0.0_rp
988 do iq = this%vars%QS+1, this%vars%QE
989 do ke2d = 1, lcmesh%Ne2D
990 do ke_z = 1, lcmesh%NeZ
991 ke = ke2d + (ke_z-1)*lcmesh%Ne2D
992 rhoq2(:,ke_z,ke2d,iq) = dens(:,ke) * qtrc(iq)%ptr%val(:,ke) &
993 + rhoq_t_mp(iq)%ptr%val(:,ke) * this%dtsec
994 rhoq_pri(:,ke_z,ke2d,iq) = dens0_pri(:,ke_z,ke2d) * qtrc_pri(iq)%ptr%val(:,ke) &
995 + rhoq_t_mp(iq)%ptr%val(:,ke) * this%dtsec
996 rhoq2_pri(:,ke_z,ke2d,iq) = rhoq_pri(:,ke_z,ke2d,iq)
1002 sflx_rain(:,:) = 0.0_rp
1003 sflx_snow(:,:) = 0.0_rp
1004 sflx_engi(:,:) = 0.0_rp
1010 do ke2d = 1, lcmesh%Ne2D
1015 do p2d = 1, elem3d%Nnode_h1D**2
1016 colmask(:) = elem3d%Colmask(:,p2d)
1017 do ke_z = 1, lcmesh%NeZ
1018 ke = ke2d + (ke_z-1)*lcmesh%Ne2D
1020 dens2_tmp(:,ke_z) = dens(colmask(:),ke)
1021 ref_dens_tmp(:,ke_z) = dens_hyd(colmask(:),ke)
1022 pres2_tmp(:,ke_z) = pres(colmask(:),ke)
1024 temp2_tmp(:,ke_z) = pres2_tmp(:,ke_z) / ( dens2_tmp(:,ke_z) * rtot(colmask(:),ke) )
1026 do iq = this%vars%QS+1, this%vars%QE
1027 do ke_z = 1, lcmesh%NeZ
1029 rhoq2_tmp(:,ke_z,iq) = rhoq2(colmask(:),ke_z,ke2d,iq)
1033 select case( this%MP_TYPEID )
1035 call atmos_phy_mp_kessler_terminal_velocity( &
1036 elem3d%Nnode_v*lcmesh%NeZ, 1, elem3d%Nnode_v*lcmesh%NeZ, &
1037 dens2_tmp(:,:), rhoq2_tmp(:,:,:), ref_dens_tmp(:,:), &
1039 case( mp_typeid_tomita08 )
1040 call atmos_phy_mp_tomita08_terminal_velocity( &
1041 elem3d%Nnode_v*lcmesh%NeZ, 1, elem3d%Nnode_v*lcmesh%NeZ, &
1042 dens2_tmp(:,:), temp2_tmp(:,:), rhoq2_tmp(:,:,:), &
1044 case( mp_typeid_sn14 )
1045 call atmos_phy_mp_sn14_terminal_velocity( &
1046 elem3d%Nnode_v*lcmesh%NeZ, 1, elem3d%Nnode_v*lcmesh%NeZ, &
1047 dens2_tmp(:,:), temp2_tmp(:,:), rhoq2_tmp(:,:,:), pres2_tmp(:,:), &
1051 do iq = this%vars%QS+1, this%vars%QE
1052 do ke_z = 1, lcmesh%NeZ
1053 vterm(colmask(:),ke_z,ke2d,iq) = vterm_tmp(:,ke_z,iq)
1059 do iq = this%vars%QS+1, this%vars%QE
1060 if ( this%vars%vterm_hist_id(iq) > 0 )
then
1062 do ke2d = 1, lcmesh%Ne2D
1063 do ke_z = 1, lcmesh%NeZ
1064 ke = ke2d + (ke_z-1)*lcmesh%Ne2D
1065 this%vars%vterm_hist(iq)%local(domid)%val(:,ke) = vterm(:,ke_z,ke2d,iq)
1074 do step = 1, this%nstep_sedimentation
1076 if ( lscond_flag )
then
1078 dens2_pri, rhoq2_pri, cptot2_pri, cvtot2_pri, rhoe2_pri, &
1079 sflx_rain, sflx_snow, sflx_engi, &
1080 temp2_pri, this%dtsec_sedimentation, &
1081 this%vars%QE - this%vars%QS, qla, qia, &
1082 lcmesh, elem3d, elem_v1d )
1085 dens2_pri, rhoq2_pri, cptot2_pri, cvtot2_pri, rhoe2_pri, &
1086 flx_hydro, sflx_rain, sflx_snow, sflx_engi, &
1088 this%dtsec_sedimentation, this%rnstep_sedimentation, &
1089 this%Dz, this%Lift, nz, vmapm, vmapp, intweight, &
1090 this%vars%QE - this%vars%QS, qla, qia, &
1095 do ke2d = 1, lcmesh%Ne2D
1096 do ke_z = 1, lcmesh%NeZ
1097 ke = ke2d + (ke_z-1)*lcmesh%Ne2D
1098 temp2_pri(:,ke_z,ke2d) = rhoe2_pri(:,ke_z,ke2d) / ( dens2_pri(:,ke_z,ke2d) * cvtot2_pri(:,ke_z,ke2d) )
1106 sflx_engi(:,:) = sflx_engi(:,:) - sflx_snow(:,:) * lhf
1109 do ke2d = 1, lcmesh%Ne2D
1110 do ke_z = 1, lcmesh%NeZ
1111 ke = ke2d + (ke_z-1)*lcmesh%Ne2D
1112 dens_t_mp(:,ke) = ( dens2_pri(:,ke_z,ke2d) - dens0_pri(:,ke_z,ke2d) ) * rdt_mp
1114 cp_t(:) = ( cptot2_pri(:,ke_z,ke2d) - cptot_pri(:,ke) ) * rdt_mp
1115 cv_t(:) = ( cvtot2_pri(:,ke_z,ke2d) - cvtot_pri(:,ke) ) * rdt_mp
1116 rhoh_mp(:,ke) = rhoh_mp(:,ke) &
1117 + ( rhoe2_pri(:,ke_z,ke2d) - rhoe_pri(:,ke_z,ke2d) ) * rdt_mp &
1119 + log( pres_pri(:,ke) / pre00 ) * ( cvtot_pri(:,ke) / cptot_pri(:,ke) * cp_t(:) - cv_t(:) ) &
1120 ) * pres_pri(:,ke) / rtot_pri(:,ke)
1125 do iq = this%vars%QS+1, this%vars%QE
1126 do ke2d = 1, lcmesh%Ne2D
1127 do ke_z = 1, lcmesh%NeZ
1128 ke = ke2d + (ke_z-1)*lcmesh%Ne2D
1129 rhoq_t_mp(iq)%ptr%val(:,ke) = rhoq_t_mp(iq)%ptr%val(:,ke) &
1130 + ( rhoq2_pri(:,ke_z,ke2d,iq) - rhoq_pri(:,ke_z,ke2d,iq) ) * rdt_mp
1139 if ( lscond_flag )
then
1141 rhou_t_mp, rhov_t_mp, momz_t_mp, &
1142 dens0_pri, rhou2_pri, rhov2_pri, momz2_pri, dens2_pri, &
1143 rdt_mp, lcmesh, elem3d )
1146 rhou_t_mp, rhov_t_mp, momz_t_mp, &
1147 dens0_pri, rhou2_pri, rhov2_pri, momz2_pri, flx_hydro, &
1148 this%Dz, this%Lift, nz, vmapm, vmapp, &
1154 end subroutine atmosphymp_calc_tendency_core
1159 subroutine calc_tendency_kessler( this, &
1160 RHOQ_t_MP, CPtot_t, CVtot_t, RHOE_t, EVAPORATE, & ! (out)
1161 dens, qtrc, pres, dens_hyd, rtot, cvtot, cptot, &
1162 dens_pri, qtrc_pri, &
1163 rdt_mp, lcmesh, elem3d )
1165 use scale_atmos_hydrometeor,
only: &
1167 use scale_atmos_phy_mp_kessler,
only: &
1168 atmos_phy_mp_kessler_adjustment
1175 real(rp),
intent(out) :: cptot_t(elem3d%np,lcmesh%nea)
1176 real(rp),
intent(out) :: cvtot_t(elem3d%np,lcmesh%nea)
1177 real(rp),
intent(out) :: rhoe_t(elem3d%np,lcmesh%nea)
1178 real(rp),
intent(out) :: evaporate(elem3d%np,lcmesh%nea)
1179 real(rp),
intent(in) :: dens(elem3d%np,lcmesh%nea)
1181 real(rp),
intent(in) :: pres(elem3d%np,lcmesh%nea)
1182 real(rp),
intent(in) :: dens_hyd(elem3d%np,lcmesh%nea)
1183 real(rp),
intent(in) :: rtot (elem3d%np,lcmesh%nea)
1184 real(rp),
intent(in) :: cvtot(elem3d%np,lcmesh%nea)
1185 real(rp),
intent(in) :: cptot(elem3d%np,lcmesh%nea)
1187 real(rp),
intent(in) :: dens_pri(elem3d%np,lcmesh%nea)
1188 real(rp),
intent(in) :: rdt_mp
1190 real(rp) :: temp1(elem3d%np,lcmesh%nea)
1191 real(rp) :: cptot1(elem3d%np,lcmesh%nea)
1192 real(rp) :: cvtot1(elem3d%np,lcmesh%nea)
1193 real(rp) :: qtrc1(elem3d%np,lcmesh%nea,this%vars%qs:this%vars%qe)
1198 real(rp) :: rhoq_t(elem3d%np)
1199 real(rp) :: rhoq_pri(elem3d%np)
1200 real(rp) :: rhoq_t_cor(elem3d%np)
1201 real(rp) :: rhoqv_t(elem3d%np,lcmesh%ne)
1206 do ke = lcmesh%NeS, lcmesh%NeE
1207 temp1(:,ke) = pres(:,ke) / ( dens(:,ke) * rtot(:,ke) )
1208 cptot1(:,ke) = cptot(:,ke)
1209 cvtot1(:,ke) = cvtot(:,ke)
1211 rhoqv_t(:,ke) = 0.0_rp
1215 do iq = this%vars%QS, this%vars%QE
1216 do ke = lcmesh%NeS, lcmesh%NeE
1217 qtrc1(:,ke,iq) = qtrc(iq)%ptr%val(:,ke)
1223 call atmos_phy_mp_kessler_adjustment( &
1224 elem3d%Np, 1, elem3d%Np, lcmesh%NeA, lcmesh%NeS, lcmesh%NeE, 1, 1, 1, &
1225 dens, pres, this%dtsec, &
1226 temp1, qtrc1, cptot1, cvtot1, &
1231 do ke = lcmesh%NeS, lcmesh%NeE
1232 do iq = this%vars%QS+1, this%vars%QE
1233 rhoq_t(:) = ( qtrc1(:,ke,iq) - qtrc(iq)%ptr%val(:,ke) ) * dens(:,ke) * rdt_mp
1235 rhoq_pri(:) = dens_pri(:,ke) * qtrc_pri(iq)%ptr%val(:,ke)
1236 rhoq_t_cor(:) = max( rhoq_t(:), - rhoq_pri(:) * rdt_mp )
1238 rhoqv_t(:,ke) = rhoqv_t(:,ke) - rhoq_t_cor(:)
1239 rhoe_t(:,ke) = rhoe_t(:,ke) + lhv * ( rhoq_t_cor(:) - rhoq_t(:) )
1240 rhoq_t_mp(iq)%ptr%val(:,ke) = rhoq_t_cor(:)
1245 do ke = lcmesh%NeS, lcmesh%NeE
1246 rhoq_t_mp(this%vars%QS)%ptr%val(:,ke) = rhoqv_t(:,ke)
1248 cptot_t(:,ke) = ( cptot1(:,ke) - cptot(:,ke) ) * rdt_mp
1249 cvtot_t(:,ke) = ( cvtot1(:,ke) - cvtot(:,ke) ) * rdt_mp
1254 end subroutine calc_tendency_kessler
1259 subroutine calc_tendency_tomita08( this, &
1260 RHOQ_t_MP, CPtot_t, CVtot_t, RHOE_t, EVAPORATE, & ! (out)
1261 dens, qtrc, pres, dens_hyd, rtot, cvtot, cptot, &
1262 rdt_mp, lcmesh, elem3d )
1264 use scale_const,
only: &
1265 undef => const_undef
1266 use scale_atmos_phy_mp_tomita08,
only: &
1267 atmos_phy_mp_tomita08_adjustment
1274 real(rp),
intent(out) :: cptot_t(elem3d%np,lcmesh%nea)
1275 real(rp),
intent(out) :: cvtot_t(elem3d%np,lcmesh%nea)
1276 real(rp),
intent(out) :: rhoe_t(elem3d%np,lcmesh%nea)
1277 real(rp),
intent(out) :: evaporate(elem3d%np,lcmesh%nea)
1278 real(rp),
intent(in) :: dens(elem3d%np,lcmesh%nea)
1280 real(rp),
intent(in) :: pres(elem3d%np,lcmesh%nea)
1281 real(rp),
intent(in) :: dens_hyd(elem3d%np,lcmesh%nea)
1282 real(rp),
intent(in) :: rtot (elem3d%np,lcmesh%nea)
1283 real(rp),
intent(in) :: cvtot(elem3d%np,lcmesh%nea)
1284 real(rp),
intent(in) :: cptot(elem3d%np,lcmesh%nea)
1285 real(rp),
intent(in) :: rdt_mp
1287 real(rp) :: dens_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1288 real(rp) :: pres_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1289 real(rp) :: ccn_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1290 real(rp) :: temp1_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1291 real(rp) :: cptot1_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1292 real(rp) :: cvtot1_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1293 real(rp) :: qtrc1_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d,this%vars%qs:this%vars%qe)
1294 real(rp) :: rhoe_t_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1295 real(rp) :: evaporate_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1297 integer :: ke, ke_xy, ke_z
1298 integer :: p,p_xy, p_z
1303 do ke_z=1, lcmesh%NeZ
1304 do ke_xy=1, lcmesh%Ne2D
1305 ke = ke_xy + (ke_z-1)*lcmesh%Ne2D
1306 do p_z=1, elem3d%Nnode_v
1307 do p_xy=1, elem3d%Nnode_h1D**2
1308 p = p_xy + (p_z-1)*elem3d%Nnode_h1D**2
1309 dens_z(p_z,ke_z,p_xy,ke_xy) = dens(p,ke)
1310 pres_z(p_z,ke_z,p_xy,ke_xy) = pres(p,ke)
1311 temp1_z(p_z,ke_z,p_xy,ke_xy) = pres(p,ke) / ( dens(p,ke) * rtot(p,ke) )
1312 cptot1_z(p_z,ke_z,p_xy,ke_xy) = cptot(p,ke)
1313 cvtot1_z(p_z,ke_z,p_xy,ke_xy) = cvtot(p,ke)
1315 ccn_z(p_z,ke_z,p_xy,ke_xy) = undef
1318 do iq = this%vars%QS, this%vars%QE
1319 do p_z=1, elem3d%Nnode_v
1320 do p_xy=1, elem3d%Nnode_h1D**2
1321 p = p_xy + (p_z-1)*elem3d%Nnode_h1D**2
1322 qtrc1_z(p_z,ke_z,p_xy,ke_xy,iq) = qtrc(iq)%ptr%val(p,ke)
1329 call atmos_phy_mp_tomita08_adjustment( &
1330 elem3d%Nnode_v*lcmesh%NeZ, 1, elem3d%Nnode_v*lcmesh%NeZ, elem3d%Nnode_h1D**2, 1, elem3d%Nnode_h1D**2, lcmesh%Ne2D, 1, lcmesh%Ne2D, &
1331 dens_z, pres_z, ccn_z, this%dtsec, &
1332 temp1_z, qtrc1_z, cptot1_z, cvtot1_z, &
1333 rhoe_t_z, evaporate_z )
1336 do ke_z=1, lcmesh%NeZ
1337 do ke_xy=1, lcmesh%Ne2D
1338 ke = ke_xy + (ke_z-1)*lcmesh%Ne2D
1339 do p_z=1, elem3d%Nnode_v
1340 do p_xy=1, elem3d%Nnode_h1D**2
1341 p = p_xy + (p_z-1)*elem3d%Nnode_h1D**2
1342 cptot_t(p,ke) = ( cptot1_z(p_z,ke_z,p_xy,ke_xy) - cptot(p,ke) ) * rdt_mp
1343 cvtot_t(p,ke) = ( cvtot1_z(p_z,ke_z,p_xy,ke_xy) - cvtot(p,ke) ) * rdt_mp
1344 rhoe_t(p,ke) = rhoe_t_z(p_z,ke_z,p_xy,ke_xy)
1345 evaporate(p,ke) = evaporate_z(p_z,ke_z,p_xy,ke_xy)
1348 do iq = this%vars%QS, this%vars%QE
1349 do p_z=1, elem3d%Nnode_v
1350 do p_xy=1, elem3d%Nnode_h1D**2
1351 p = p_xy + (p_z-1)*elem3d%Nnode_h1D**2
1352 rhoq_t_mp(iq)%ptr%val(p,ke) = ( qtrc1_z(p_z,ke_z,p_xy,ke_xy,iq) - qtrc(iq)%ptr%val(p,ke) ) * dens(p,ke) * rdt_mp
1360 end subroutine calc_tendency_tomita08
1365 subroutine calc_tendency_sn14( this, &
1366 RHOQ_t_MP, CPtot_t, CVtot_t, RHOE_t, EVAPORATE, & ! (out)
1367 dens, qtrc, pres, dens_hyd, rtot, cvtot, cptot, &
1368 rdt_mp, lcmesh, elem3d )
1370 use scale_const,
only: &
1371 undef => const_undef
1372 use scale_atmos_phy_mp_sn14,
only: &
1373 atmos_phy_mp_sn14_tendency
1380 real(rp),
intent(out) :: cptot_t(elem3d%np,lcmesh%nea)
1381 real(rp),
intent(out) :: cvtot_t(elem3d%np,lcmesh%nea)
1382 real(rp),
intent(out) :: rhoe_t(elem3d%np,lcmesh%nea)
1383 real(rp),
intent(out) :: evaporate(elem3d%np,lcmesh%nea)
1384 real(rp),
intent(in) :: dens(elem3d%np,lcmesh%nea)
1386 real(rp),
intent(in) :: pres(elem3d%np,lcmesh%nea)
1387 real(rp),
intent(in) :: dens_hyd(elem3d%np,lcmesh%nea)
1388 real(rp),
intent(in) :: rtot (elem3d%np,lcmesh%nea)
1389 real(rp),
intent(in) :: cvtot(elem3d%np,lcmesh%nea)
1390 real(rp),
intent(in) :: cptot(elem3d%np,lcmesh%nea)
1391 real(rp),
intent(in) :: rdt_mp
1393 real(rp) :: dens_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1394 real(rp) :: pres_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1395 real(rp) :: ccn_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1396 real(rp) :: temp1_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1397 real(rp) :: cptot1_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1398 real(rp) :: cvtot1_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1399 real(rp) :: qtrc1_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d,this%vars%qs:this%vars%qe)
1400 real(rp) :: rhoq_t_mp_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d,this%vars%qs:this%vars%qe)
1401 real(rp) :: rhoe_t_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1402 real(rp) :: evaporate_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1403 real(rp) :: cptot_t_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1404 real(rp) :: cvtot_t_z(elem3d%nnode_v,lcmesh%nez,elem3d%nnode_h1d**2,lcmesh%ne2d)
1406 integer :: ke, ke_xy, ke_z
1407 integer :: p,p_xy, p_z
1412 do ke_z=1, lcmesh%NeZ
1413 do ke_xy=1, lcmesh%Ne2D
1414 ke = ke_xy + (ke_z-1)*lcmesh%Ne2D
1415 do p_z=1, elem3d%Nnode_v
1416 do p_xy=1, elem3d%Nnode_h1D**2
1417 p = p_xy + (p_z-1)*elem3d%Nnode_h1D**2
1418 dens_z(p_z,ke_z,p_xy,ke_xy) = dens(p,ke)
1419 pres_z(p_z,ke_z,p_xy,ke_xy) = pres(p,ke)
1420 temp1_z(p_z,ke_z,p_xy,ke_xy) = pres(p,ke) / ( dens(p,ke) * rtot(p,ke) )
1421 cptot1_z(p_z,ke_z,p_xy,ke_xy) = cptot(p,ke)
1422 cvtot1_z(p_z,ke_z,p_xy,ke_xy) = cvtot(p,ke)
1424 ccn_z(p_z,ke_z,p_xy,ke_xy) = undef
1427 do iq = this%vars%QS, this%vars%QE
1428 do p_z=1, elem3d%Nnode_v
1429 do p_xy=1, elem3d%Nnode_h1D**2
1430 p = p_xy + (p_z-1)*elem3d%Nnode_h1D**2
1431 qtrc1_z(p_z,ke_z,p_xy,ke_xy,iq) = qtrc(iq)%ptr%val(p,ke)
1445 do ke_z=1, lcmesh%NeZ
1446 do ke_xy=1, lcmesh%Ne2D
1447 ke = ke_xy + (ke_z-1)*lcmesh%Ne2D
1448 do p_z=1, elem3d%Nnode_v
1449 do p_xy=1, elem3d%Nnode_h1D**2
1450 p = p_xy + (p_z-1)*elem3d%Nnode_h1D**2
1451 cptot_t(p,ke) = cptot_t_z(p_z,ke_z,p_xy,ke_xy)
1452 cvtot_t(p,ke) = cvtot_t_z(p_z,ke_z,p_xy,ke_xy)
1455 do iq = this%vars%QS, this%vars%QE
1456 do p_z=1, elem3d%Nnode_v
1457 do p_xy=1, elem3d%Nnode_h1D**2
1458 p = p_xy + (p_z-1)*elem3d%Nnode_h1D**2
1459 rhoq_t_mp(iq)%ptr%val(p,ke) = rhoq_t_mp_z(p_z,ke_z,p_xy,ke_xy,iq)
1467 end subroutine calc_tendency_sn14
1472 subroutine calc_tendency_lscond( this, &
1473 RHOQ_t_MP, CPtot_t, CVtot_t, RHOE_t, EVAPORATE, & ! (out)
1474 dens, qtrc, pres, dens_hyd, rtot, cvtot, cptot, &
1476 rdt_mp, lcmesh, elem3d )
1486 real(rp),
intent(out) :: cptot_t(elem3d%np,lcmesh%nea)
1487 real(rp),
intent(out) :: cvtot_t(elem3d%np,lcmesh%nea)
1488 real(rp),
intent(out) :: rhoe_t(elem3d%np,lcmesh%nea)
1489 real(rp),
intent(out) :: evaporate(elem3d%np,lcmesh%nea)
1490 real(rp),
intent(in) :: dens(elem3d%np,lcmesh%nea)
1492 real(rp),
intent(in) :: pres(elem3d%np,lcmesh%nea)
1493 real(rp),
intent(in) :: dens_hyd(elem3d%np,lcmesh%nea)
1494 real(rp),
intent(in) :: rtot (elem3d%np,lcmesh%nea)
1495 real(rp),
intent(in) :: cvtot(elem3d%np,lcmesh%nea)
1496 real(rp),
intent(in) :: cptot(elem3d%np,lcmesh%nea)
1497 logical,
intent(in) :: cp_mask(elem3d%np,lcmesh%ne)
1498 real(rp),
intent(in) :: rdt_mp
1500 real(rp) :: temp1(elem3d%np,lcmesh%nea)
1501 real(rp) :: cptot1(elem3d%np,lcmesh%nea)
1502 real(rp) :: cvtot1(elem3d%np,lcmesh%nea)
1503 real(rp) :: dqc_cp(elem3d%np,lcmesh%nea)
1504 real(rp) :: qtrc1(elem3d%np,lcmesh%nea,this%vars%qs:this%vars%qe)
1509 real(rp) :: sw(elem3d%np,lcmesh%ne)
1514 do ke = lcmesh%NeS, lcmesh%NeE
1515 temp1(:,ke) = pres(:,ke) / ( dens(:,ke) * rtot(:,ke) )
1516 cptot1(:,ke) = cptot(:,ke)
1517 cvtot1(:,ke) = cvtot(:,ke)
1521 if ( this%CP_flag )
then
1523 do ke = lcmesh%NeS, lcmesh%NeE
1524 where (cp_mask(:,ke))
1530 do iq = this%vars%QS, this%vars%QE
1531 do ke = lcmesh%NeS, lcmesh%NeE
1532 qtrc1(:,ke,iq) = qtrc(iq)%ptr%val(:,ke)
1539 elem3d%Np, 1, elem3d%Np, lcmesh%NeA, lcmesh%NeS, lcmesh%NeE, 1, 1, 1, &
1540 dens, pres, this%dtsec, &
1541 temp1, qtrc1, cptot1, cvtot1, &
1546 do iq = this%vars%QS, this%vars%QE
1547 do ke = lcmesh%NeS, lcmesh%NeE
1548 rhoq_t_mp(iq)%ptr%val(:,ke) = sw(:,ke) * ( qtrc1(:,ke,iq) - qtrc(iq)%ptr%val(:,ke) ) * dens(:,ke) * rdt_mp
1553 do ke = lcmesh%NeS, lcmesh%NeE
1554 cptot_t(:,ke) = sw(:,ke) * ( cptot1(:,ke) - cptot(:,ke) ) * rdt_mp
1555 cvtot_t(:,ke) = sw(:,ke) * ( cvtot1(:,ke) - cvtot(:,ke) ) * rdt_mp
1557 rhoe_t(:,ke) = sw(:,ke) * rhoe_t(:,ke)
1563 end subroutine calc_tendency_lscond
1566 subroutine atmosphymp_create_postfilter( this, FilterMat, &
1567 MFilter, Gsqrt, Np )
1570 integer,
intent(in) :: np
1571 real(rp),
intent(out) :: filtermat(np,np)
1572 real(rp),
intent(in) :: mfilter(np,np)
1573 real(rp),
intent(in) :: gsqrt(np)
1578 filtermat(:,:) = mfilter(:,:)
1580 filtermat(:,p) = filtermat(:,p) * gsqrt(p)
1583 filtermat(p,:) = filtermat(p,:) / gsqrt(p)
1586 end subroutine atmosphymp_create_postfilter
module Atmosphere / Physics / Cumulus Parameterization
integer, parameter, public atmos_phy_cp_rhot_t_id
module Atmosphere / Physics / Cloud Microphysics
subroutine, public atmosphympvars_getlocalmeshfields_tend(domid, mesh, mp_tends_list, mp_dens_t, mp_momx_t, mp_momy_t, mp_momz_t, mp_rhot_t, mp_rhoh, mp_evap, mp_rhoq_t, lcmesh3d)
subroutine, public atmosphympvars_getlocalmeshfields_sfcflx(domid, mesh, sfcflx_list, sflx_rain, sflx_snow, sflx_engi)
integer, parameter, public atmos_phy_mp_rhoh_id
module Atmosphere / Physics / cloud microphysics
integer, parameter mp_typeid_kessler
Type ID of a 3-class 1 moment bulk scheme (Kessler, 1969)
module Atmosphere / Variables
subroutine, public atmosvars_getlocalmeshphytends(domid, mesh, phytends_list, dens_tp, momx_tp, momy_tp, momz_tp, rhot_tp, rhoh_p, rhoq_tp, lcmesh3d)
integer, parameter, public atm_vars_container_primary_id
subroutine, public atmosvars_getlocalmeshphyauxvars(domid, mesh, phyauxvars_list, pres, pt, lcmesh3d)
subroutine, public atmosvars_getlocalmeshprgvars(domid, mesh, prgvars_list, auxvars_list, ddens, momx, momy, momz, therm, dens_hyd, pres_hyd, rtot, cvtot, cptot, lcmesh3d)
subroutine, public atmosvars_getlocalmeshqtrcvarlist(domid, mesh, trcvars_list, varid_s, var_list, lcmesh3d)
module Atmosphere / Variables
module FElib / Atmosphere / Physics cloud microphysics / common
subroutine, public atm_phy_mp_dgm_common_gen_intweight(intweight, lcmesh)
subroutine, public atm_phy_mp_dgm_common_precipitation(dens, rhoq, cptot, cvtot, rhoe, flx_hydro, sflx_rain, sflx_snow, esflx, temp, vterm, dt, rnstep, dz, lift, nz, vmapm, vmapp, intweight, qha, qla, qia, lcmesh, elem)
subroutine, public atm_phy_mp_dgm_common_precipitation_momentum(momu_t, momv_t, momz_t, dens, momu, momv, momz, mflx, dz, lift, nz, vmapm, vmapp, lcmesh, elem)
module FElib / Atmosphere / Physics cloud microphysics / Large-scale condensation
subroutine, public atmos_phy_mp_lscond_adjustment(ka, ks, ke, ia, is, ie, ja, js, je, dens, pres, dt, temp, qtrc, cptot, cvtot, rhoe_t, evaporate)
Calculate a state after the saturation process.
integer, parameter, public atmos_phy_mp_lscond_ntracers
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_lscond_tracer_units
character(len=h_mid), dimension(qa_mp), parameter, public atmos_phy_mp_lscond_tracer_descriptions
subroutine, public atmos_phy_mp_lscond_setup
Setup a module for a large-scale condensation scheme.
character(len=h_short), dimension(qa_mp), parameter, public atmos_phy_mp_lscond_tracer_names
subroutine, public atmos_phy_mp_lscond_precipitation(dens, rhoq, cptot, cvtot, rhoe, sflx_rain, sflx_snow, esflx, temp, dt, qha, qla, qia, lcmesh, elem, elem1d)
Calculate a state after the precipitation process.
integer, parameter, public atmos_phy_mp_lscond_nices
subroutine, public atmos_phy_mp_lscond_precipitation_momentum(momu_t, momv_t, momz_t, dens, momu, momv, momz, dens_new, rdt_mp, lcmesh, elem)
Calculate a tendency of momentum due to the precipitation process.
integer, parameter, public atmos_phy_mp_lscond_nwaters
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Element / line
module FElib / Element/ ModalFilter
module FElib / Element / Quadrilateral
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
module FElib / Mesh / Local, Base
module FElib / Data / base
module FElib / Mesh / Base 2D
module FElib / Mesh / Base 3D
module FElib / Mesh / Base
module FElib / Data / base
module FElib / Data / Filter operation
FElib / model framework / physics process.
FElib / model framework / mesh manager.
FElib / model framework / variable manager.
Module common / sparsemat.
Derived type to manage a computational mesh (base class)
Derived type to manage a component of cloud microphysics.
Derived type to manage variables with cloud microphysics component.
Derived type to manage a set of variables (prognostic variables, tracer variables,...
Derived type representing a 1D reference element.
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing an arbitrary finite element.
Derived type representing a hexahedral element.
Derived type representing a line element.
Derived type representing a modal filter.
Derived type representing a quadrilateral element.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local 3D computational domain.
Derived type to manage a local computational domain (base type)
Derived type representing a field with local mesh (base type)
Derived type to manage a computational mesh (base type for 2D domain)
Derived type to manage a computational mesh (base type for 3D domain)
Base type to manage a computational mesh.
Derived type representing a field with 3D mesh.
Derived type representing a field (base type)
Derived type to represent filter operation for 3D mesh field.
Derived type to manage a sparse matrix.