ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_SLM.H
Go to the documentation of this file.
1 #ifndef ERF_SLM_H
2 #define ERF_SLM_H
3 
4 #include <string>
5 #include <vector>
6 #include <memory>
7 
8 #include <AMReX_FArrayBox.H>
9 #include <AMReX_Geometry.H>
10 #include <AMReX_MultiFabUtil.H>
11 
12 #include <ERF_NullSurf.H>
13 #include <ERF_IndexDefines.H>
14 #include <ERF_DataStruct.H>
15 
16 namespace LsmVar_SLM {
17  enum {
18  // independent variables
19  theta = 0,
20  NumVars
21  };
22 }
23 
24 /* See Chen & Dudhia (2001) https://doi.org/10.1175/1520-0493(2001)129<0569:CAALSH>2.0.CO;2 */
25 class SLM : public NullSurf {
26 
27  using FabPtr = std::shared_ptr<amrex::MultiFab>;
28 
29 public:
30  // Constructor
31  SLM () {}
32 
33  // Destructor
34  virtual ~SLM () = default;
35 
36  // Set thermo and grid properties
37  void
38  Define (SolverChoice& /*sc*/) override
39  {
40  // NOTE: We should parse things from sc here,
41  // but they are hard coded because this
42  // is a demonstration for now.
43  }
44 
45  // Initialize data structures
46  void
47  Init (const int& /*lev*/,
48  const amrex::MultiFab& cons_in,
49  const amrex::Geometry& geom,
50  const amrex::Geometry& /*geom0*/,
51  amrex::Vector<amrex::BCRec>& /*domain_bcs_type*/,
52  amrex::IntVect& /*refRatio*/,
53  const amrex::Real& dt,
54  amrex::Vector<amrex::Vector<std::string>>& /*nc_init_file*/) override;
55 
56  // Wrapper to do all the updating
57  void
58  Advance (const double& dt) override
59  {
60  m_dt = dt;
61  this->ComputeFluxes();
62  this->AdvanceSLM();
63  this->ComputeTsurf();
64  }
65 
66  // Compute surface temperature
67  void
68  ComputeTsurf ();
69 
70  // Compute diffusive fluxes
71  void
72  ComputeFluxes ();
73 
74  // Advance the lsm state vars
75  void
76  AdvanceSLM ();
77 
78  // Get state vars from lsm class
79  amrex::MultiFab*
80  Lsm_Data_Ptr (const int& varIdx) override
81  {
82  int lsmIdx = LsmVarMap[varIdx];
83  AMREX_ALWAYS_ASSERT(lsmIdx < SLM::m_lsm_size && lsmIdx>=0);
84  return lsm_fab_vars[lsmIdx].get();
85  }
86 
87  // Get flux vars from lsm class
88  amrex::MultiFab*
89  Lsm_Flux_Ptr (const int& varIdx) override
90  {
91  int lsmIdx = LsmVarMap[varIdx];
92  AMREX_ALWAYS_ASSERT(lsmIdx < SLM::m_lsm_size && lsmIdx>=0);
93  return lsm_fab_flux[lsmIdx].get();
94  }
95 
96  // Get lsm geometry
97  amrex::Geometry
98  Lsm_Geom ( ) override { return m_lsm_geom; }
99 
100  // Get number of vars lsm class contains
101  int
102  Lsm_Data_Size () override { return SLM::m_lsm_size; }
103 
104  // Get number of fluxes exchanged with the surface layer
105  int
106  Lsm_Flux_Size () override { return SLM::m_lsm_size; }
107 
108  // Get variable names
109  std::string
110  Lsm_DataName (const int& varIdx) override
111  {
112  int lsmIdx = LsmVarMap[varIdx];
113  AMREX_ALWAYS_ASSERT(lsmIdx < SLM::m_lsm_size && lsmIdx>=0);
114  return LsmVarName[lsmIdx];
115  }
116 
117  // Get flux variable names
118  std::string
119  Lsm_FluxName (const int& varIdx) override
120  {
122  return "soil_t_flux";
123  }
124 
125 private:
126  // number of lsm variables (theta)
127  int m_lsm_size = 1;
128 
129  // LsmVar map (state indices -> LsmVar enum)
130  amrex::Vector<int> LsmVarMap;
131 
132  // Lsm varnames
133  amrex::Vector<std::string> LsmVarName;
134 
135  // geometry for atmosphere
136  amrex::Geometry m_geom;
137 
138  // geometry for lsm
139  amrex::Geometry m_lsm_geom;
140 
141  // timestep
142  double m_dt;
143 
144  // domain klo-1 or lsm khi
145  int khi_lsm;
146 
147  // constants
148  // amrex::Real m_fac_cond;
149  // amrex::Real m_fac_fus;
150  // amrex::Real m_fac_sub;
151 
152  // independent variables
153  amrex::Array<FabPtr, LsmVar_SLM::NumVars> lsm_fab_vars;
154 
155  // flux array for conjugate transfer
156  amrex::Array<FabPtr, LsmVar_SLM::NumVars> lsm_fab_flux;
157 
158  // Vars that should be parsed
159  // ==========================
160  // Number of grid points in z
161  int m_nz_lsm = 30;
162 
163  // Size of grid spacing in z
164  amrex::Real m_dz_lsm = amrex::Real(0.1); // 3 [m] below surface
165 
166  // Specific heat
167  amrex::Real m_cp_soil = amrex::Real(1.26e6); // [J/m^3 K]
168 
169  // Conductivity
170  amrex::Real m_k_soil = amrex::Real(0.2); // dry soil [W/m K]
171 
172  // Theta Dirichlet value at lowest point below surface
174 
175  // Thermal diffusivity
177 };
178 #endif
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NullSurf.H:10
Definition: ERF_SLM.H:25
void ComputeTsurf()
Definition: ERF_SLM.cpp:68
amrex::MultiFab * Lsm_Flux_Ptr(const int &varIdx) override
Definition: ERF_SLM.H:89
SLM()
Definition: ERF_SLM.H:31
int khi_lsm
Definition: ERF_SLM.H:145
void Init(const int &, const amrex::MultiFab &cons_in, const amrex::Geometry &geom, const amrex::Geometry &, amrex::Vector< amrex::BCRec > &, amrex::IntVect &, const amrex::Real &dt, amrex::Vector< amrex::Vector< std::string >> &) override
Definition: ERF_SLM.cpp:7
virtual ~SLM()=default
amrex::Array< FabPtr, LsmVar_SLM::NumVars > lsm_fab_flux
Definition: ERF_SLM.H:156
amrex::Real m_cp_soil
Definition: ERF_SLM.H:167
amrex::Vector< std::string > LsmVarName
Definition: ERF_SLM.H:133
int m_lsm_size
Definition: ERF_SLM.H:127
double m_dt
Definition: ERF_SLM.H:142
void Advance(const double &dt) override
Definition: ERF_SLM.H:58
amrex::Real m_d_soil
Definition: ERF_SLM.H:176
amrex::Real m_dz_lsm
Definition: ERF_SLM.H:164
amrex::Array< FabPtr, LsmVar_SLM::NumVars > lsm_fab_vars
Definition: ERF_SLM.H:153
amrex::Geometry m_geom
Definition: ERF_SLM.H:136
int Lsm_Flux_Size() override
Definition: ERF_SLM.H:106
amrex::Geometry Lsm_Geom() override
Definition: ERF_SLM.H:98
amrex::MultiFab * Lsm_Data_Ptr(const int &varIdx) override
Definition: ERF_SLM.H:80
std::string Lsm_DataName(const int &varIdx) override
Definition: ERF_SLM.H:110
amrex::Real m_k_soil
Definition: ERF_SLM.H:170
void Define(SolverChoice &) override
Definition: ERF_SLM.H:38
void ComputeFluxes()
Definition: ERF_SLM.cpp:87
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_SLM.H:27
void AdvanceSLM()
Definition: ERF_SLM.cpp:112
std::string Lsm_FluxName(const int &varIdx) override
Definition: ERF_SLM.H:119
amrex::Geometry m_lsm_geom
Definition: ERF_SLM.H:139
int m_nz_lsm
Definition: ERF_SLM.H:161
int Lsm_Data_Size() override
Definition: ERF_SLM.H:102
amrex::Vector< int > LsmVarMap
Definition: ERF_SLM.H:130
amrex::Real m_theta_dir
Definition: ERF_SLM.H:173
Definition: ERF_SLM.H:16
@ NumVars
Definition: ERF_SLM.H:20
@ theta
Definition: ERF_SLM.H:19
Definition: ERF_DataStruct.H:662