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