13 #ifdef ERF_USE_WSM6_FORT
14 static bool wsm6_inited =
false;
18 constexpr
double den0 = 1.28;
19 constexpr
double denr =
static_cast<double>(
rhoh2o);
20 constexpr
double dens =
static_cast<double>(
rhos);
21 constexpr
double cl =
static_cast<double>(
Cp_l);
22 constexpr
double cpv =
static_cast<double>(
Cp_v);
23 constexpr
int hail_opt = 0;
28 constexpr
double g =
static_cast<double>(
CONST_GRAV);
29 constexpr
double cpd =
static_cast<double>(
Cp_d);
30 constexpr
double cpv =
static_cast<double>(
Cp_v);
31 constexpr
double rd =
static_cast<double>(
R_d);
32 constexpr
double rv =
static_cast<double>(
R_v);
33 constexpr
double t0c = 273.15;
34 constexpr
double ep1 =
static_cast<double>(
R_v /
R_d -
one);
35 constexpr
double ep2 =
static_cast<double>(
R_d /
R_v);
36 constexpr
double qmin = 1.0e-12;
37 constexpr
double xls =
static_cast<double>(
lsub);
38 constexpr
double xlv0 =
static_cast<double>(
lat_vap);
39 constexpr
double xlf0 =
static_cast<double>(
lat_ice);
40 constexpr
double den0 = 1.28;
41 constexpr
double denr =
static_cast<double>(
rhoh2o);
42 constexpr
double cliq =
static_cast<double>(
Cp_l);
43 constexpr
double cice = 2106.0;
44 constexpr
double psat = 610.78;
47 const Box box = mfi.tilebox();
48 const Box fab_box = mfi.fabbox();
63 const int ilo = box.smallEnd(0);
64 const int ihi = box.bigEnd(0);
65 const int jlo = box.smallEnd(1);
66 const int jhi = box.bigEnd(1);
67 const int klo = box.smallEnd(2);
68 const int khi = box.bigEnd(2);
70 const int imlo = fab_box.smallEnd(0);
71 const int imhi = fab_box.bigEnd(0);
72 const int jmlo = fab_box.smallEnd(1);
73 const int jmhi = fab_box.bigEnd(1);
74 const int kmlo = fab_box.smallEnd(2);
75 const int kmhi = fab_box.bigEnd(2);
78 FArrayBox delz_fab(fab_box, 1);
79 auto const& delz_arr = delz_fab.array();
80 delz_fab.setVal(dz_val);
83 ParallelFor(box, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k) {
84 delz_arr(i,j,k) = (z_arr) ?
Real(0.25) * ( (z_arr(i ,j ,k+1) - z_arr(i ,j ,k))
85 + (z_arr(i+1,j ,k+1) - z_arr(i+1,j ,k))
86 + (z_arr(i ,j+1,k+1) - z_arr(i ,j+1,k))
87 + (z_arr(i+1,j+1,k+1) - z_arr(i+1,j+1,k)) ) : dz_val;
92 FArrayBox rainncv_fab(box2d, 1);
93 FArrayBox sr_fab(box2d, 1);
94 FArrayBox snowncv_fab(box2d, 1);
95 FArrayBox graupelncv_fab(box2d, 1);
96 FArrayBox rainacc_fab(box2d, 1);
97 FArrayBox snowacc_fab(box2d, 1);
98 FArrayBox graupacc_fab(box2d, 1);
100 auto const& rainncv_arr = rainncv_fab.array();
101 auto const& sr_arr = sr_fab.array();
102 auto const& snowncv_arr = snowncv_fab.array();
103 auto const& graupelncv_arr = graupelncv_fab.array();
104 auto const& rainacc_arr = rainacc_fab.array();
105 auto const& snowacc_arr = snowacc_fab.array();
106 auto const& graupacc_arr = graupacc_fab.array();
107 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
108 rainacc_arr(i,j,0) = rain_arr(i,j,klo);
109 snowacc_arr(i,j,0) = snow_arr(i,j,klo);
110 graupacc_arr(i,j,0) = graup_arr(i,j,klo);
111 rainncv_arr(i,j,0) =
Real(0.0);
112 sr_arr(i,j,0) =
Real(0.0);
113 snowncv_arr(i,j,0) =
Real(0.0);
114 graupelncv_arr(i,j,0) =
Real(0.0);
119 qv_arr.dataPtr(), qc_arr.dataPtr(), qi_arr.dataPtr(),
120 qr_arr.dataPtr(), qs_arr.dataPtr(), qg_arr.dataPtr(),
121 den_arr.dataPtr(), p_arr.dataPtr(), delz_arr.dataPtr(),
122 static_cast<double>(
dt),
g, cpd,
cpv, rd, rv, t0c, ep1, ep2, qmin,
124 rainacc_arr.dataPtr(), rainncv_arr.dataPtr(), sr_arr.dataPtr(),
125 snowacc_arr.dataPtr(), snowncv_arr.dataPtr(),
126 graupacc_arr.dataPtr(), graupelncv_arr.dataPtr(),
127 imlo, imhi, jmlo, jmhi, kmlo, kmhi,
128 ilo, ihi, jlo, jhi, klo,
khi);
130 ParallelFor(box2d, [=] AMREX_GPU_DEVICE (
int i,
int j,
int) {
131 rain_arr(i,j,klo) = rainacc_arr(i,j,0);
132 snow_arr(i,j,klo) = snowacc_arr(i,j,0);
133 graup_arr(i,j,klo) = graupacc_arr(i,j,0);
137 amrex::Abort(
"WSM6 Fortran bridge requested but ERF was not built with ERF_USE_WSM6_FORT");
constexpr amrex::Real R_v
Definition: ERF_Constants.H:21
constexpr amrex::Real lat_vap
Definition: ERF_Constants.H:95
constexpr amrex::Real Cp_d
Definition: ERF_Constants.H:22
constexpr amrex::Real lsub
Definition: ERF_Constants.H:78
constexpr amrex::Real rhoh2o
Definition: ERF_Constants.H:104
constexpr amrex::Real one
Definition: ERF_Constants.H:7
constexpr amrex::Real lat_ice
Definition: ERF_Constants.H:96
constexpr amrex::Real rhos
Definition: ERF_Constants.H:39
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:31
constexpr amrex::Real Cp_l
Definition: ERF_Constants.H:24
constexpr amrex::Real Cp_v
Definition: ERF_Constants.H:23
constexpr amrex::Real R_d
Definition: ERF_Constants.H:20
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { const auto prob_lo=geomdata.ProbLo();const auto dx=geomdata.CellSize();const Real x=(prob_lo[0]+(i+myhalf) *dx[0])/mf_m(i, j, 0);const Real z=z_cc(i, j, k);Real L=std::sqrt(std::pow((x - x_c)/x_r, 2)+std::pow((z - z_c)/z_r, 2));if(L<=one) { Real dT=T_pert *(std::cos(PI *L)+one)/two;Real Tbar_hse=p_hse(i, j, k)/(R_d *r_hse(i, j, k));Real theta_perturbed=(Tbar_hse+dT) *std::pow(p_0/p_hse(i, j, k), rdOcp);Real theta_0=(Tbar_hse) *std::pow(p_0/p_hse(i, j, k), rdOcp);if(const_rho) { state_pert(i, j, k, RhoTheta_comp)=r_hse(i, j, k) *(theta_perturbed - theta_0);} else { state_pert(i, j, k, Rho_comp)=getRhoThetagivenP(p_hse(i, j, k))/theta_perturbed - r_hse(i, j, k);} } })
auto qv_arr
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:210
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_FORCE_INLINE amrex::IntVect TileNoZ()
Definition: ERF_TileNoZ.H:11
void mp_wsm6_run_c(double *t, double *qv, double *qc, double *qi, double *qr, double *qs, double *qg, double *den, double *p, double *delz, double delt, double g, double cpd, double cpv, double rd, double rv, double t0c, double ep1, double ep2, double qmin, double xls, double xlv0, double xlf0, double den0, double denr, double cliq, double cice, double psat, double *rain, double *rainncv, double *sr, double *snow, double *snowncv, double *graupel, double *graupelncv, int ims, int ime, int jms, int jme, int kms, int kme, int its, int ite, int jts, int jte, int kts, int kte)
void mp_wsm6_init_c(double den0, double denr, double dens, double cl, double cpv, int hail_opt)
amrex::MultiFab * m_z_phys_nd
Definition: ERF_WSM6.H:108
int m_axis
Definition: ERF_WSM6.H:105
amrex::Geometry m_geom
Definition: ERF_WSM6.H:100
amrex::Real dt
Definition: ERF_WSM6.H:102
amrex::Array< FabPtr, MicVar_WSM6::NumVars > mic_fab_vars
Definition: ERF_WSM6.H:111
@ qr
Definition: ERF_WSM6.H:27
@ qi
Definition: ERF_WSM6.H:26
@ qs
Definition: ERF_WSM6.H:28
@ qv
Definition: ERF_WSM6.H:24
@ qc
Definition: ERF_WSM6.H:25
@ rain_accum
Definition: ERF_WSM6.H:30
@ snow_accum
Definition: ERF_WSM6.H:31
@ rho
Definition: ERF_WSM6.H:20
@ graup_accum
Definition: ERF_WSM6.H:32
@ qg
Definition: ERF_WSM6.H:29
@ pres
Definition: ERF_WSM6.H:23
@ tabs
Definition: ERF_WSM6.H:22
real(c_double), parameter cice
Definition: ERF_module_model_constants.F90:30
real(c_double), parameter g
Definition: ERF_module_model_constants.F90:19
real(c_double), parameter cliq
Definition: ERF_module_model_constants.F90:29
real(c_double), parameter xlv0
Definition: ERF_module_model_constants.F90:51
real(c_double), parameter cpv
Definition: ERF_module_model_constants.F90:26
real(c_double), parameter xls
Definition: ERF_module_model_constants.F90:56
real(c_double), parameter psat
Definition: ERF_module_model_constants.F90:31
real(kind=kind_phys), parameter, private dens
Definition: ERF_module_mp_wsm6.F90:39