1 #ifndef ERF_LARGE_SCALE_FORCING_DATA_H_
2 #define ERF_LARGE_SCALE_FORCING_DATA_H_
9 #include <AMReX_ParmParse.H>
10 #include <AMReX_Print.H>
11 #include <AMReX_Gpu.H>
12 #include <AMReX_Geometry.H>
38 amrex::ParmParse
pp(
"erf");
39 pp.queryAdd(
"forcing_timescale",
tau_lsf);
40 pp.queryAdd(
"large_scale_forcing_file",
lsf_file);
50 std::istringstream iss(str);
66 amrex::Print() <<
" Opening LSF file '" <<
lsf_file <<
"'" << std::endl;
70 amrex::Error(
"Error opening input forcing file " +
lsf_file);
76 amrex::Vector<amrex::Real> z_in, p_in, t_in, q_in, u_in, v_in, w_in;
79 std::getline(ifs, line);
89 while(std::getline(ifs, line)) {
90 std::istringstream iss(line);
100 std::string s_time, s_lev, s_pres0;
101 iss >> s_time >> s_lev >> s_pres0;
103 int nlev = std::stoi(s_lev);
104 pres0 = std::stod(s_pres0);
109 file_start_time = time;
111 time = (time - file_start_time) *
amrex::Real(86400.0);
117 z_lsf.push_back(z_in);
118 p_lsf.push_back(p_in);
119 t_lsf.push_back(t_in);
120 q_lsf.push_back(q_in);
121 u_lsf.push_back(u_in);
122 v_lsf.push_back(v_in);
123 w_lsf.push_back(w_in);
147 z_in.push_back(
zero);
148 p_in.push_back(pres0);
149 t_in.push_back(
zero);
150 q_in.push_back(
zero);
151 u_in.push_back(
zero);
152 v_in.push_back(
zero);
153 w_in.push_back(
zero);
159 iss >>
z >>
p >> tls >> qls >> uls >> vls >> wls;
175 amrex::Error(
"unexpected line in input file: " + line);
183 z_lsf.push_back(z_in);
184 p_lsf.push_back(p_in);
185 t_lsf.push_back(t_in);
186 q_lsf.push_back(q_in);
187 u_lsf.push_back(u_in);
188 v_lsf.push_back(v_in);
189 w_lsf.push_back(w_in);
193 "repeated timestamp in the large-scale forcing file");
194 amrex::Print() <<
" Read " <<
nz_lsf <<
" levels at " <<
num_times <<
" times" << std::endl;
199 amrex::Print() <<
" LSF at time = " <<
times_lsf[i] << std::endl;
200 for (
int lev = 0; lev <
nz_lsf + 1; lev++)
202 amrex::Print() <<
" level " << lev <<
": z = " <<
z_lsf[i][lev] <<
" p = " <<
p_lsf[i][lev] <<
" tls = "
203 <<
t_lsf[i][lev] <<
" qls = " <<
q_lsf[i][lev] <<
" uls = " <<
u_lsf[i][lev] <<
" vls = "
204 <<
v_lsf[i][lev] <<
" wls = " <<
w_lsf[i][lev] << std::endl;
218 const amrex::Vector<amrex::Real>& zlevels_stag,
222 const int khi = geom.Domain().bigEnd()[AMREX_SPACEDIM-1];
223 const int Nz = geom.Domain().size()[AMREX_SPACEDIM-1];
226 const bool use_terrain = (zlevels_stag.size() > 0);
245 for (
int itime = 0; itime <
num_times; itime++)
254 for (
int k = 0; k < Nz; k++)
260 for (
int lk = 2; lk <
nz_lsf + 1; lk++)
274 amrex::Real coef = (coord_k - coord_lsf[lk - 1]) / (coord_lsf[lk] - coord_lsf[lk - 1]);
310 amrex::Print() <<
" INTERPOLATED LSF at time = " <<
times_lsf[i] << std::endl;
311 for (
int k = 0; k <= Nz; k++)
313 amrex::Print() <<
" level " << k <<
": z = " <<
z_int_lsf[i][k] <<
" tls = " <<
t_int_lsf[i][k]
360 coeff_curr = (
one - coeff_next);
378 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
381 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
384 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
387 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
390 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
393 amrex::Gpu::copy(amrex::Gpu::hostToDevice,
430 amrex::Vector<amrex::Vector<amrex::Real>>
z_lsf;
431 amrex::Vector<amrex::Vector<amrex::Real>>
p_lsf;
432 amrex::Vector<amrex::Vector<amrex::Real>>
t_lsf;
433 amrex::Vector<amrex::Vector<amrex::Real>>
q_lsf;
434 amrex::Vector<amrex::Vector<amrex::Real>>
u_lsf;
435 amrex::Vector<amrex::Vector<amrex::Real>>
v_lsf;
436 amrex::Vector<amrex::Vector<amrex::Real>>
w_lsf;
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
const Real ztop
Definition: ERF_InitCustomPertVels_ParticleTests.H:4
const bool use_terrain
Definition: ERF_InitCustomPertVels_Terrain3DHemisphere.H:26
const int khi
Definition: ERF_InitCustomPert_Bubble.H:21
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ dz
Definition: ERF_AdvanceWDM6.cpp:270
@ p
Definition: ERF_WSM6.H:191
@ tmp
Definition: ERF_AdvanceWSM6.cpp:114
Definition: ERF_LargeScaleForcingData.H:31
bool use_z_grid
Definition: ERF_LargeScaleForcingData.H:411
amrex::Vector< amrex::Real > times_lsf
Definition: ERF_LargeScaleForcingData.H:426
amrex::Vector< amrex::Vector< amrex::Real > > u_lsf
Definition: ERF_LargeScaleForcingData.H:434
void read_forcing_file()
Read the forcing file and cache the raw time slices on host.
Definition: ERF_LargeScaleForcingData.H:64
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > q_int_lsf_d
Definition: ERF_LargeScaleForcingData.H:451
bool verbose_print
Definition: ERF_LargeScaleForcingData.H:416
amrex::Vector< amrex::Vector< amrex::Real > > z_lsf
Definition: ERF_LargeScaleForcingData.H:430
amrex::Vector< amrex::Vector< amrex::Real > > q_lsf
Definition: ERF_LargeScaleForcingData.H:433
std::string lsf_file
Definition: ERF_LargeScaleForcingData.H:405
int nz_lsf
Definition: ERF_LargeScaleForcingData.H:421
amrex::Vector< amrex::Vector< amrex::Real > > q_int_lsf
Definition: ERF_LargeScaleForcingData.H:443
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > v_int_lsf_d
Definition: ERF_LargeScaleForcingData.H:451
amrex::Vector< amrex::Vector< amrex::Real > > w_int_lsf
Definition: ERF_LargeScaleForcingData.H:446
amrex::Vector< amrex::Vector< amrex::Real > > v_lsf
Definition: ERF_LargeScaleForcingData.H:435
amrex::Vector< amrex::Vector< amrex::Real > > u_int_lsf
Definition: ERF_LargeScaleForcingData.H:444
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > t_int_lsf_d
Definition: ERF_LargeScaleForcingData.H:451
amrex::Vector< amrex::Vector< amrex::Real > > t_int_lsf
Definition: ERF_LargeScaleForcingData.H:442
amrex::Vector< amrex::Vector< amrex::Real > > p_lsf
Definition: ERF_LargeScaleForcingData.H:431
amrex::Vector< amrex::Vector< amrex::Real > > w_lsf
Definition: ERF_LargeScaleForcingData.H:436
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > z_int_lsf_d
Definition: ERF_LargeScaleForcingData.H:451
void interp_forcing(const amrex::GeometryData &geom, const amrex::Vector< amrex::Real > &zlevels_stag, const InputSoundingData &sounding)
Interpolate the forcing profiles onto the model grid.
Definition: ERF_LargeScaleForcingData.H:217
amrex::Vector< amrex::Vector< amrex::Real > > v_int_lsf
Definition: ERF_LargeScaleForcingData.H:445
int get_columns_in_str(std::string &str)
Count the number of whitespace-separated columns in a line.
Definition: ERF_LargeScaleForcingData.H:48
void get_forcing_time_coeffs(const amrex::Real &time, int &curr, int &next, amrex::Real &coeff_curr, amrex::Real &coeff_next)
Determine interpolation coefficients to apply tendencies for the given time.
Definition: ERF_LargeScaleForcingData.H:329
amrex::Real tau_lsf
Definition: ERF_LargeScaleForcingData.H:401
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > u_int_lsf_d
Definition: ERF_LargeScaleForcingData.H:451
amrex::Vector< amrex::Vector< amrex::Real > > t_lsf
Definition: ERF_LargeScaleForcingData.H:432
amrex::Vector< amrex::Vector< amrex::Real > > z_int_lsf
Definition: ERF_LargeScaleForcingData.H:441
void host_to_device(int itime)
Copy one interpolated forcing slice from host memory to device memory.
Definition: ERF_LargeScaleForcingData.H:368
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real > > w_int_lsf_d
Definition: ERF_LargeScaleForcingData.H:451
int num_times
Definition: ERF_LargeScaleForcingData.H:422
LargeScaleForcingData()
Construct large-scale forcing metadata from the ERF input namespace.
Definition: ERF_LargeScaleForcingData.H:36