1 #ifndef ERF_LANDSURFACE_H
2 #define ERF_LANDSURFACE_H
6 #include <AMReX_PlotFileUtil.H>
7 #include <AMReX_MultiFabUtil.H>
30 template<
class NewSurfModel>
35 m_lsm_model[lev] = std::make_unique<NewSurfModel>();
48 const amrex::MultiFab& cons_in,
49 const amrex::MultiFab& u_in,
50 const amrex::MultiFab& v_in,
51 const amrex::Geometry& geom,
52 const amrex::Geometry& geom0,
53 amrex::Vector<amrex::BCRec>& domain_bcs_type,
54 amrex::IntVect& refRatio,
56 std::unique_ptr<amrex::MultiFab>& z_phys_nd,
57 amrex::Vector<amrex::Vector<std::string>>& nc_init_file)
59 m_lsm_model[lev]->Init(lev, cons_in, u_in, v_in, geom, geom0,
60 domain_bcs_type, refRatio, dt_advance,
61 z_phys_nd, nc_init_file);
66 const amrex::MultiFab& cons_in,
67 const amrex::MultiFab& u_in,
68 const amrex::MultiFab& v_in,
69 const amrex::Geometry& geom,
71 std::unique_ptr<amrex::MultiFab>& z_phys_nd)
73 amrex::Vector<amrex::BCRec> domain_bcs_type;
74 amrex::IntVect refRatio(1);
75 amrex::Vector<amrex::Vector<std::string>> nc_init_file;
76 Init(lev, cons_in, u_in, v_in, geom, geom,
77 domain_bcs_type, refRatio, dt_advance,
78 z_phys_nd, nc_init_file);
83 amrex::MultiFab& cons_in,
84 amrex::MultiFab& xvel_in,
85 amrex::MultiFab& yvel_in,
86 amrex::MultiFab* hfx3_out,
87 amrex::MultiFab* qfx3_out,
90 const double& dt_advance_d,
92 const bool updated_lev0,
93 amrex::MultiFab* z_nd)
97 m_lsm_model[lev]->Advance_With_State(lev, cons_in, xvel_in, yvel_in,
100 time, dt_advance, nstep,
105 Advance (
const int& lev,
const double& dt_advance_d)
118 Plot (
const int& lev,
const int& nstep)
130 amrex::MultiFab& u_in, amrex::MultiFab& v_in)
132 m_lsm_model[lev]->Update_Lsm_Vars(cons_in, u_in, v_in);
147 std::string
name = varname;
149 return (index >= 0) ?
m_lsm_model[lev]->Lsm_Data_Ptr(index) :
nullptr;
170 amrex::Vector<std::string>
173 amrex::Vector<std::string> names;
178 names.reserve(
nvars);
179 for (
int var = 0; var <
nvars; ++var) {
198 const int ndata =
m_lsm_model[lev]->Lsm_Data_Size();
200 for (
int varIdx(0); varIdx<ndata; ++varIdx) {
202 varIdx,
m_lsm_model[source_lev]->Lsm_Data_Ptr(varIdx));
205 const int nflux =
m_lsm_model[lev]->Lsm_Flux_Size();
207 for (
int varIdx(0); varIdx<nflux; ++varIdx) {
209 varIdx,
m_lsm_model[source_lev]->Lsm_Flux_Ptr(varIdx));
212 const int nunmapped =
m_lsm_model[lev]->Lsm_Unmapped_Size();
214 for (
int varIdx(0); varIdx<nunmapped; ++varIdx) {
216 varIdx,
m_lsm_model[source_lev]->Lsm_Unmapped_Ptr(varIdx));
225 const amrex::IntVect& ref_ratio,
231 m_lsm_model[source_lev]->Lsm_Geom(), ref_ratio, mode);
239 const amrex::MultiFab& cons_in,
240 const amrex::MultiFab& u_in,
241 const amrex::MultiFab& v_in,
242 const amrex::Geometry& geom,
243 const amrex::Geometry& geom0,
244 amrex::Vector<amrex::BCRec>& domain_bcs_type,
245 amrex::IntVect& ref_ratio,
247 std::unique_ptr<amrex::MultiFab>& z_phys_nd,
248 amrex::Vector<amrex::Vector<std::string>>& nc_init_file,
249 const int source_lev = -1,
250 const amrex::IntVect& source_ref_ratio = amrex::IntVect(1))
252 const bool has_source = source_lev >= 0;
257 const amrex::Geometry& source_geom = has_source
258 ?
m_lsm_model[source_lev]->Lsm_Atmos_Geom() : geom;
259 const amrex::Geometry& source_lsm_geom = has_source
262 lev, cons_in, u_in, v_in, geom, geom0, domain_bcs_type,
263 ref_ratio, dt_advance, z_phys_nd, nc_init_file,
264 source_geom, source_lsm_geom, source_ref_ratio, has_source);
272 for (
int varIdx(0); varIdx<ndata; ++varIdx) {
273 amrex::MultiFab* Lev0_Data_Ptr = this->
Get_Data_Ptr(0, varIdx);
274 m_lsm_model[lev]->Lsm_Set_Lev0_Data_Ptr(varIdx, Lev0_Data_Ptr);
277 amrex::Abort(
"Differing types of land surface models across levels is not supported!");
292 for (
int varIdx(0); varIdx<nflux; ++varIdx) {
293 amrex::MultiFab* Lev0_Flux_Ptr = this->
Get_Flux_Ptr(0, varIdx);
294 m_lsm_model[lev]->Lsm_Set_Lev0_Flux_Ptr(varIdx, Lev0_Flux_Ptr);
297 amrex::Abort(
"Differing types of land surface models across levels is not supported!");
311 std::unordered_map<std::string,std::string>&
333 const amrex::Vector<int> &level_steps,
334 const amrex::Vector<amrex::IntVect> &ref_ratio,
const int finest_level)
340 int nlev = finest_level + 1;
341 int nlev_valid = finest_level + 1;
343 amrex::Vector<std::string> varnames;
347 varnames.resize(nvar);
350 std::string plotfilename = amrex::Concatenate(
plot_file_lsm, level_steps[0], 5);
351 for (
int lev = 0; lev <= finest_level; ++lev) {
360 amrex::IntVect
ng(0,0,0);
361 amrex::BoxArray ba = mf_lsm->boxArray();
362 amrex::DistributionMapping dm = mf_lsm->DistributionMap();
364 for (
int n(0); n<nvar; ++n) {
370 if (plotfile_type == PlotFileType::Amrex
371 #ifdef ERF_USE_NETCDF
372 || plotfile_type == PlotFileType::Netcdf
375 #ifdef ERF_USE_NETCDF
379 warn_nc_lsm_plot_fallback(plotfile_type);
381 WriteMultiLevelPlotfile (plotfilename, nlev_valid, GetVecOfConstPtrs(
m_lsm_data_lev),
383 level_steps, ref_ratio);
385 amrex::Abort(
"Dont know this plotfile_type");
394 amrex::Vector<amrex::MultiFab> fab_2d(finest_level+1);
395 amrex::Vector<amrex::Geometry> geom_2d(finest_level+1);
396 amrex::Vector<std::string> varnames_2d;
397 std::string plotfilename_2d = amrex::Concatenate(
plot_file_lsm +
"2D_", level_steps[0], 5);
398 for (
int lev = 0; lev <= finest_level; ++lev) {
399 static_cast<SLM*
>(
m_lsm_model[lev].get())->writeSLM_Data(plotfile_type,
static_cast<amrex::Real>(time),
plot_file_lsm, level_steps[0], lev, finest_level, fab_2d[lev], geom_2d[lev], varnames_2d);
403 if (plotfile_type == PlotFileType::Amrex) {
404 amrex::WriteMultiLevelPlotfile(plotfilename_2d, finest_level+1, GetVecOfConstPtrs(fab_2d), varnames_2d, geom_2d,
static_cast<amrex::Real>(time), level_steps, ref_ratio);
416 const amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>>& sst_in,
417 const amrex::Vector<amrex::Vector<std::unique_ptr<amrex::iMultiFab>>>& lmask_in)
419 m_lsm_model[lev]->set_terrain_inputs(sst_in[lev], lmask_in[lev]);
422 template<
class SurfModelType>
424 return static_cast<SurfModelType*
>(
m_lsm_model[lev].get());
429 m_lsm_model[lev]->WriteCheckpoint(lev, checkpointname);
434 m_lsm_model[lev]->ReadCheckpoint(lev, checkpointname);
438 #ifdef ERF_USE_NETCDF
444 void warn_nc_lsm_plot_fallback (
const PlotFileType plotfile_type)
446 if (plotfile_type != PlotFileType::Netcdf || m_warned_nc_lsm_plot) {
return; }
447 m_warned_nc_lsm_plot =
true;
448 amrex::Print() <<
"NOTE: erf.plotfile_type = netcdf, but NetCDF output is not implemented "
450 <<
"* in the AMReX plotfile format instead." << std::endl;
466 #ifdef ERF_USE_NETCDF
468 bool m_warned_nc_lsm_plot =
false;
@ nvars
Definition: ERF_DataStruct.H:194
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
LSMTransferMode
Definition: ERF_NullSurf.H:10
std::string name
Definition: ERF_Plotfile2DCatalog.cpp:105
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Wrapper class for managing land surface models across AMR levels.
Definition: ERF_LandSurface.H:19
amrex::Vector< amrex::Geometry > m_lsm_geom_lev
Definition: ERF_LandSurface.H:461
std::unordered_map< std::string, std::string > & Get_WRFInputNames()
Definition: ERF_LandSurface.H:312
int Get_FluxIdx(const int &lev, const std::string &varname)
Definition: ERF_LandSurface.H:285
void Remake_Level(const int &lev, const amrex::MultiFab &cons_in, const amrex::MultiFab &u_in, const amrex::MultiFab &v_in, const amrex::Geometry &geom, const amrex::Geometry &geom0, amrex::Vector< amrex::BCRec > &domain_bcs_type, amrex::IntVect &ref_ratio, const amrex::Real &dt_advance, std::unique_ptr< amrex::MultiFab > &z_phys_nd, amrex::Vector< amrex::Vector< std::string >> &nc_init_file, const int source_lev=-1, const amrex::IntVect &source_ref_ratio=amrex::IntVect(1))
Definition: ERF_LandSurface.H:238
void Advance(const int &lev, const amrex::Real &dt, const amrex::Real &time, const amrex::Real &start_time)
Definition: ERF_LandSurface.H:111
bool Runs_Own_Land_Driver(const int &lev) const
Definition: ERF_LandSurface.H:305
amrex::MultiFab * Get_Data_Ptr(const int &lev, const std::string &varname)
Definition: ERF_LandSurface.H:145
void Plot_Lsm_Data(const PlotFileType plotfile_type, double time, const amrex::Vector< int > &level_steps, const amrex::Vector< amrex::IntVect > &ref_ratio, const int finest_level)
Definition: ERF_LandSurface.H:331
int Get_Data_Size()
Definition: ERF_LandSurface.H:162
amrex::Geometry Get_Lsm_Geom(const int &lev)
Definition: ERF_LandSurface.H:159
SurfModelType * get_model_lev(const int &lev)
Definition: ERF_LandSurface.H:423
void Update_Lsm_Vars_Lev(const int &lev, amrex::MultiFab &cons_in, amrex::MultiFab &u_in, amrex::MultiFab &v_in)
Definition: ERF_LandSurface.H:129
void Read_Lsm_Restart(const int &lev, const std::string &dir)
Definition: ERF_LandSurface.H:328
void Init(const int &lev, const amrex::MultiFab &cons_in, const amrex::MultiFab &u_in, const amrex::MultiFab &v_in, const amrex::Geometry &geom, const amrex::Geometry &geom0, amrex::Vector< amrex::BCRec > &domain_bcs_type, amrex::IntVect &refRatio, const amrex::Real &dt_advance, std::unique_ptr< amrex::MultiFab > &z_phys_nd, amrex::Vector< amrex::Vector< std::string >> &nc_init_file)
Definition: ERF_LandSurface.H:47
void WriteCheckpoint(const int &lev, const std::string &checkpointname) const
Definition: ERF_LandSurface.H:427
void Plot(const int &lev, const int &nstep)
Definition: ERF_LandSurface.H:118
void Set_Lev0_Data_Ptr(const int &lev)
Definition: ERF_LandSurface.H:268
amrex::Vector< std::string > Get_DataNames()
Definition: ERF_LandSurface.H:171
void ReSize(const int &nlev)
Definition: ERF_LandSurface.H:28
amrex::Vector< amrex::MultiFab > m_lsm_data_lev
Definition: ERF_LandSurface.H:464
void Set_Source_Ptrs(const int &lev, const int &source_lev)
Definition: ERF_LandSurface.H:192
std::string Get_DataName(const int &varIdx)
Definition: ERF_LandSurface.H:168
int Get_LSM_Step(const int &lev) const
Definition: ERF_LandSurface.H:316
std::string Get_FluxName(const int &varIdx)
Definition: ERF_LandSurface.H:282
amrex::Vector< std::unique_ptr< NullSurf > > m_lsm_model
Definition: ERF_LandSurface.H:455
void Set_LSM_Step(const int &lev, int step)
Definition: ERF_LandSurface.H:319
void set_LSM_precip_input(const int &lev, const amrex::MultiFab *precip_in)
Definition: ERF_LandSurface.H:409
void SetModel()
Definition: ERF_LandSurface.H:32
void ReadCheckpoint(const int &lev, const std::string &checkpointname)
Definition: ERF_LandSurface.H:432
amrex::MultiFab * Get_Flux_Ptr(const int &lev, const int &varIdx)
Definition: ERF_LandSurface.H:156
int Get_DataIdx(const int &lev, const std::string &varname)
Definition: ERF_LandSurface.H:186
void Advance(const int &lev, amrex::MultiFab &cons_in, amrex::MultiFab &xvel_in, amrex::MultiFab &yvel_in, amrex::MultiFab *hfx3_out, amrex::MultiFab *qfx3_out, const SurfacePrecipAccumulationSources &precip_sources, const double &time_d, const double &dt_advance_d, const int &nstep, const bool updated_lev0, amrex::MultiFab *z_nd)
Definition: ERF_LandSurface.H:82
void Initialize_From_Source(const int &lev, const int &source_lev, const amrex::IntVect &ref_ratio, const LSMTransferMode mode)
Definition: ERF_LandSurface.H:224
void Advance(const int &lev, const double &dt_advance_d)
Definition: ERF_LandSurface.H:105
bool Get_LSM_Update_Status(const int &lev)
Definition: ERF_LandSurface.H:302
LandSurface()
Definition: ERF_LandSurface.H:23
void Set_Lev0_Flux_Ptr(const int &lev)
Definition: ERF_LandSurface.H:288
void Init(const int &lev, const amrex::MultiFab &cons_in, const amrex::MultiFab &u_in, const amrex::MultiFab &v_in, const amrex::Geometry &geom, const amrex::Real &dt_advance, std::unique_ptr< amrex::MultiFab > &z_phys_nd)
Definition: ERF_LandSurface.H:65
void Update_State_Vars_Lev(const int &lev, amrex::MultiFab &cons_in)
Definition: ERF_LandSurface.H:136
void Define(const int &lev, SolverChoice &sc)
Definition: ERF_LandSurface.H:40
int Get_Flux_Size()
Definition: ERF_LandSurface.H:165
void set_LSM_terrain_inputs(const int &lev, const amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab >>> &sst_in, const amrex::Vector< amrex::Vector< std::unique_ptr< amrex::iMultiFab >>> &lmask_in)
Definition: ERF_LandSurface.H:415
amrex::MultiFab * Get_Data_Ptr(const int &lev, const int &varIdx)
Definition: ERF_LandSurface.H:142
void Write_Lsm_Restart(const int &lev, const std::string &dir) const
Definition: ERF_LandSurface.H:325
bool Has_Model() const
Definition: ERF_LandSurface.H:153
std::string plot_file_lsm
Definition: ERF_LandSurface.H:458
void Update_Micro_Vars_Lev(const int &lev, amrex::MultiFab &cons_in)
Definition: ERF_LandSurface.H:124
Definition: ERF_SLM.H:185
@ SLM
Definition: ERF_LSM_Types.H:8
@ ng
Definition: ERF_Morrison.H:50
@ precip_in
Definition: ERF_SLM.H:134
Definition: ERF_DataStruct.H:685
Definition: ERF_SurfacePrecipitation.H:34