11#include "scaleFElib.h"
20 use scale_tracer,
only: qa
69 integer :: prog_vars_commid
74 integer :: qtrc_vars_commid
79 integer :: aux_vars_commid
88 integer :: phytends_commid
89 integer :: phytend_num_tot
92 integer :: container_type
93 integer :: phy_preproc_operation_type
97 procedure :: init => atmosvarscontainer_init
98 procedure :: final => atmosvarscontainer_final
99 procedure :: calc_diagnostics => atmosvarscontainer_calculatediagnostics
100 procedure :: calc_diagvar => atmosvarscontainer_calcdiagvar
101 procedure :: calc_specificheat => atmosvarscontainer_calc_specific_heat
102 procedure :: preproc_operation_for_phys => atmosvarscontainer_physics_preoperation
104 procedure,
private :: setup_phys_preoperation
127 private :: vars_calc_diagnosevar_lc
137 variableinfo(
atmos_auxvars2d_prec_id ,
'PREC',
'surface precipitaion flux' ,
'kg/m2/s', 2,
'XY',
'precipitation_flux' ), &
141 integer,
parameter :: phy_preoperation_typeid_none = 0
142 integer,
parameter :: phy_preoperation_typeid_modalfilter = 1
143 integer,
parameter :: phy_preoperation_typeid_globalfilter = 2
149 subroutine atmosvarscontainer_init( this, &
150 container_type, phy_preproc_file_basename, &
152 use scale_const,
only: &
154 use scale_tracer,
only: &
155 tracer_name, tracer_desc, tracer_unit
162 integer,
intent(in) :: container_type
163 character(len=*),
intent(in) :: phy_preproc_file_basename
164 class(
atmosmesh),
target,
intent(inout) :: atm_mesh
170 logical :: do_setup_phytend
171 logical :: do_setup_auxvar2d
172 logical :: reg_file_hist
179 do_setup_auxvar2d = .true.
180 do_setup_phytend = .true.
181 reg_file_hist = .true.
183 do_setup_auxvar2d = .false.
184 do_setup_phytend = .false.
185 reg_file_hist = .false.
188 this%mesh => atm_mesh
189 mesh3d => atm_mesh%ptr_mesh
190 call mesh3d%GetMesh2D( mesh2d )
193 call this%PROGVARS_manager%Init()
194 call this%QTRCVARS_manager%Init()
195 call this%AUXVARS_manager%Init()
198 allocate( this%QTRC_VARS(0:qa) )
202 if ( do_setup_phytend )
then
203 call this%PHYTENDS_manager%Init()
205 this%PHYTEND_NUM_TOT = phytend_num1 + max(1,qa)
206 allocate( this%PHY_TEND(this%PHYTEND_NUM_TOT) )
211 this%PROG_VARS, this%QTRC_VARS, this%AUX_VARS, this%PHY_TEND, &
212 this%PROGVARS_manager, this%QTRCVARS_manager, this%AUXVARS_manager, this%PHYTENDS_manager, &
213 reg_file_hist, do_setup_phytend, this%PHYTEND_NUM_TOT, mesh3d, &
218 call atm_mesh%Create_communicator( &
220 this%PROGVARS_manager, &
222 this%PROG_VARS_commID )
226 call atm_mesh%Create_communicator( &
228 this%QTRCVARS_manager, &
229 this%QTRC_VARS(1:qa), &
230 this%QTRC_VARS_commID )
233 call atm_mesh%Create_communicator( &
235 this%AUXVARS_manager, &
237 this%AUX_VARS_commID )
243 log_info(
"ATMOS_vars_setup",*)
'List of prognostic variables (ATMOS) '
244 log_info_cont(
'(1x,A,A24,A,A48,A,A12,A)') &
245 ' |',
'VARNAME ',
'|', &
246 'DESCRIPTION ',
'[',
'UNIT ',
']'
248 log_info_cont(
'(1x,A,I3,A,A24,A,A48,A,A12,A)') &
249 'NO.',iv,
'|',prgvar_info(iv)%NAME,
'|', prgvar_info(iv)%DESC,
'[', prgvar_info(iv)%UNIT,
']'
252 log_info_cont(
'(1x,A,I3,A,A24,A,A48,A,A12,A)') &
253 'NO.',
prgvar_num+iv,
'|',tracer_name(iv),
'|', tracer_desc(iv),
'[', tracer_unit(iv),
']'
259 if ( do_setup_auxvar2d )
then
260 call this%AUXVARS2D_manager%Init()
265 call this%AUXVARS2D_manager%Regist( &
267 this%AUX_VARS2D(iv), &
269 do idom=1, mesh2d%LOCAL_MESH_NUM
270 this%AUX_VARS2D(iv)%local(idom)%val(:,:) = undef
276 this%container_type = container_type
277 call this%Setup_phys_preoperation( phy_preproc_file_basename, mesh3d, mesh3d%refElem3D )
280 end subroutine atmosvarscontainer_init
284 subroutine atmosvarscontainer_final( this )
291 call this%PROGVARS_manager%Final()
292 deallocate( this%PROG_VARS )
294 call this%QTRCVARS_manager%Final()
295 deallocate( this%QTRC_VARS )
297 call this%AUXVARS_manager%Final()
298 deallocate( this%AUX_VARS )
303 call this%PHYTENDS_manager%Final()
304 deallocate( this%PHY_TEND )
306 call this%AUXVARS2D_manager%Final()
307 deallocate( this%AUX_VARS2D )
310 call this%phy_preproc%Final()
314 end subroutine atmosvarscontainer_final
318 subroutine atmosvarscontainer_calculatediagnostics( this )
319 use scale_const,
only: &
320 rdry => const_rdry, &
321 cpdry => const_cpdry, &
322 cvdry => const_cvdry, &
323 pres00 => const_pre00
324 use scale_tracer,
only: &
325 tracer_mass, tracer_r, tracer_cv, tracer_cp
326 use scale_atmos_thermodyn,
only: &
327 atmos_thermodyn_specific_heat
342 call this%Calc_SpecificHeat()
345 do varid=auxvar_thermhydro_id+1, auxvar_pt_id
346 field => this%AUX_VARS(varid)
347 do n=1, field%mesh%LOCAL_MESH_NUM
349 field%mesh, this%QTRCVARS_manager, &
352 elem3d => lcmesh3d%refElem3D
354 call vars_calc_diagnosevar_lc( &
355 field%varname, field%local(n)%val, &
356 this%PROG_VARS(prgvar_ddens_id)%local(n)%val, &
357 this%PROG_VARS(prgvar_momx_id)%local(n)%val, &
358 this%PROG_VARS(prgvar_momy_id)%local(n)%val, &
359 this%PROG_VARS(prgvar_momz_id)%local(n)%val, &
360 this%AUX_VARS(auxvar_pres_id)%local(n)%val, &
361 this%AUX_VARS(auxvar_qdry_id)%local(n)%val, &
363 this%AUX_VARS(auxvar_denshydro_id)%local(n)%val, &
364 this%AUX_VARS(auxvar_preshydro_id)%local(n)%val, &
365 this%AUX_VARS(auxvar_rtot_id )%local(n)%val, &
366 this%AUX_VARS(auxvar_cvtot_id)%local(n)%val, &
367 this%AUX_VARS(auxvar_cptot_id)%local(n)%val, &
368 lcmesh3d, lcmesh3d%refElem3D )
374 end subroutine atmosvarscontainer_calculatediagnostics
378 subroutine atmosvarscontainer_calcdiagvar( this, field_name, field_work )
379 use scale_const,
only: &
380 rdry => const_rdry, &
381 cpdry => const_cpdry, &
382 cvdry => const_cvdry, &
383 pres00 => const_pre00
384 use scale_tracer,
only: &
385 tracer_mass, tracer_r, tracer_cv, tracer_cp
386 use scale_atmos_thermodyn,
only: &
387 atmos_thermodyn_specific_heat
391 character(*),
intent(in) :: field_name
405 if ( field_name ==
'Umet' )
then
406 is_uvmet = .true.; uvmet_i = 1
407 else if ( field_name ==
'Vmet' )
then
408 is_uvmet = .true.; uvmet_i = 2
411 field_work%varname = field_name
413 do n=1, field_work%mesh%LOCAL_MESH_NUM
415 field_work%mesh, this%QTRCVARS_manager, &
418 if ( .not. is_uvmet )
then
419 call vars_calc_diagnosevar_lc( field_name, field_work%local(n)%val, &
420 this%PROG_VARS(prgvar_ddens_id)%local(n)%val, &
421 this%PROG_VARS(prgvar_momx_id)%local(n)%val, &
422 this%PROG_VARS(prgvar_momy_id)%local(n)%val, &
423 this%PROG_VARS(prgvar_momz_id)%local(n)%val, &
424 this%AUX_VARS(auxvar_pres_id)%local(n)%val, &
425 this%AUX_VARS(auxvar_qdry_id)%local(n)%val, &
427 this%AUX_VARS(auxvar_denshydro_id)%local(n)%val, &
428 this%AUX_VARS(auxvar_preshydro_id)%local(n)%val, &
429 this%AUX_VARS(auxvar_rtot_id )%local(n)%val, &
430 this%AUX_VARS(auxvar_cvtot_id)%local(n)%val, &
431 this%AUX_VARS(auxvar_cptot_id)%local(n)%val, &
432 lcmesh3d, lcmesh3d%refElem3D )
434 call field_work_uvmet(1)%Init(
'Umet',
'', field_work%mesh )
435 call field_work_uvmet(2)%Init(
'Vmet',
'', field_work%mesh )
437 call this%mesh%Calc_UVmet( &
438 this%PROG_VARS(prgvar_momx_id), this%PROG_VARS(prgvar_momy_id), &
439 field_work_uvmet(1), field_work_uvmet(2) )
440 call momtovel( field_work%local(n)%val, &
441 field_work_uvmet(uvmet_i)%local(n)%val, &
442 this%PROG_VARS(prgvar_ddens_id)%local(n)%val, &
443 this%AUX_VARS(auxvar_denshydro_id)%local(n)%val, &
444 lcmesh3d, lcmesh3d%refElem3D )
446 call field_work_uvmet(1)%Final()
447 call field_work_uvmet(2)%Final()
454 mom, ddens, dens_hyd, lmesh, elem )
458 real(RP),
intent(inout) :: vel(elem%Np,lmesh%NeA)
459 real(RP),
intent(in) :: mom(elem%Np,lmesh%NeA)
460 real(RP),
intent(in) :: ddens(elem%Np,lmesh%NeA)
461 real(RP),
intent(in) :: dens_hyd(elem%Np,lmesh%NeA)
468 do ke =lmesh%NeS, lmesh%NeE
470 vel(p,ke) = mom(p,ke) / ( ddens(p,ke) + dens_hyd(p,ke) )
476 end subroutine atmosvarscontainer_calcdiagvar
480 subroutine atmosvarscontainer_calc_specific_heat( this )
481 use scale_const,
only: &
482 rdry => const_rdry, &
483 cpdry => const_cpdry, &
484 cvdry => const_cvdry, &
485 pres00 => const_pre00
486 use scale_tracer,
only: &
487 tracer_mass, tracer_r, tracer_cv, tracer_cp
488 use scale_atmos_thermodyn,
only: &
489 atmos_thermodyn_specific_heat
501 real(RP),
allocatable :: q_tmp(:,:)
506 mesh3d => this%AUX_VARS(1)%mesh
509 do n=1, mesh3d%LOCAL_MESH_NUM
510 lcmesh3d => mesh3d%lcmesh_list(n)
511 elem3d => lcmesh3d%refElem3D
514 allocate( q_tmp(elem3d%Np,qa) )
517 mesh3d, this%QTRCVARS_manager, &
525 qdry => this%AUX_VARS(auxvar_qdry_id )%local(n)
526 rtot => this%AUX_VARS(auxvar_rtot_id )%local(n)
527 cvtot => this%AUX_VARS(auxvar_cvtot_id)%local(n)
528 cptot => this%AUX_VARS(auxvar_cptot_id)%local(n)
533 do ke = lcmesh3d%NeS, lcmesh3d%NeE
537 q_tmp(p,iq) = qtrc(iq)%ptr%val(p,ke)
541 call atmos_thermodyn_specific_heat( &
542 elem3d%Np, 1, elem3d%Np, qa, &
543 q_tmp, tracer_mass, tracer_r, tracer_cv, tracer_cp, &
544 qdry%val(:,ke), rtot%val(:,ke), cvtot%val(:,ke), cptot%val(:,ke) )
550 end subroutine atmosvarscontainer_calc_specific_heat
554 subroutine atmosvarscontainer_physics_preoperation( this, &
555 container_ori, dyncore )
560 use scale_atmos_hydrometeor,
only: &
572 character(len=H_SHORT) :: varname_ori
573 character(len=H_SHORT) :: typeid_s
577 integer :: trcid_list(QA)
583 log_info(
"AtmosVarsContainer_physics_preoperation",*)
"..."
585 call this%phy_preproc%Operate( this%PROG_VARS, this%QTRC_VARS, this%AUX_VARS, &
586 container_ori%PROG_VARS, container_ori%QTRC_VARS, container_ori%AUX_VARS )
588 call this%Calc_SpecificHeat()
590 call dyncore%update_therm_hyd( this%AUXVARS_manager )
591 call dyncore%calc_pressure( this%AUX_VARS(auxvar_pres_id), &
592 this%PROGVARS_manager, this%AUXVARS_manager )
599 mesh3d => this%AUX_VARS(1)%mesh
600 do n=1, mesh3d%LOCAL_MESH_NUM
601 call this%QTRCVARS_manager%GetLocalMeshFieldList( trcid_list, n, lc_qtrc )
603 lcmesh3d => mesh3d%lcmesh_list(n)
605 lc_qtrc, this%PROG_VARS(prgvar_ddens_id)%local(n)%val, this%AUX_VARS(auxvar_pres_id)%local(n)%val, &
606 this%AUX_VARS(auxvar_cvtot_id)%local(n)%val, this%AUX_VARS(auxvar_cptot_id)%local(n)%val, &
607 this%AUX_VARS(auxvar_rtot_id)%local(n)%val, &
608 this%AUX_VARS(auxvar_denshydro_id)%local(n)%val, this%AUX_VARS(auxvar_preshydro_id)%local(n)%val, &
609 1.0_rp, lcmesh3d, lcmesh3d%refElem3D, qa, qla, qia )
613 call this%Calc_diagnostics()
617 write(typeid_s,
'(I2.2)') this%container_type
618 varname_ori = this%PROG_VARS(prgvar_ddens_id)%varname
619 this%PROG_VARS(prgvar_ddens_id)%varname = trim(varname_ori) //
"_"//trim(typeid_s)
621 this%PROG_VARS(prgvar_ddens_id)%varname = varname_ori
623 varname_ori = this%AUX_VARS(auxvar_pres_id)%varname
624 this%AUX_VARS(auxvar_pres_id)%varname = trim(varname_ori) //
"_"//trim(typeid_s)
626 this%AUX_VARS(auxvar_pres_id)%varname = varname_ori
629 varname_ori = this%QTRC_VARS(iv)%varname
630 this%QTRC_VARS(iv)%varname = trim(varname_ori) //
"_"//trim(typeid_s)
632 this%QTRC_VARS(iv)%varname = varname_ori
636 end subroutine atmosvarscontainer_physics_preoperation
643 var, DENS_hyd, PRES_hyd, lcmesh3D )
647 integer,
intent(in) :: domid
651 integer,
intent(in) :: varid
654 class(
localmesh3d),
pointer,
intent(out),
optional :: lcmesh3d
661 call prgvars_list%Get(varid, field)
662 call field%GetLocalMeshField(domid, var)
664 if (
present(dens_hyd))
then
665 call auxvars_list%Get(auxvar_denshydro_id, field)
666 call field%GetLocalMeshField(domid, dens_hyd)
668 if (
present(pres_hyd))
then
669 call auxvars_list%Get(auxvar_preshydro_id, field)
670 call field%GetLocalMeshField(domid, pres_hyd)
673 if (
present(lcmesh3d))
then
674 call mesh%GetLocalMesh( domid, lcmesh )
679 if (
present(lcmesh3d)) lcmesh3d => lcmesh
688 DDENS, MOMX, MOMY, MOMZ, THERM, &
689 DENS_hyd, PRES_hyd, Rtot, CVtot, CPtot, &
692 integer,
intent(in) :: domid
699 class(
localmesh3d),
pointer,
intent(out),
optional :: lcmesh3d
706 call prgvars_list%Get(prgvar_ddens_id, field)
707 call field%GetLocalMeshField(domid, ddens)
709 call prgvars_list%Get(prgvar_momx_id, field)
710 call field%GetLocalMeshField(domid, momx)
712 call prgvars_list%Get(prgvar_momy_id, field)
713 call field%GetLocalMeshField(domid, momy)
715 call prgvars_list%Get(prgvar_momz_id, field)
716 call field%GetLocalMeshField(domid, momz)
718 call prgvars_list%Get(prgvar_therm_id, field)
719 call field%GetLocalMeshField(domid, therm)
722 call auxvars_list%Get(auxvar_denshydro_id, field)
723 call field%GetLocalMeshField(domid, dens_hyd)
725 call auxvars_list%Get(auxvar_preshydro_id, field)
726 call field%GetLocalMeshField(domid, pres_hyd)
728 call auxvars_list%Get(auxvar_rtot_id, field)
729 call field%GetLocalMeshField(domid, rtot)
731 call auxvars_list%Get(auxvar_cvtot_id, field)
732 call field%GetLocalMeshField(domid, cvtot)
734 call auxvars_list%Get(auxvar_cptot_id, field)
735 call field%GetLocalMeshField(domid, cptot)
739 if (
present(lcmesh3d) )
then
740 call mesh%GetLocalMesh( domid, lcmesh )
745 if (
present(lcmesh3d)) lcmesh3d => lcmesh
754 PREC, PREC_ENGI, lcmesh2D )
757 integer,
intent(in) :: domid
761 class(
localmesh2d),
pointer,
intent(out),
optional :: lcmesh2d
769 call field%GetLocalMeshField(domid, prec)
772 call field%GetLocalMeshField(domid, prec_engi)
774 if (
present(lcmesh2d))
then
775 call mesh%GetLocalMesh( domid, lcmesh )
780 if (
present(lcmesh2d)) lcmesh2d => lcmesh
793 integer,
intent(in) :: domid
796 integer,
intent(in) :: varid
798 class(
localmesh3d),
pointer,
intent(out),
optional :: lcmesh3d
805 call trcvars_list%Get(varid, field)
806 call field%GetLocalMeshField(domid, var)
808 if (
present(lcmesh3d))
then
809 call mesh%GetLocalMesh( domid, lcmesh )
814 if (
present(lcmesh3d)) lcmesh3d => lcmesh
823 var, var_tp, lcmesh3D )
825 use scale_atmos_hydrometeor,
only: &
826 atmos_hydrometeor_dry, &
829 integer,
intent(in) :: domid
835 class(
localmesh3d),
pointer,
intent(out),
optional :: lcmesh3d
840 integer :: iq, tend_iq
845 if ( atmos_hydrometeor_dry )
then
846 iq = 0; tend_iq = phytend_num1+1
848 iq = i_qv; tend_iq = phytend_num1 + i_qv
851 call trcvars_list%Get(iq, field)
852 call field%GetLocalMeshField(domid, var)
854 call forcing_list%Get(tend_iq, field)
855 if (
present(var_tp))
call field%GetLocalMeshField(domid, var_tp)
857 if (
present(lcmesh3d))
then
858 call mesh%GetLocalMesh( domid, lcmesh )
863 if (
present(lcmesh3d)) lcmesh3d => lcmesh
876 integer,
intent(in) :: domid
879 integer,
intent(in) :: varid_s
881 class(
localmesh3d),
pointer,
intent(out),
optional :: lcmesh3d
890 do iq = varid_s, varid_s +
size(var_list) - 1
891 call trcvars_list%Get(iq, field)
892 call field%GetLocalMeshField(domid, var_list(iq-varid_s+1)%ptr)
894 if (
present(lcmesh3d))
then
895 call mesh%GetLocalMesh( domid, lcmesh )
900 if (
present(lcmesh3d)) lcmesh3d => lcmesh
913 integer,
intent(in) :: domid
917 class(
localmesh3d),
pointer,
intent(out),
optional :: lcmesh3d
924 call phyauxvars_list%Get(auxvar_pres_id, field)
925 call field%GetLocalMeshField(domid, pres)
927 call phyauxvars_list%Get(auxvar_pt_id, field)
928 call field%GetLocalMeshField(domid, pt)
932 if (
present(lcmesh3d))
then
933 call mesh%GetLocalMesh( domid, lcmesh )
938 if (
present(lcmesh3d)) lcmesh3d => lcmesh
947 DENS_tp, MOMX_tp, MOMY_tp, MOMZ_tp, RHOT_tp, RHOH_p, &
952 integer,
intent(in) :: domid
955 class(
localmeshfieldbase),
pointer,
intent(out) :: dens_tp, momx_tp, momy_tp, momz_tp, rhot_tp
958 class(
localmesh3d),
pointer,
intent(out),
optional :: lcmesh3d
967 call phytends_list%Get(phytend_dens_id, field)
968 call field%GetLocalMeshField(domid, dens_tp)
970 call phytends_list%Get(phytend_momx_id, field)
971 call field%GetLocalMeshField(domid, momx_tp)
973 call phytends_list%Get(phytend_momy_id, field)
974 call field%GetLocalMeshField(domid, momy_tp)
976 call phytends_list%Get(phytend_momz_id, field)
977 call field%GetLocalMeshField(domid, momz_tp)
979 call phytends_list%Get(phytend_rhot_id, field)
980 call field%GetLocalMeshField(domid, rhot_tp)
982 call phytends_list%Get(phytend_rhoh_id, field)
983 call field%GetLocalMeshField(domid, rhoh_p)
985 if (
present(rhoq_tp) )
then
987 call phytends_list%Get(phytend_num1+iq, field)
988 call field%GetLocalMeshField(domid, rhoq_tp(iq)%ptr)
993 if (
present(lcmesh3d) )
then
994 call mesh%GetLocalMesh( domid, lcmesh )
999 if (
present(lcmesh3d) ) lcmesh3d => lcmesh
1012 integer,
intent(in) :: domid
1013 class(
meshbase),
intent(in) :: mesh
1015 integer,
intent(in) :: qtrcid
1021 call phytends_list%Get(phytend_num1 + qtrcid, field)
1022 call field%GetLocalMeshField(domid, rhoq_tp)
1029 subroutine setup_phys_preoperation( this, phy_preproc_file_basename, mesh3D, elem3D )
1030 use scale_prc,
only: prc_ismaster
1033 character(len=*),
intent(in) :: phy_preproc_file_basename
1038 character(len=H_SHORT) :: phy_preproc_operation_type =
'None'
1039 real(rp) :: mf_alpha_h
1040 integer :: mf_order_h
1041 real(rp) :: mf_alpha_v
1042 integer :: mf_order_v
1044 character(len=H_SHORT) :: glfilteroptrtype
1045 character(len=H_SHORT) :: glfiltershape
1046 real(rp) :: glfilterwidthfac
1047 integer :: nnode_h1d_reconst
1048 namelist / param_atmos_vars_container / &
1049 phy_preproc_operation_type, &
1050 mf_alpha_h, mf_order_h, &
1051 mf_alpha_v, mf_order_v, &
1052 glfilteroptrtype, glfiltershape, glfilterwidthfac, nnode_h1d_reconst
1054 character(len=H_LONG) :: cnfname
1060 log_info(
"ATMOS_vars_container/setup_phys_preoperation",*)
"Setting up physical pre-operation for container type ", this%container_type
1063 this%phy_preproc_operation_type = phy_preoperation_typeid_none
1068 mf_alpha_h = 0.0_rp; mf_order_h = 16
1069 mf_alpha_v = 0.0_rp; mf_order_v = 16
1071 glfilteroptrtype =
''
1072 glfiltershape =
'GAUSSIAN'
1073 glfilterwidthfac = 1.0_rp
1075 nnode_h1d_reconst = -1
1077 write(cnfname,
'(A,I2.2,A)') trim(phy_preproc_file_basename), this%container_type,
".conf"
1078 fid = io_cnf_open(trim(cnfname), prc_ismaster)
1081 read(fid,nml=param_atmos_vars_container,iostat=ierr)
1083 log_info(
"ATMOS_vars_container/setup_phys_preoperation",*)
'Not found namelist. Default used.'
1084 elseif( ierr > 0 )
then
1085 log_error(
"ATMOS_vars_container/setup_phys_preoperation",*)
'Invalid names in namelist PARAM_ATMOS_VARS_CONTAINER. Check!'
1088 log_nml(param_atmos_vars_container)
1092 select case( phy_preproc_operation_type )
1094 this%phy_preproc_operation_type = phy_preoperation_typeid_none
1096 case(
'ModalFilter' )
1097 this%phy_preproc_operation_type = phy_preoperation_typeid_modalfilter
1099 case(
'GlobalFilter' )
1100 this%phy_preproc_operation_type = phy_preoperation_typeid_globalfilter
1103 log_error(
"ATMOS_vars_container/setup_phys_preoperation",*)
'Unsupported PHY_PREPROC_OPERATION_TYPE is specified. Check!', phy_preproc_operation_type
1107 select type( phys_pp_ptr => this%phy_preproc )
1109 call phys_pp_ptr%Init( mesh3d )
1111 call phys_pp_ptr%Init( mf_alpha_h, mf_order_h, mf_alpha_v, mf_order_v, mesh3d )
1113 if ( nnode_h1d_reconst < 0 ) nnode_h1d_reconst = elem3d%Nnode_h1D
1114 call phys_pp_ptr%Init( glfilteroptrtype, &
1115 glfiltershape, glfilterwidthfac, &
1116 nnode_h1d_reconst, &
1121 end subroutine setup_phys_preoperation
1124 subroutine vars_calc_diagnosevar_lc( field_name, var_out, &
1125 DDENS_, MOMX_, MOMY_, MOMZ_, PRES_, QDRY_, QTRC, &
1126 DENS_hyd, PRES_hyd, Rtot, CVtot, CPTot, &
1129 use scale_const,
only: &
1130 grav => const_grav, &
1131 rdry => const_rdry, &
1132 rvap => const_rvap, &
1133 cpdry => const_cpdry, &
1134 cvdry => const_cvdry, &
1135 pres00 => const_pre00
1136 use scale_tracer,
only: &
1138 tracer_cv, tracer_engi0
1139 use scale_atmos_hydrometeor,
only: &
1140 atmos_hydrometeor_dry
1141 use scale_atmos_saturation,
only: &
1142 atmos_saturation_psat_liq
1147 character(*),
intent(in) :: field_name
1148 real(rp),
intent(out) :: var_out(elem%np,lcmesh%nea)
1149 real(rp),
intent(in) :: ddens_(elem%np,lcmesh%nea)
1150 real(rp),
intent(in) :: momx_(elem%np,lcmesh%nea)
1151 real(rp),
intent(in) :: momy_(elem%np,lcmesh%nea)
1152 real(rp),
intent(in) :: momz_(elem%np,lcmesh%nea)
1153 real(rp),
intent(in) :: pres_(elem%np,lcmesh%nea)
1154 real(rp),
intent(in) :: qdry_(elem%np,lcmesh%nea)
1156 real(rp),
intent(in) :: dens_hyd(elem%np,lcmesh%nea)
1157 real(rp),
intent(in) :: pres_hyd(elem%np,lcmesh%nea)
1158 real(rp),
intent(in) :: rtot (elem%np,lcmesh%nea)
1159 real(rp),
intent(in) :: cvtot(elem%np,lcmesh%nea)
1160 real(rp),
intent(in) :: cptot(elem%np,lcmesh%nea)
1166 real(rp) :: mom_u1, mom_u2, g_11, g_12, g_22
1167 real(rp) :: temp(elem%np), psat(elem%np)
1170 integer :: indexh2dto3d(elem%np)
1175 ne = lcmesh%Ne; np = elem%Np
1177 select case(trim(field_name))
1183 var_out(p,ke) = ddens_(p,ke) + dens_hyd(p,ke)
1192 dens = ddens_(p,ke) + dens_hyd(p,ke)
1193 var_out(p,ke) = momx_(p,ke) / dens
1202 dens = ddens_(p,ke) + dens_hyd(p,ke)
1203 var_out(p,ke) = momy_(p,ke) / dens
1212 dens = ddens_(p,ke) + dens_hyd(p,ke)
1213 var_out(p,ke) = momz_(p,ke) / dens
1223 var_out(p,ke) = pres_(p,ke) - pres_hyd(p,ke)
1232 var_out(p,ke) = pres_(p,ke) / (rtot(p,ke) * (ddens_(p,ke) + dens_hyd(p,ke)) )
1241 var_out(p,ke) = pres_(p,ke) / ( rtot(p,ke) * (ddens_(p,ke) + dens_hyd(p,ke)) ) &
1242 - pres_hyd(p,ke) / ( rdry * dens_hyd(p,ke) )
1251 dens = ddens_(p,ke) + dens_hyd(p,ke)
1252 var_out(p,ke) = pres_(p,ke) / (rtot(p,ke) * dens ) * ( pres00 / pres_(p,ke) )**( rtot(p,ke) / cptot(p,ke) )
1261 dens = ddens_(p,ke) + dens_hyd(p,ke)
1262 var_out(p,ke) = pres_(p,ke) / (rtot(p,ke) * dens ) * ( pres00 / pres_(p,ke) )**( rtot(p,ke) / cptot(p,ke) ) &
1263 - pres00/rdry * (pres_hyd(p,ke)/pres00)**(cvdry/cpdry) / dens_hyd(p,ke)
1268 if ( atmos_hydrometeor_dry )
then
1273 var_out(p,ke) = 0.0_rp
1277 call tracer_inq_id(
"QV", iq_qv )
1284 temp(p) = pres_(p,ke) / (rtot(p,ke) * (ddens_(p,ke) + dens_hyd(p,ke)) )
1286 call atmos_saturation_psat_liq( temp(p), &
1292 call atmos_saturation_psat_liq( &
1293 np, 1, np, temp(:), &
1299 var_out(p,ke) = ( ddens_(p,ke) + dens_hyd(p,ke) ) * qtrc(iq_qv)%ptr%val(p,ke) &
1300 / psat(p) * rvap * temp(p) * 100.0_rp
1306 indexh2dto3d(:) = elem%IndexH2Dto3D(:)
1312 ke2d = lcmesh%EMap3Dto2D(ke)
1314 dens = ddens_(p,ke) + dens_hyd(p,ke)
1315 g_11 = lcmesh%G_ij(indexh2dto3d(p),ke2d,1,1)
1316 g_12 = lcmesh%G_ij(indexh2dto3d(p),ke2d,1,2)
1317 g_22 = lcmesh%G_ij(indexh2dto3d(p),ke2d,2,2)
1319 mom_u1 = g_11 * momx_(p,ke) + g_12 * momy_(p,ke)
1320 mom_u2 = g_12 * momx_(p,ke) + g_22 * momy_(p,ke)
1322 var_out(p,ke) = 0.5_rp * ( momx_(p,ke) * mom_u1 + momy_(p,ke) * mom_u2 + momz_(p,ke)**2 ) / dens
1331 dens = ddens_(p,ke) + dens_hyd(p,ke)
1332 var_out(p,ke) = dens * grav * lcmesh%zlev(p,ke)
1341 dens = ddens_(p,ke) + dens_hyd(p,ke)
1342 var_out(p,ke) = qdry_(p,ke) * pres_(p,ke) / rtot(p,ke) * cvdry
1345 var_out(p,ke) = var_out(p,ke) &
1346 + qtrc(iq)%ptr%val(p,ke) * ( pres_(p,ke) / rtot(p,ke) * tracer_cv(iq) + dens * tracer_engi0(iq) )
1352 indexh2dto3d(:) = elem%IndexH2Dto3D(:)
1358 ke2d = lcmesh%EMap3Dto2D(ke)
1360 dens = ddens_(p,ke) + dens_hyd(p,ke)
1362 g_11 = lcmesh%G_ij(indexh2dto3d(p),ke2d,1,1)
1363 g_12 = lcmesh%G_ij(indexh2dto3d(p),ke2d,1,2)
1364 g_22 = lcmesh%G_ij(indexh2dto3d(p),ke2d,2,2)
1365 mom_u1 = g_11 * momx_(p,ke) + g_12 * momy_(p,ke)
1366 mom_u2 = g_12 * momx_(p,ke) + g_22 * momy_(p,ke)
1369 var_out(p,ke) = qdry_(p,ke) * pres_(p,ke) / rtot(p,ke) * cvdry
1372 var_out(p,ke) = var_out(p,ke) &
1373 + qtrc(iq)%ptr%val(p,ke) * ( pres_(p,ke) / rtot(p,ke) * tracer_cv(iq) + dens * tracer_engi0(iq) )
1377 0.5_rp * ( momx_(p,ke) * mom_u1 + momy_(p,ke) * mom_u2 + momz_(p,ke)**2 ) / dens &
1379 + dens * grav * lcmesh%pos_en(p,ke,3)
1384 log_error(
"AtmosVars_calc_diagnoseVar_lc",*)
'The name of diagnostic variable is not suported. Check!', field_name
1390 end subroutine vars_calc_diagnosevar_lc
subroutine momtovel(vel, mom, ddens, dens_hyd, lmesh, elem)
module Atmosphere / Physics / Preprocessing
module Atmosphere / Variables
integer, parameter, public atmos_auxvars2d_num
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 atmos_auxvars2d_prec_id
subroutine, public atmosvars_getlocalmeshsfcvar(domid, mesh, auxvars2d_list, prec, prec_engi, lcmesh2d)
subroutine, public atmosvars_getlocalmeshqtrc_qv(domid, mesh, trcvars_list, forcing_list, var, var_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)
integer, parameter, public atmos_auxvars2d_prec_engi_id
subroutine, public atmosvars_getlocalmeshqtrcvarlist(domid, mesh, trcvars_list, varid_s, var_list, lcmesh3d)
type(variableinfo), dimension(atmos_auxvars2d_num), public atmos_auxvars2d_vinfo
subroutine, public atmosvars_getlocalmeshqtrcphytend(domid, mesh, phytends_list, qtrcid, rhoq_tp)
subroutine, public atmosvars_getlocalmeshprgvar(domid, mesh, prgvars_list, auxvars_list, varid, var, dens_hyd, pres_hyd, lcmesh3d)
subroutine, public atmosvars_getlocalmeshqtrcvar(domid, mesh, trcvars_list, varid, var, lcmesh3d)
module FElib / Fluid dyn solver / Atmosphere / driver (3D nonhydrostatic model)
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / Common
integer, parameter, public prgvar_scalar_num
integer, parameter, public phytend_momz_id
integer, parameter, public prgvar_momy_id
integer, parameter, public auxvar_cptot_id
integer, parameter, public prgvar_therm_id
integer, parameter, public auxvar_qdry_id
integer, parameter, public auxvar_cvtot_id
integer, parameter, public prgvar_ddens_id
integer, parameter, public prgvar_momz_id
integer, parameter, public phytend_rhot_id
integer, parameter, public phytend_momx_id
integer, parameter, public phytend_num
integer, parameter, public phytend_momy_id
integer, parameter, public prgvar_momx_id
integer, parameter, public auxvar_num
subroutine, public atm_dyn_dgm_nonhydro3d_common_setup_variables(prgvars, qtrcvars, auxvars, phytends, prgvar_manager, qtrcvar_manager, auxvar_manager, phytend_manager, reg_file_hist, do_setup_phytend, phytend_num_tot, mesh3d, prgvar_varinfo)
Setup variable managers for atmospheric nonhydrostatic dynamical core.
integer, parameter, public auxvar_pt_id
integer, parameter, public prgvar_hvec_num
integer, parameter, public prgvar_num
integer, parameter, public phytend_rhoh_id
integer, parameter, public auxvar_preshydro_id
integer, parameter, public auxvar_thermhydro_id
integer, parameter, public auxvar_denshydro_id
integer, parameter, public phytend_dens_id
integer, parameter, public auxvar_rtot_id
integer, parameter, public auxvar_preshydro_ref_id
integer, parameter, public auxvar_pres_id
module FElib / Atmosphere / Physics cloud microphysics / common
subroutine, public atm_phy_mp_dgm_common_negative_fixer(qtrc, ddens, pres, cvtot, cptot, rtot, dens_hyd, pres_hyd, dt, lmesh, elem, qa, qla, qia, drhot)
module FElib / Element / Base
module FElib / File / History
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
FElib / model framework / variable manager.
Derived type to manage a computational mesh (base class)
Base type for preprocessing operations for variables before evaluating physics tendencies.
Derived type to represent quasi-global filtering operation for variables before evaluating physics te...
Derived type to represent modal filtering operation for variables before evaluating physics tendencie...
Derived type to represent no preprocessing operation for variables before evaluating physics tendenci...
Derived type to manage a set of variables (prognostic variables, tracer variables,...
Derived type to provide a driver of dynamical core with the atmospheric nonhydrostatic equations.
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 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 2D mesh.
Derived type representing a field with 3D mesh.
Derived type representing a field (base type)