ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_LandSurface.H
Go to the documentation of this file.
1 #ifndef ERF_LANDSURFACE_H
2 #define ERF_LANDSURFACE_H
3 
4 #include <AMReX_PlotFileUtil.H>
5 #include <AMReX_MultiFabUtil.H>
6 
7 #include <ERF_NullSurf.H>
8 #include <ERF_SLM.H>
9 #include <ERF_MM5.H>
10 #include <ERF_OceanSurf.H>
11 
12 #if ERF_USE_NOAHMP
13 #include <ERF_NOAHMP.H>
14 #endif
15 
16 class LandSurface {
17 
18 public:
19 
20  LandSurface () { }
21 
22  ~LandSurface () = default;
23 
24  void
25  ReSize (const int& nlev) { m_lsm_model.resize(nlev); }
26 
27  template<class NewSurfModel>
28  void
30  {
31  for (int lev(0); lev<m_lsm_model.size(); ++lev) {
32  m_lsm_model[lev] = std::make_unique<NewSurfModel>();
33  }
34  }
35 
36  void
37  Define (const int& lev,
38  SolverChoice& sc)
39  {
40  m_lsm_model[lev]->Define(sc);
41  }
42 
43  void
44  Init (const int& lev,
45  const amrex::MultiFab& cons_in,
46  const amrex::Geometry& geom,
47  const amrex::Real& dt_advance)
48  {
49  m_lsm_model[lev]->Init(lev, cons_in, geom, dt_advance);
50  }
51 
52  void
53  Advance (const int& lev,
54  amrex::MultiFab& cons_in,
55  amrex::MultiFab& xvel_in,
56  amrex::MultiFab& yvel_in,
57  amrex::MultiFab* hfx3_out,
58  amrex::MultiFab* qfx3_out,
59  const amrex::Real& time,
60  const amrex::Real& dt_advance,
61  const int& nstep)
62  {
63  m_lsm_model[lev]->Advance_With_State(lev, cons_in, xvel_in, yvel_in,
64  hfx3_out, qfx3_out, time, dt_advance, nstep);
65  }
66 
67  void
68  Advance (const int& lev, const amrex::Real& dt_advance)
69  {
70  m_lsm_model[lev]->Advance(dt_advance);
71  }
72 
73  void
74  Plot(const int& lev, const int& nstep)
75  {
76  m_lsm_model[lev]->Plot_Landfile(nstep);
77  }
78 
79  void
80  Update_Micro_Vars_Lev (const int& lev, amrex::MultiFab& cons_in)
81  {
82  m_lsm_model[lev]->Update_Micro_Vars(cons_in);
83  }
84 
85  void
86  Update_State_Vars_Lev (const int& lev, amrex::MultiFab& cons_in)
87  {
88  m_lsm_model[lev]->Update_State_Vars(cons_in);
89  }
90 
91  amrex::MultiFab*
92  Get_Data_Ptr (const int& lev, const int& varIdx) { return m_lsm_model[lev]->Lsm_Data_Ptr(varIdx); }
93 
94  amrex::MultiFab*
95  Get_Flux_Ptr (const int& lev, const int& varIdx) { return m_lsm_model[lev]->Lsm_Flux_Ptr(varIdx); }
96 
97  amrex::Geometry
98  Get_Lsm_Geom (const int& lev ) { return m_lsm_model[lev]->Lsm_Geom(); }
99 
100  int
101  Get_Data_Size () { return m_lsm_model[0]->Lsm_Data_Size(); }
102 
103  int
104  Get_Flux_Size () { return m_lsm_model[0]->Lsm_Flux_Size(); }
105 
106  std::string
107  Get_DataName (const int& varIdx) { return m_lsm_model[0]->Lsm_DataName(varIdx); }
108 
109  int
110  Get_DataIdx (const int& lev, std::string& varname) { return m_lsm_model[lev]->Lsm_DataIndex(varname); }
111 
112  std::string
113  Get_FluxName (const int& varIdx) { return m_lsm_model[0]->Lsm_FluxName(varIdx); }
114 
115  int
116  Get_FluxIdx (const int& lev, std::string& varname) { return m_lsm_model[lev]->Lsm_FluxIndex(varname); }
117 
118  std::unordered_map<std::string,std::string>&
119  Get_WRFInputNames() { return m_lsm_model[0]->Lsm_WRFInputNames(); }
120 
121  // Scalar LSM step counter (e.g., NoahMP itimestep) for checkpoint/restart.
122  int
123  Get_LSM_Step (const int& lev) const { return m_lsm_model[lev]->Get_LSM_Step(); }
124 
125  void
126  Set_LSM_Step (const int& lev, int step) { m_lsm_model[lev]->Set_LSM_Step(step); }
127 
128  // Full LSM prognostic-state restart I/O (e.g., NoahMP soil/snow/canopy).
129  // Write is const (called from the const WriteCheckpointFile); it only
130  // serializes state, it does not mutate the ERF-side model wrapper.
131  void
132  Write_Lsm_Restart (const int& lev, const std::string& dir) const { m_lsm_model[lev]->Write_Lsm_Restart(dir); }
133 
134  void
135  Read_Lsm_Restart (const int& lev, const std::string& dir) { m_lsm_model[lev]->Read_Lsm_Restart(dir); }
136 
137  void
139  const amrex::Vector<int> &level_steps,
140  const amrex::Vector<amrex::IntVect> &ref_ratio)
141  {
142  int nlev = m_lsm_model.size();
143  int nvar = this->Get_Data_Size();
144  amrex::Vector<std::string> varnames;
145 
146  // Only write if we have valid pointers
147  if (this->Get_Data_Ptr(0,0)) {
148  varnames.resize(nvar);
149  m_lsm_geom_lev.resize(nlev);
150  m_lsm_data_lev.resize(nlev);
151  std::string plotfilename = amrex::Concatenate(plot_file_lsm, level_steps[0], 5);
152  for (int lev(0); lev<nlev; ++lev) {
153  m_lsm_geom_lev[lev] = this->Get_Lsm_Geom(lev);
154 
155  amrex::MultiFab* mf_lsm = this->Get_Data_Ptr(lev,0);
156  amrex::IntVect ng(0,0,0);
157  amrex::BoxArray ba = mf_lsm->boxArray();
158  amrex::DistributionMapping dm = mf_lsm->DistributionMap();
159  m_lsm_data_lev[lev].define(ba, dm, nvar, ng);
160  for (int n(0); n<nvar; ++n) {
161  mf_lsm = this->Get_Data_Ptr(lev,n);
162  amrex::MultiFab::Copy(m_lsm_data_lev[lev],*(mf_lsm),0,n,1,0);
163  if (lev==0) varnames[n] = this->Get_DataName(n);
164  }
165  }
166  WriteMultiLevelPlotfile (plotfilename, nlev, GetVecOfConstPtrs(m_lsm_data_lev),
167  varnames, m_lsm_geom_lev, time, level_steps, ref_ratio);
168  m_lsm_geom_lev.clear();
169  m_lsm_data_lev.clear();
170  }
171  }
172 
173  template<class SurfModelType>
174  SurfModelType* get_model_lev(const int &lev) {
175  return static_cast<SurfModelType*>(m_lsm_model[lev].get());
176  }
177 
178 private:
179  // lsm model at each level
180  amrex::Vector<std::unique_ptr<NullSurf>> m_lsm_model;
181 
182  // plotfile prefix
183  std::string plot_file_lsm {"plt_lsm_"};
184 
185  // Vector of geometry
186  amrex::Vector<amrex::Geometry> m_lsm_geom_lev;
187 
188  // Vector of data pointers
189  amrex::Vector<amrex::MultiFab> m_lsm_data_lev;
190 };
191 #endif
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_LandSurface.H:16
amrex::Vector< amrex::Geometry > m_lsm_geom_lev
Definition: ERF_LandSurface.H:186
std::unordered_map< std::string, std::string > & Get_WRFInputNames()
Definition: ERF_LandSurface.H:119
void Advance(const int &lev, const amrex::Real &dt_advance)
Definition: ERF_LandSurface.H:68
int Get_Data_Size()
Definition: ERF_LandSurface.H:101
amrex::Geometry Get_Lsm_Geom(const int &lev)
Definition: ERF_LandSurface.H:98
~LandSurface()=default
SurfModelType * get_model_lev(const int &lev)
Definition: ERF_LandSurface.H:174
void Read_Lsm_Restart(const int &lev, const std::string &dir)
Definition: ERF_LandSurface.H:135
int Get_FluxIdx(const int &lev, std::string &varname)
Definition: ERF_LandSurface.H:116
void Plot(const int &lev, const int &nstep)
Definition: ERF_LandSurface.H:74
void ReSize(const int &nlev)
Definition: ERF_LandSurface.H:25
amrex::Vector< amrex::MultiFab > m_lsm_data_lev
Definition: ERF_LandSurface.H:189
std::string Get_DataName(const int &varIdx)
Definition: ERF_LandSurface.H:107
void Plot_Lsm_Data(amrex::Real time, const amrex::Vector< int > &level_steps, const amrex::Vector< amrex::IntVect > &ref_ratio)
Definition: ERF_LandSurface.H:138
int Get_LSM_Step(const int &lev) const
Definition: ERF_LandSurface.H:123
std::string Get_FluxName(const int &varIdx)
Definition: ERF_LandSurface.H:113
amrex::Vector< std::unique_ptr< NullSurf > > m_lsm_model
Definition: ERF_LandSurface.H:180
void Set_LSM_Step(const int &lev, int step)
Definition: ERF_LandSurface.H:126
void SetModel()
Definition: ERF_LandSurface.H:29
amrex::MultiFab * Get_Flux_Ptr(const int &lev, const int &varIdx)
Definition: ERF_LandSurface.H:95
void Init(const int &lev, const amrex::MultiFab &cons_in, const amrex::Geometry &geom, const amrex::Real &dt_advance)
Definition: ERF_LandSurface.H:44
LandSurface()
Definition: ERF_LandSurface.H:20
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 amrex::Real &time, const amrex::Real &dt_advance, const int &nstep)
Definition: ERF_LandSurface.H:53
void Update_State_Vars_Lev(const int &lev, amrex::MultiFab &cons_in)
Definition: ERF_LandSurface.H:86
int Get_DataIdx(const int &lev, std::string &varname)
Definition: ERF_LandSurface.H:110
void Define(const int &lev, SolverChoice &sc)
Definition: ERF_LandSurface.H:37
int Get_Flux_Size()
Definition: ERF_LandSurface.H:104
amrex::MultiFab * Get_Data_Ptr(const int &lev, const int &varIdx)
Definition: ERF_LandSurface.H:92
void Write_Lsm_Restart(const int &lev, const std::string &dir) const
Definition: ERF_LandSurface.H:132
std::string plot_file_lsm
Definition: ERF_LandSurface.H:183
void Update_Micro_Vars_Lev(const int &lev, amrex::MultiFab &cons_in)
Definition: ERF_LandSurface.H:80
@ ng
Definition: ERF_Morrison.H:48
Definition: ERF_DataStruct.H:141