1 #ifndef ERF_INPUT_SOUNDING_DATA_H_
2 #define ERF_INPUT_SOUNDING_DATA_H_
8 #include <AMReX_ParmParse.H>
9 #include <AMReX_Print.H>
10 #include <AMReX_Gpu.H>
11 #include <AMReX_Geometry.H>
30 amrex::ParmParse
pp(
"erf");
92 const amrex::Vector<amrex::Real>& zlevels_stag,
93 int itime,
bool is_moist)
96 const int khi = geom.Domain().bigEnd()[AMREX_SPACEDIM-1];
97 const int Nz = geom.Domain().size()[AMREX_SPACEDIM-1];
109 amrex::Print() <<
"input_sounding file location : " <<
input_sounding_file[itime] << std::endl;
111 if(!input_sounding_reader.is_open()) {
112 amrex::Error(
"Error opening the input_sounding file\n");
116 amrex::Print() <<
"Successfully opened the input_sounding file. Now reading... " << std::endl;
121 amrex::Vector<amrex::Real> z_inp_sound_tmp, theta_inp_sound_tmp, qv_inp_sound_tmp,
122 U_inp_sound_tmp, V_inp_sound_tmp;
125 std::getline(input_sounding_reader, line);
126 std::istringstream iss(line);
132 z_inp_sound_tmp.push_back(zbot);
135 U_inp_sound_tmp.push_back(0);
136 V_inp_sound_tmp.push_back(0);
142 amrex::ParmParse pp_erf(
"erf");
150 pp_erf.queryAdd(
"most.surf_temp", surf_temp);
151 bool surf_temp_specified = (surf_temp >
amrex::Real(0.0));
152 if ( surf_temp_specified && (surf_temp != theta_inp_sound_tmp[0]) ) {
153 amrex::Print() <<
"Input sounding temp does not match most.surf_temp" << std::endl;
154 amrex::Print() <<
"Modify one or both to match." << std::endl;
165 pp_erf.queryAdd(
"most.surf_moist", surf_moist);
166 bool surf_moist_specified = (surf_moist >=
amrex::Real(0.0));
167 if ( surf_moist_specified && (surf_moist != qv_inp_sound_tmp[0]) ) {
168 amrex::Print() <<
"Input sounding qv does not match most.surf_moist" << std::endl;
169 amrex::Print() <<
"Modify one or both to match." << std::endl;
176 while(std::getline(input_sounding_reader, line)) {
177 std::istringstream iss_z(line);
186 U_inp_sound_tmp[0] =
U;
187 V_inp_sound_tmp[0] =
V;
190 z_inp_sound_tmp.push_back(
z);
192 theta_inp_sound_tmp.push_back(
theta);
194 U_inp_sound_tmp.push_back(
U);
195 V_inp_sound_tmp.push_back(
V);
196 if (
z >=
ztop)
break;
202 const int Ninp = z_inp_sound_tmp.size();
208 for (
int k=0; k < Nz; ++k) {
222 amrex::Print() <<
"Successfully read the " << itime <<
"th input_sounding file..." << std::endl;
223 input_sounding_reader.close();
239 const int Ninp =
size(itime);
250 amrex::Print() <<
"ideal sounding init: surface dry air density = "
251 << std::setprecision(15)
262 amrex::Print() <<
"z p_m rho_d theta qv U V" << std::endl;
277 for (
int k=1; k <
size(itime); ++k)
291 #ifdef AMREX_USE_FLOAT
314 if (std::abs(F)>tol) {
315 bool maintain_Th =
true;
350 const int Ninp =
size(itime);
364 amrex::Print() <<
"isentropic sounding init: surface dry air density = "
365 << std::setprecision(15)
371 amrex::Print() <<
"z p_m rho_d theta qv U V" << std::endl;
384 for (
int k=1; k <
size(itime); ++k)
431 const int Ninp =
size(itime);
438 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
441 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
444 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
447 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
450 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
459 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
462 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
constexpr amrex::Real p_0
Definition: ERF_Constants.H:61
constexpr amrex::Real RvoRd
Definition: ERF_Constants.H:56
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:64
constexpr amrex::Real R_d
Definition: ERF_Constants.H:47
constexpr amrex::Real RdoCp
Definition: ERF_Constants.H:54
constexpr amrex::Real Gamma
Definition: ERF_Constants.H:62
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getRhogivenThetaPress(const amrex::Real th, const amrex::Real p, const amrex::Real rdOcp, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:96
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getTgivenPandTh(const amrex::Real P, const amrex::Real th, const amrex::Real rdOcp)
Definition: ERF_EOS.H:32
const Real ztop
Definition: ERF_InitCustomPertVels_ParticleTests.H:4
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real interpolate_1d(const amrex::Real *alpha, const amrex::Real *beta, const amrex::Real alpha_interp, const int alpha_size)
Definition: ERF_Interpolation_1D.H:14
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void Newton_Raphson_hse(const Real &m_tol, const Real &RdoCp, const Real &dz, const Real &g, const Real &C, const Real &Th, const Real &T, const Real &qt, const Real &qv, Real &P, Real &rd, Real &F, const bool &maintain_Th)
Definition: ERF_HSEUtils.H:44
@ theta
Definition: ERF_SLM.H:20
@ qv
Definition: ERF_Kessler.H:30
@ U
Definition: ERF_IndexDefines.H:126
@ V
Definition: ERF_IndexDefines.H:127
@ dz
Definition: ERF_AdvanceWDM6.cpp:270
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12