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::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)
 
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)
 
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)
 
void Advance (const int &lev, const double &dt_advance_d)
 
void Advance (const int &lev, const amrex::Real &dt, const amrex::Real &time, const amrex::Real &start_time)
 
void Plot (const int &lev, const int &nstep)
 
void Update_Micro_Vars_Lev (const int &lev, amrex::MultiFab &cons_in)
 
void Update_Lsm_Vars_Lev (const int &lev, amrex::MultiFab &cons_in, amrex::MultiFab &u_in, amrex::MultiFab &v_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, const std::string &varname)
 
void Set_Source_Ptrs (const int &lev, const int &source_lev)
 
void Initialize_From_Source (const int &lev, const int &source_lev, const amrex::IntVect &ref_ratio, const LSMTransferMode mode)
 
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))
 
void Set_Lev0_Data_Ptr (const int &lev)
 
std::string Get_FluxName (const int &varIdx)
 
int Get_FluxIdx (const int &lev, const std::string &varname)
 
void Set_Lev0_Flux_Ptr (const int &lev)
 
bool Get_LSM_Update_Status (const int &lev)
 
bool Runs_Own_Land_Driver (const int &lev) const
 
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 (const PlotFileType plotfile_type, double time, const amrex::Vector< int > &level_steps, const amrex::Vector< amrex::IntVect > &ref_ratio, const int finest_level)
 
void set_LSM_precip_input (const int &lev, const amrex::MultiFab *precip_in)
 
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)
 
template<class SurfModelType >
SurfModelType * get_model_lev (const int &lev)
 
void WriteCheckpoint (const int &lev, const std::string &checkpointname) const
 
void ReadCheckpoint (const int &lev, const std::string &checkpointname)
 

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/3]

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,
amrex::MultiFab *  z_nd 
)
inline
94  {
95  amrex::Real time = static_cast<amrex::Real>(time_d);
96  amrex::Real dt_advance = static_cast<amrex::Real>(dt_advance_d);
97  m_lsm_model[lev]->Advance_With_State(lev, cons_in, xvel_in, yvel_in,
98  hfx3_out, qfx3_out,
99  precip_sources,
100  time, dt_advance, nstep,
101  updated_lev0, z_nd);
102  }
amrex::Real Real
Definition: ERF_ShocInterface.H:19
amrex::Vector< std::unique_ptr< NullSurf > > m_lsm_model
Definition: ERF_LandSurface.H:455

◆ Advance() [2/3]

void LandSurface::Advance ( const int &  lev,
const amrex::Real &  dt,
const amrex::Real &  time,
const amrex::Real &  start_time 
)
inline
113  {
114  m_lsm_model[lev]->Advance(dt, time, start_time);
115  }

◆ Advance() [3/3]

void LandSurface::Advance ( const int &  lev,
const double &  dt_advance_d 
)
inline
106  {
107  amrex::Real dt_advance = static_cast<amrex::Real>(dt_advance_d);
108  m_lsm_model[lev]->Advance(dt_advance);
109  }

◆ 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
142 { return m_lsm_model[lev]->Lsm_Data_Ptr(varIdx); }

Referenced by TwoStreamRadiation::advance(), 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
146  {
147  std::string name = varname;
148  const int index = m_lsm_model[lev]->Lsm_DataIndex(name);
149  return (index >= 0) ? m_lsm_model[lev]->Lsm_Data_Ptr(index) : nullptr;
150  }
std::string name
Definition: ERF_Plotfile2DCatalog.cpp:105

◆ Get_Data_Size()

int LandSurface::Get_Data_Size ( )
inline
162 { 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,
const std::string &  varname 
)
inline
186 { return m_lsm_model[lev]->Lsm_DataIndex(varname); }

Referenced by TwoStreamRadiation::advance().

Here is the caller graph for this function:

◆ Get_DataName()

std::string LandSurface::Get_DataName ( const int &  varIdx)
inline
168 { 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
172  {
173  amrex::Vector<std::string> names;
174  if (m_lsm_model.empty() || m_lsm_model[0] == nullptr) {
175  return names;
176  }
177  const int nvars = Get_Data_Size();
178  names.reserve(nvars);
179  for (int var = 0; var < nvars; ++var) {
180  names.push_back(Get_DataName(var));
181  }
182  return names;
183  }
@ nvars
Definition: ERF_DataStruct.H:194
int Get_Data_Size()
Definition: ERF_LandSurface.H:162
std::string Get_DataName(const int &varIdx)
Definition: ERF_LandSurface.H:168
Here is the call graph for this function:

◆ Get_Flux_Ptr()

amrex::MultiFab* LandSurface::Get_Flux_Ptr ( const int &  lev,
const int &  varIdx 
)
inline
156 { 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
165 { 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,
const std::string &  varname 
)
inline
285 { return m_lsm_model[lev]->Lsm_FluxIndex(varname); }

◆ Get_FluxName()

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

◆ Get_Lsm_Geom()

amrex::Geometry LandSurface::Get_Lsm_Geom ( const int &  lev)
inline
159 { 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
316 { return m_lsm_model[lev]->Get_LSM_Step(); }

◆ Get_LSM_Update_Status()

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

◆ get_model_lev()

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

◆ Get_WRFInputNames()

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

◆ Has_Model()

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

◆ Init() [1/2]

void LandSurface::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 
)
inline
58  {
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);
62  }

Referenced by Init().

Here is the caller graph for this function:

◆ Init() [2/2]

void LandSurface::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 
)
inline
72  {
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);
79  }
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
Here is the call graph for this function:

◆ Initialize_From_Source()

void LandSurface::Initialize_From_Source ( const int &  lev,
const int &  source_lev,
const amrex::IntVect &  ref_ratio,
const LSMTransferMode  mode 
)
inline

Initializes a level from a source level using the requested state mode.

227  {
228  Set_Source_Ptrs(lev, source_lev);
229  m_lsm_model[lev]->Lsm_Interpolate_From_Source(
230  m_lsm_model[source_lev]->Lsm_Atmos_Geom(),
231  m_lsm_model[source_lev]->Lsm_Geom(), ref_ratio, mode);
232  }
void Set_Source_Ptrs(const int &lev, const int &source_lev)
Definition: ERF_LandSurface.H:192
Here is the call graph for this function:

◆ Plot()

void LandSurface::Plot ( const int &  lev,
const int &  nstep 
)
inline
119  {
120  m_lsm_model[lev]->Plot_Landfile(nstep);
121  }

◆ Plot_Lsm_Data()

void LandSurface::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 
)
inline
335  {
336  // Note we must use finest_level here rather than m_lsm_model.size(), which is
337  // (max_level+1) -- the models at levels that have not (yet) been created
338  // have been allocated but not Define'd or Init'ed, so their data pointers
339  // are still null
340  int nlev = finest_level + 1;
341  int nlev_valid = finest_level + 1;
342  int nvar = this->Get_Data_Size();
343  amrex::Vector<std::string> varnames;
344 
345  // Only write if we have valid pointers
346  if (this->Get_Data_Ptr(0,0)) {
347  varnames.resize(nvar);
348  m_lsm_geom_lev.resize(nlev);
349  m_lsm_data_lev.resize(nlev);
350  std::string plotfilename = amrex::Concatenate(plot_file_lsm, level_steps[0], 5);
351  for (int lev = 0; lev <= finest_level; ++lev) {
352  m_lsm_geom_lev[lev] = this->Get_Lsm_Geom(lev);
353 
354  if (m_lsm_geom_lev[lev].Domain().isEmpty()) {
355  nlev_valid--;
356  continue;
357  }
358 
359  amrex::MultiFab* mf_lsm = this->Get_Data_Ptr(lev,0);
360  amrex::IntVect ng(0,0,0);
361  amrex::BoxArray ba = mf_lsm->boxArray();
362  amrex::DistributionMapping dm = mf_lsm->DistributionMap();
363  m_lsm_data_lev[lev].define(ba, dm, nvar, ng);
364  for (int n(0); n<nvar; ++n) {
365  mf_lsm = this->Get_Data_Ptr(lev,n);
366  amrex::MultiFab::Copy(m_lsm_data_lev[lev],*(mf_lsm),0,n,1,0);
367  if (lev==0) varnames[n] = this->Get_DataName(n);
368  }
369  }
370  if (plotfile_type == PlotFileType::Amrex
371 #ifdef ERF_USE_NETCDF
372  || plotfile_type == PlotFileType::Netcdf
373 #endif
374  ) {
375 #ifdef ERF_USE_NETCDF
376  // NetCDF output of the land-surface fields is not implemented yet, so fall back
377  // to the AMReX format -- which is what these plotfiles were before the plotfile
378  // type was consulted here -- rather than silently writing nothing at all.
379  warn_nc_lsm_plot_fallback(plotfile_type);
380 #endif
381  WriteMultiLevelPlotfile (plotfilename, nlev_valid, GetVecOfConstPtrs(m_lsm_data_lev),
382  varnames, m_lsm_geom_lev, static_cast<amrex::Real>(time),
383  level_steps, ref_ratio);
384  } else {
385  amrex::Abort("Dont know this plotfile_type");
386  }
387 
388  m_lsm_geom_lev.clear();
389  m_lsm_data_lev.clear();
390  }
391 
392  if (nlev_valid > 0 && m_lsm_model[0]->Lsm_Type() == LSM_Type::SLM)
393  {
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);
400  }
401  // For a NetCDF run writeSLM_Data has already written these fields itself, one file
402  // per level, so only the AMReX format is assembled here.
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);
405  }
406  }
407  }
amrex::Vector< amrex::Geometry > m_lsm_geom_lev
Definition: ERF_LandSurface.H:461
amrex::Geometry Get_Lsm_Geom(const int &lev)
Definition: ERF_LandSurface.H:159
amrex::Vector< amrex::MultiFab > m_lsm_data_lev
Definition: ERF_LandSurface.H:464
amrex::MultiFab * Get_Data_Ptr(const int &lev, const int &varIdx)
Definition: ERF_LandSurface.H:142
std::string plot_file_lsm
Definition: ERF_LandSurface.H:458
Definition: ERF_SLM.H:185
@ SLM
Definition: ERF_LSM_Types.H:8
@ ng
Definition: ERF_Morrison.H:50
Here is the call graph for this function:

◆ Read_Lsm_Restart()

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

◆ ReadCheckpoint()

void LandSurface::ReadCheckpoint ( const int &  lev,
const std::string &  checkpointname 
)
inline
433  {
434  m_lsm_model[lev]->ReadCheckpoint(lev, checkpointname);
435  }

◆ Remake_Level()

void LandSurface::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) 
)
inline

Rebuilds a land-surface level after ERF remakes its atmospheric grid.

251  {
252  const bool has_source = source_lev >= 0;
253  if (has_source) {
254  Set_Source_Ptrs(lev, source_lev);
255  }
256 
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
260  ? m_lsm_model[source_lev]->Lsm_Geom() : geom;
261  m_lsm_model[lev]->Lsm_Regrid_Level(
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);
265  }
Here is the call graph for this function:

◆ 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:

◆ Runs_Own_Land_Driver()

bool LandSurface::Runs_Own_Land_Driver ( const int &  lev) const
inline
306  {
307  return lev >= 0 && lev < static_cast<int>(m_lsm_model.size()) && m_lsm_model[lev] &&
308  m_lsm_model[lev]->Runs_Own_Land_Driver();
309  }

◆ Set_Lev0_Data_Ptr()

void LandSurface::Set_Lev0_Data_Ptr ( const int &  lev)
inline
268  {
269  // Ensure the same type of model for copy in place of flux data
270  if ( (lev > 0) && typeid(m_lsm_model[lev]) == typeid(m_lsm_model[0]) ) {
271  int ndata = this->Get_Data_Size();
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);
275  }
276  } else {
277  amrex::Abort("Differing types of land surface models across levels is not supported!");
278  }
279  }
Here is the call graph for this function:

◆ Set_Lev0_Flux_Ptr()

void LandSurface::Set_Lev0_Flux_Ptr ( const int &  lev)
inline
288  {
289  // Ensure the same type of model for copy in place of flux data
290  if ( (lev > 0) && typeid(m_lsm_model[lev]) == typeid(m_lsm_model[0]) ) {
291  int nflux = this->Get_Flux_Size();
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);
295  }
296  } else {
297  amrex::Abort("Differing types of land surface models across levels is not supported!");
298  }
299  }
amrex::MultiFab * Get_Flux_Ptr(const int &lev, const int &varIdx)
Definition: ERF_LandSurface.H:156
int Get_Flux_Size()
Definition: ERF_LandSurface.H:165
Here is the call graph for this function:

◆ set_LSM_precip_input()

void LandSurface::set_LSM_precip_input ( const int &  lev,
const amrex::MultiFab *  precip_in 
)
inline
411  {
412  m_lsm_model[lev]->set_precip_input(precip_in);
413  }
@ precip_in
Definition: ERF_SLM.H:134

◆ Set_LSM_Step()

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

◆ set_LSM_terrain_inputs()

void LandSurface::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 
)
inline
418  {
419  m_lsm_model[lev]->set_terrain_inputs(sst_in[lev], lmask_in[lev]);
420  }

◆ Set_Source_Ptrs()

void LandSurface::Set_Source_Ptrs ( const int &  lev,
const int &  source_lev 
)
inline

Registers a source level's exposed state with a destination level.

193  {
194  AMREX_ALWAYS_ASSERT(lev > 0);
195  AMREX_ALWAYS_ASSERT(source_lev >= 0);
196  AMREX_ALWAYS_ASSERT(m_lsm_model[lev]->Lsm_Type() == m_lsm_model[source_lev]->Lsm_Type());
197 
198  const int ndata = m_lsm_model[lev]->Lsm_Data_Size();
199  AMREX_ALWAYS_ASSERT(ndata == m_lsm_model[source_lev]->Lsm_Data_Size());
200  for (int varIdx(0); varIdx<ndata; ++varIdx) {
201  m_lsm_model[lev]->Lsm_Set_Source_Data_Ptr(
202  varIdx, m_lsm_model[source_lev]->Lsm_Data_Ptr(varIdx));
203  }
204 
205  const int nflux = m_lsm_model[lev]->Lsm_Flux_Size();
206  AMREX_ALWAYS_ASSERT(nflux == m_lsm_model[source_lev]->Lsm_Flux_Size());
207  for (int varIdx(0); varIdx<nflux; ++varIdx) {
208  m_lsm_model[lev]->Lsm_Set_Source_Flux_Ptr(
209  varIdx, m_lsm_model[source_lev]->Lsm_Flux_Ptr(varIdx));
210  }
211 
212  const int nunmapped = m_lsm_model[lev]->Lsm_Unmapped_Size();
213  AMREX_ALWAYS_ASSERT(nunmapped == m_lsm_model[source_lev]->Lsm_Unmapped_Size());
214  for (int varIdx(0); varIdx<nunmapped; ++varIdx) {
215  m_lsm_model[lev]->Lsm_Set_Source_Unmapped_Ptr(
216  varIdx, m_lsm_model[source_lev]->Lsm_Unmapped_Ptr(varIdx));
217  }
218  }
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)

Referenced by Initialize_From_Source(), and Remake_Level().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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_Lsm_Vars_Lev()

void LandSurface::Update_Lsm_Vars_Lev ( const int &  lev,
amrex::MultiFab &  cons_in,
amrex::MultiFab &  u_in,
amrex::MultiFab &  v_in 
)
inline
131  {
132  m_lsm_model[lev]->Update_Lsm_Vars(cons_in, u_in, v_in);
133  }

◆ Update_Micro_Vars_Lev()

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

◆ Update_State_Vars_Lev()

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

◆ Write_Lsm_Restart()

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

◆ WriteCheckpoint()

void LandSurface::WriteCheckpoint ( const int &  lev,
const std::string &  checkpointname 
) const
inline
428  {
429  m_lsm_model[lev]->WriteCheckpoint(lev, checkpointname);
430  }

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: