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");
154 pp_erf.query(
"most.pot_surf_temp", surf_temp);
155 pp_erf.query(
"most.surf_temp", old_surf_temp);
156 if (old_surf_temp >
amrex::Real(0.0)) { surf_temp = old_surf_temp; }
157 bool surf_temp_specified = (surf_temp >
amrex::Real(0.0));
158 if ( surf_temp_specified && (surf_temp != theta_inp_sound_tmp[0]) ) {
159 amrex::Print() <<
"Input sounding temp does not match most.pot_surf_temp" << std::endl;
160 amrex::Print() <<
"Modify one or both to match." << std::endl;
171 pp_erf.queryAdd(
"most.surf_moist", surf_moist);
172 bool surf_moist_specified = (surf_moist >=
amrex::Real(0.0));
173 if ( surf_moist_specified && (surf_moist != qv_inp_sound_tmp[0]) ) {
174 amrex::Print() <<
"Input sounding qv does not match most.surf_moist" << std::endl;
175 amrex::Print() <<
"Modify one or both to match." << std::endl;
182 while(std::getline(input_sounding_reader, line)) {
183 std::istringstream iss_z(line);
192 U_inp_sound_tmp[0] =
U;
193 V_inp_sound_tmp[0] =
V;
196 z_inp_sound_tmp.push_back(
z);
198 theta_inp_sound_tmp.push_back(
theta);
200 U_inp_sound_tmp.push_back(
U);
201 V_inp_sound_tmp.push_back(
V);
202 if (
z >=
ztop)
break;
208 const int Ninp = z_inp_sound_tmp.size();
214 for (
int k=0; k < Nz; ++k) {
228 amrex::Print() <<
"Successfully read the " << itime <<
"th input_sounding file..." << std::endl;
229 input_sounding_reader.close();
245 const int Ninp =
size(itime);
256 amrex::Print() <<
"ideal sounding init: surface dry air density = "
257 << std::setprecision(15)
268 amrex::Print() <<
"z p_m rho_d theta qv U V" << std::endl;
283 for (
int k=1; k <
size(itime); ++k)
297 #ifdef AMREX_USE_FLOAT
320 if (std::abs(F)>tol) {
321 bool maintain_Th =
true;
356 const int Ninp =
size(itime);
370 amrex::Print() <<
"isentropic sounding init: surface dry air density = "
371 << std::setprecision(15)
377 amrex::Print() <<
"z p_m rho_d theta qv U V" << std::endl;
390 for (
int k=1; k <
size(itime); ++k)
437 const int Ninp =
size(itime);
444 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
447 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
450 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
453 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
456 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
465 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
468 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
constexpr amrex::Real p_0
Definition: ERF_Constants.H:69
constexpr amrex::Real RvoRd
Definition: ERF_Constants.H:59
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:72
constexpr amrex::Real R_d
Definition: ERF_Constants.H:49
constexpr amrex::Real RdoCp
Definition: ERF_Constants.H:57
constexpr amrex::Real Gamma
Definition: ERF_Constants.H:70
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:25
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
const int klo
Definition: ERF_InitCustomPert_KE.H:9
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
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
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:46
@ theta
Definition: ERF_Kessler.H:26
@ qv
Definition: ERF_Kessler.H:31
@ U
Definition: ERF_IndexDefines.H:166
@ V
Definition: ERF_IndexDefines.H:167
@ dz
Definition: ERF_AdvanceWDM6.cpp:273
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12