ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
LandSurface Class Reference

Wrapper class for managing land surface models across AMR levels. More...

#include <ERF_LandSurface.H>

Collaboration diagram for LandSurface:

Public Member Functions

 LandSurface ()
 
 ~LandSurface ()=default
 
void ReSize (const int &nlev)
 
template<class NewSurfModel >
void SetModel ()
 
void Define (const int &lev, SolverChoice &sc)
 
void Init (const int &lev, const amrex::MultiFab &cons_in, const amrex::Geometry &geom, const amrex::Geometry &geom0, amrex::Vector< amrex::BCRec > &domain_bcs_type, amrex::IntVect &refRatio, const amrex::Real &dt_advance, amrex::Vector< amrex::Vector< std::string >> &nc_init_file)
 
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)
 
void Advance (const int &lev, const double &dt_advance_d)
 
void Plot (const int &lev, const int &nstep)
 
void Update_Micro_Vars_Lev (const int &lev, amrex::MultiFab &cons_in)
 
void Update_State_Vars_Lev (const int &lev, amrex::MultiFab &cons_in)
 
amrex::MultiFab * Get_Data_Ptr (const int &lev, const int &varIdx)
 
amrex::MultiFab * Get_Data_Ptr (const int &lev, const std::string &varname)
 
bool Has_Model () const
 
amrex::MultiFab * Get_Flux_Ptr (const int &lev, const int &varIdx)
 
amrex::Geometry Get_Lsm_Geom (const int &lev)
 
int Get_Data_Size ()
 
int Get_Flux_Size ()
 
std::string Get_DataName (const int &varIdx)
 
amrex::Vector< std::string > Get_DataNames ()
 
int Get_DataIdx (const int &lev, std::string &varname)
 
void Set_Lev0_Data_Ptr (const int &lev)
 
std::string Get_FluxName (const int &varIdx)
 
int Get_FluxIdx (const int &lev, std::string &varname)
 
void Set_Lev0_Flux_Ptr (const int &lev)
 
bool Get_LSM_Update_Status (const int &lev)
 
std::unordered_map< std::string, std::string > & Get_WRFInputNames ()
 
int Get_LSM_Step (const int &lev) const
 
void Set_LSM_Step (const int &lev, int step)
 
void Write_Lsm_Restart (const int &lev, const std::string &dir) const
 
void Read_Lsm_Restart (const int &lev, const std::string &dir)
 
void Plot_Lsm_Data (double time, int finest_level, const amrex::Vector< int > &level_steps, const amrex::Vector< amrex::IntVect > &ref_ratio)
 
template<class SurfModelType >
SurfModelType * get_model_lev (const int &lev)
 

Private Attributes

amrex::Vector< std::unique_ptr< NullSurf > > m_lsm_model
 
std::string plot_file_lsm {"plt_lsm_"}
 
amrex::Vector< amrex::Geometry > m_lsm_geom_lev
 
amrex::Vector< amrex::MultiFab > m_lsm_data_lev
 

Detailed Description

Wrapper class for managing land surface models across AMR levels.

Constructor & Destructor Documentation

◆ LandSurface()

LandSurface::LandSurface ( )
inline
23 { }

◆ ~LandSurface()

LandSurface::~LandSurface ( )
default

Member Function Documentation

◆ Advance() [1/2]

void LandSurface::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 
)
inline
73  {
74  amrex::Real time = static_cast<amrex::Real>(time_d);
75  amrex::Real dt_advance = static_cast<amrex::Real>(dt_advance_d);
76  m_lsm_model[lev]->Advance_With_State(lev, cons_in, xvel_in, yvel_in,
77  hfx3_out, qfx3_out,
78  precip_sources,
79  time, dt_advance, nstep, updated_lev0);
80  }
amrex::Real Real
Definition: ERF_ShocInterface.H:19
amrex::Vector< std::unique_ptr< NullSurf > > m_lsm_model
Definition: ERF_LandSurface.H:259

◆ Advance() [2/2]

void LandSurface::Advance ( const int &  lev,
const double &  dt_advance_d 
)
inline
84  {
85  amrex::Real dt_advance = static_cast<amrex::Real>(dt_advance_d);
86  m_lsm_model[lev]->Advance(dt_advance);
87  }

◆ Define()

void LandSurface::Define ( const int &  lev,
SolverChoice sc 
)
inline
42  {
43  m_lsm_model[lev]->Define(sc);
44  }

◆ Get_Data_Ptr() [1/2]

amrex::MultiFab* LandSurface::Get_Data_Ptr ( const int &  lev,
const int &  varIdx 
)
inline
108 { return m_lsm_model[lev]->Lsm_Data_Ptr(varIdx); }

Referenced by Plot_Lsm_Data(), and Set_Lev0_Data_Ptr().

Here is the caller graph for this function:

◆ Get_Data_Ptr() [2/2]

amrex::MultiFab* LandSurface::Get_Data_Ptr ( const int &  lev,
const std::string &  varname 
)
inline
112  {
113  std::string name = varname;
114  const int index = m_lsm_model[lev]->Lsm_DataIndex(name);
115  return (index >= 0) ? m_lsm_model[lev]->Lsm_Data_Ptr(index) : nullptr;
116  }
std::string name
Definition: ERF_Plotfile2DCatalog.cpp:101

◆ Get_Data_Size()

int LandSurface::Get_Data_Size ( )
inline
128 { return m_lsm_model[0]->Lsm_Data_Size(); }

Referenced by Get_DataNames(), Plot_Lsm_Data(), and Set_Lev0_Data_Ptr().

Here is the caller graph for this function:

◆ Get_DataIdx()

int LandSurface::Get_DataIdx ( const int &  lev,
std::string &  varname 
)
inline
152 { return m_lsm_model[lev]->Lsm_DataIndex(varname); }

◆ Get_DataName()

std::string LandSurface::Get_DataName ( const int &  varIdx)
inline
134 { return m_lsm_model[0]->Lsm_DataName(varIdx); }

Referenced by Get_DataNames(), and Plot_Lsm_Data().

Here is the caller graph for this function:

◆ Get_DataNames()

amrex::Vector<std::string> LandSurface::Get_DataNames ( )
inline
138  {
139  amrex::Vector<std::string> names;
140  if (m_lsm_model.empty() || m_lsm_model[0] == nullptr) {
141  return names;
142  }
143  const int nvars = Get_Data_Size();
144  names.reserve(nvars);
145  for (int var = 0; var < nvars; ++var) {
146  names.push_back(Get_DataName(var));
147  }
148  return names;
149  }
@ nvars
Definition: ERF_DataStruct.H:153
int Get_Data_Size()
Definition: ERF_LandSurface.H:128
std::string Get_DataName(const int &varIdx)
Definition: ERF_LandSurface.H:134
Here is the call graph for this function:

◆ Get_Flux_Ptr()

amrex::MultiFab* LandSurface::Get_Flux_Ptr ( const int &  lev,
const int &  varIdx 
)
inline
122 { return m_lsm_model[lev]->Lsm_Flux_Ptr(varIdx); }

Referenced by Set_Lev0_Flux_Ptr().

Here is the caller graph for this function:

◆ Get_Flux_Size()

int LandSurface::Get_Flux_Size ( )
inline
131 { return m_lsm_model[0]->Lsm_Flux_Size(); }

Referenced by Set_Lev0_Flux_Ptr().

Here is the caller graph for this function:

◆ Get_FluxIdx()

int LandSurface::Get_FluxIdx ( const int &  lev,
std::string &  varname 
)
inline
172 { return m_lsm_model[lev]->Lsm_FluxIndex(varname); }

◆ Get_FluxName()

std::string LandSurface::Get_FluxName ( const int &  varIdx)
inline
169 { return m_lsm_model[0]->Lsm_FluxName(varIdx); }

◆ Get_Lsm_Geom()

amrex::Geometry LandSurface::Get_Lsm_Geom ( const int &  lev)
inline
125 { return m_lsm_model[lev]->Lsm_Geom(); }

Referenced by Plot_Lsm_Data().

Here is the caller graph for this function:

◆ Get_LSM_Step()

int LandSurface::Get_LSM_Step ( const int &  lev) const
inline
196 { return m_lsm_model[lev]->Get_LSM_Step(); }

◆ Get_LSM_Update_Status()

bool LandSurface::Get_LSM_Update_Status ( const int &  lev)
inline
189 { return m_lsm_model[lev]->Get_Update_Status(); }

◆ get_model_lev()

template<class SurfModelType >
SurfModelType* LandSurface::get_model_lev ( const int &  lev)
inline
253  {
254  return static_cast<SurfModelType*>(m_lsm_model[lev].get());
255  }

◆ Get_WRFInputNames()

std::unordered_map<std::string,std::string>& LandSurface::Get_WRFInputNames ( )
inline
192 { return m_lsm_model[0]->Lsm_WRFInputNames(); }

◆ Has_Model()

bool LandSurface::Has_Model ( ) const
inline
119 { return !m_lsm_model.empty() && m_lsm_model[0] != nullptr; }

◆ Init()

void LandSurface::Init ( const int &  lev,
const amrex::MultiFab &  cons_in,
const amrex::Geometry &  geom,
const amrex::Geometry &  geom0,
amrex::Vector< amrex::BCRec > &  domain_bcs_type,
amrex::IntVect &  refRatio,
const amrex::Real dt_advance,
amrex::Vector< amrex::Vector< std::string >> &  nc_init_file 
)
inline
55  {
56  m_lsm_model[lev]->Init(lev, cons_in, geom, geom0,
57  domain_bcs_type, refRatio,
58  dt_advance, nc_init_file);
59  }

◆ Plot()

void LandSurface::Plot ( const int &  lev,
const int &  nstep 
)
inline
91  {
92  m_lsm_model[lev]->Plot_Landfile(nstep);
93  }

◆ Plot_Lsm_Data()

void LandSurface::Plot_Lsm_Data ( double  time,
int  finest_level,
const amrex::Vector< int > &  level_steps,
const amrex::Vector< amrex::IntVect > &  ref_ratio 
)
inline
215  {
216  // Note we must use finest_level here rather than m_lsm_model.size(), which is
217  // (max_level+1) -- the models at levels that have not (yet) been created
218  // have been allocated but not Define'd or Init'ed, so their data pointers
219  // are still null
220  int nlev = finest_level + 1;
221  int nvar = this->Get_Data_Size();
222  amrex::Vector<std::string> varnames;
223 
224  // Only write if we have valid pointers
225  if (this->Get_Data_Ptr(0,0)) {
226  varnames.resize(nvar);
227  m_lsm_geom_lev.resize(nlev);
228  m_lsm_data_lev.resize(nlev);
229  std::string plotfilename = amrex::Concatenate(plot_file_lsm, level_steps[0], 5);
230  for (int lev(0); lev<nlev; ++lev) {
231  m_lsm_geom_lev[lev] = this->Get_Lsm_Geom(lev);
232 
233  amrex::MultiFab* mf_lsm = this->Get_Data_Ptr(lev,0);
234  amrex::IntVect ng(0,0,0);
235  amrex::BoxArray ba = mf_lsm->boxArray();
236  amrex::DistributionMapping dm = mf_lsm->DistributionMap();
237  m_lsm_data_lev[lev].define(ba, dm, nvar, ng);
238  for (int n(0); n<nvar; ++n) {
239  mf_lsm = this->Get_Data_Ptr(lev,n);
240  amrex::MultiFab::Copy(m_lsm_data_lev[lev],*(mf_lsm),0,n,1,0);
241  if (lev==0) varnames[n] = this->Get_DataName(n);
242  }
243  }
244  WriteMultiLevelPlotfile (plotfilename, nlev, GetVecOfConstPtrs(m_lsm_data_lev),
245  varnames, m_lsm_geom_lev, static_cast<amrex::Real>(time),
246  level_steps, ref_ratio);
247  m_lsm_geom_lev.clear();
248  m_lsm_data_lev.clear();
249  }
250  }
amrex::Vector< amrex::Geometry > m_lsm_geom_lev
Definition: ERF_LandSurface.H:265
amrex::Geometry Get_Lsm_Geom(const int &lev)
Definition: ERF_LandSurface.H:125
amrex::Vector< amrex::MultiFab > m_lsm_data_lev
Definition: ERF_LandSurface.H:268
amrex::MultiFab * Get_Data_Ptr(const int &lev, const int &varIdx)
Definition: ERF_LandSurface.H:108
std::string plot_file_lsm
Definition: ERF_LandSurface.H:262
@ ng
Definition: ERF_Morrison.H:49
Here is the call graph for this function:

◆ Read_Lsm_Restart()

void LandSurface::Read_Lsm_Restart ( const int &  lev,
const std::string &  dir 
)
inline
208 { m_lsm_model[lev]->Read_Lsm_Restart(dir); }

◆ ReSize()

void LandSurface::ReSize ( const int &  nlev)
inline
28 { m_lsm_model.resize(nlev); }

Referenced by ERF::ERF_shared().

Here is the caller graph for this function:

◆ Set_Lev0_Data_Ptr()

void LandSurface::Set_Lev0_Data_Ptr ( const int &  lev)
inline
155  {
156  // Ensure the same type of model for copy in place of flux data
157  if ( (lev > 0) && typeid(m_lsm_model[lev]) == typeid(m_lsm_model[0]) ) {
158  int ndata = this->Get_Data_Size();
159  for (int varIdx(0); varIdx<ndata; ++varIdx) {
160  amrex::MultiFab* Lev0_Data_Ptr = this->Get_Data_Ptr(0, varIdx);
161  m_lsm_model[lev]->Lsm_Set_Lev0_Data_Ptr(varIdx, Lev0_Data_Ptr);
162  }
163  } else {
164  amrex::Abort("Differing types of land surface models across levels is not supported!");
165  }
166  }
Here is the call graph for this function:

◆ Set_Lev0_Flux_Ptr()

void LandSurface::Set_Lev0_Flux_Ptr ( const int &  lev)
inline
175  {
176  // Ensure the same type of model for copy in place of flux data
177  if ( (lev > 0) && typeid(m_lsm_model[lev]) == typeid(m_lsm_model[0]) ) {
178  int nflux = this->Get_Flux_Size();
179  for (int varIdx(0); varIdx<nflux; ++varIdx) {
180  amrex::MultiFab* Lev0_Flux_Ptr = this->Get_Flux_Ptr(0, varIdx);
181  m_lsm_model[lev]->Lsm_Set_Lev0_Flux_Ptr(varIdx, Lev0_Flux_Ptr);
182  }
183  } else {
184  amrex::Abort("Differing types of land surface models across levels is not supported!");
185  }
186  }
amrex::MultiFab * Get_Flux_Ptr(const int &lev, const int &varIdx)
Definition: ERF_LandSurface.H:122
int Get_Flux_Size()
Definition: ERF_LandSurface.H:131
Here is the call graph for this function:

◆ Set_LSM_Step()

void LandSurface::Set_LSM_Step ( const int &  lev,
int  step 
)
inline
199 { m_lsm_model[lev]->Set_LSM_Step(step); }

◆ SetModel()

template<class NewSurfModel >
void LandSurface::SetModel ( )
inline
33  {
34  for (int lev(0); lev<m_lsm_model.size(); ++lev) {
35  m_lsm_model[lev] = std::make_unique<NewSurfModel>();
36  }
37  }

◆ Update_Micro_Vars_Lev()

void LandSurface::Update_Micro_Vars_Lev ( const int &  lev,
amrex::MultiFab &  cons_in 
)
inline
97  {
98  m_lsm_model[lev]->Update_Micro_Vars(cons_in);
99  }

◆ Update_State_Vars_Lev()

void LandSurface::Update_State_Vars_Lev ( const int &  lev,
amrex::MultiFab &  cons_in 
)
inline
103  {
104  m_lsm_model[lev]->Update_State_Vars(cons_in);
105  }

◆ Write_Lsm_Restart()

void LandSurface::Write_Lsm_Restart ( const int &  lev,
const std::string &  dir 
) const
inline
205 { m_lsm_model[lev]->Write_Lsm_Restart(dir); }

Member Data Documentation

◆ m_lsm_data_lev

amrex::Vector<amrex::MultiFab> LandSurface::m_lsm_data_lev
private

Referenced by Plot_Lsm_Data().

◆ m_lsm_geom_lev

amrex::Vector<amrex::Geometry> LandSurface::m_lsm_geom_lev
private

Referenced by Plot_Lsm_Data().

◆ m_lsm_model

◆ plot_file_lsm

std::string LandSurface::plot_file_lsm {"plt_lsm_"}
private

Referenced by Plot_Lsm_Data().


The documentation for this class was generated from the following file: