1 #ifndef ERF_INPUT_SOUNDING_DATA_H_
2 #define ERF_INPUT_SOUNDING_DATA_H_
7 #include <AMReX_ParmParse.H>
8 #include <AMReX_Print.H>
10 #include <AMReX_Geometry.H>
29 amrex::ParmParse
pp(
"erf");
91 const amrex::Vector<amrex::Real>& zlevels_stag,
92 int itime,
bool is_moist)
95 const int khi = geom.Domain().bigEnd()[AMREX_SPACEDIM-1];
96 const int Nz = geom.Domain().size()[AMREX_SPACEDIM-1];
108 amrex::Print() <<
"input_sounding file location : " <<
input_sounding_file[itime] << std::endl;
110 if(!input_sounding_reader.is_open()) {
111 amrex::Error(
"Error opening the input_sounding file\n");
115 amrex::Print() <<
"Successfully opened the input_sounding file. Now reading... " << std::endl;
120 amrex::Vector<amrex::Real> z_inp_sound_tmp, theta_inp_sound_tmp, qv_inp_sound_tmp,
121 U_inp_sound_tmp, V_inp_sound_tmp;
124 std::getline(input_sounding_reader, line);
125 std::istringstream iss(line);
131 z_inp_sound_tmp.push_back(zbot);
134 U_inp_sound_tmp.push_back(0);
135 V_inp_sound_tmp.push_back(0);
141 amrex::ParmParse pp_erf(
"erf");
144 bool surf_temp_specified = pp_erf.query(
"most.surf_temp", surf_temp);
145 if ( surf_temp_specified && (surf_temp != theta_inp_sound_tmp[0]) ) {
146 amrex::Print() <<
"Input sounding temp does not match most.surf_temp" << std::endl;
147 amrex::Print() <<
"Modify one or both to match." << std::endl;
156 bool surf_moist_specified = pp_erf.query(
"most.surf_moist", surf_moist);
157 if ( surf_moist_specified && (surf_moist != qv_inp_sound_tmp[0]) ) {
158 amrex::Print() <<
"Input sounding qv does not match most.surf_moist" << std::endl;
159 amrex::Print() <<
"Modify one or both to match." << std::endl;
166 while(std::getline(input_sounding_reader, line)) {
167 std::istringstream iss_z(line);
176 U_inp_sound_tmp[0] =
U;
177 V_inp_sound_tmp[0] =
V;
180 z_inp_sound_tmp.push_back(
z);
182 theta_inp_sound_tmp.push_back(
theta);
184 U_inp_sound_tmp.push_back(
U);
185 V_inp_sound_tmp.push_back(
V);
186 if (
z >=
ztop)
break;
192 const int Ninp = z_inp_sound_tmp.size();
198 for (
int k=0; k < Nz; ++k) {
212 amrex::Print() <<
"Successfully read the " << itime <<
"th input_sounding file..." << std::endl;
213 input_sounding_reader.close();
230 const int Ninp =
size(itime);
241 amrex::Print() <<
"ideal sounding init: surface dry air density = "
242 << std::setprecision(15)
253 amrex::Print() <<
"z p_m rho_d theta qv U V" << std::endl;
268 for (
int k=1; k <
size(itime); ++k)
288 if (std::abs(F)>tol) {
289 bool maintain_Th =
true;
324 const int Ninp =
size(itime);
338 amrex::Print() <<
"isentropic sounding init: surface dry air density = "
339 << std::setprecision(15)
345 amrex::Print() <<
"z p_m rho_d theta qv U V" << std::endl;
358 for (
int k=1; k <
size(itime); ++k)
405 const int Ninp =
size(itime);
412 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
415 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
418 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
421 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
424 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
433 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
436 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:123
@ V
Definition: ERF_IndexDefines.H:124
@ dz
Definition: ERF_AdvanceWSM6.cpp:104