ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_MM5.H
Go to the documentation of this file.
1 #ifndef ERF_MM5_H
2 #define ERF_MM5_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_MM5 {
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 MM5 : public NullSurf {
27 
28  using FabPtr = std::shared_ptr<amrex::MultiFab>;
29 
30 public:
31  // Constructor
32  MM5 () {}
33 
34  // Destructor
35  virtual ~MM5 () = 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->AdvanceMM5();
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  AdvanceMM5 ();
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 < MM5::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 < MM5::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 MM5::m_lsm_size; }
104 
105  // Get variable names
106  std::string
107  Lsm_DataName (const int& varIdx) override
108  {
109  int lsmIdx = LsmVarMap[varIdx];
110  AMREX_ALWAYS_ASSERT(lsmIdx < MM5::m_lsm_size && lsmIdx>=0);
111  return LsmVarName[lsmIdx];
112  }
113 
114 private:
115  // number of lsm variables (theta)
116  int m_lsm_size = 1;
117 
118  // LsmVar map (state indices -> LsmVar enum)
119  amrex::Vector<int> LsmVarMap;
120 
121  // Lsm varnames
122  amrex::Vector<std::string> LsmVarName;
123 
124  // geometry for atmosphere
125  amrex::Geometry m_geom;
126 
127  // geometry for lsm
128  amrex::Geometry m_lsm_geom;
129 
130  // timestep
131  double m_dt;
132 
133  // domain klo-1 or lsm khi
134  int khi_lsm;
135 
136  // constants
137  // amrex::Real m_fac_cond;
138  // amrex::Real m_fac_fus;
139  // amrex::Real m_fac_sub;
140 
141  // independent variables
142  amrex::Array<FabPtr, LsmVar_MM5::NumVars> lsm_fab_vars;
143 
144  // flux array for conjugate transfer
145  amrex::Array<FabPtr, LsmVar_MM5::NumVars> lsm_fab_flux;
146 
147  // Vars that should be parsed
148  // ==========================
149  // Number of grid points in z
150  int m_nz_lsm = 30;
151 
152  // Size of grid spacing in z
153  amrex::Real m_dz_lsm = amrex::Real(0.1); // 3 [m] below surface
154 
155  // Specific heat
156  amrex::Real m_cp_soil = amrex::Real(1.26e6); // [J/m^3 K]
157 
158  // Conductivity
159  amrex::Real m_k_soil = amrex::Real(0.2); // dry soil [W/m K]
160 
161  // Theta Dirichlet value at lowest point below surface
163 
164  // Thermal diffusivity
166 };
167 #endif
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_MM5.H:26
amrex::Real m_cp_soil
Definition: ERF_MM5.H:156
void ComputeFluxes()
Definition: ERF_MM5.cpp:87
double m_dt
Definition: ERF_MM5.H:131
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_MM5.H:28
MM5()
Definition: ERF_MM5.H:32
amrex::Array< FabPtr, LsmVar_MM5::NumVars > lsm_fab_vars
Definition: ERF_MM5.H:142
amrex::Real m_d_soil
Definition: ERF_MM5.H:165
int m_lsm_size
Definition: ERF_MM5.H:116
amrex::Vector< int > LsmVarMap
Definition: ERF_MM5.H:119
void AdvanceMM5()
Definition: ERF_MM5.cpp:112
amrex::MultiFab * Lsm_Data_Ptr(const int &varIdx) override
Definition: ERF_MM5.H:81
std::string Lsm_DataName(const int &varIdx) override
Definition: ERF_MM5.H:107
amrex::Geometry m_lsm_geom
Definition: ERF_MM5.H:128
int khi_lsm
Definition: ERF_MM5.H:134
amrex::Array< FabPtr, LsmVar_MM5::NumVars > lsm_fab_flux
Definition: ERF_MM5.H:145
amrex::Real m_dz_lsm
Definition: ERF_MM5.H:153
amrex::MultiFab * Lsm_Flux_Ptr(const int &varIdx) override
Definition: ERF_MM5.H:90
amrex::Geometry m_geom
Definition: ERF_MM5.H:125
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_MM5.cpp:7
void Advance(const double &dt) override
Definition: ERF_MM5.H:59
int m_nz_lsm
Definition: ERF_MM5.H:150
void ComputeTsurf()
Definition: ERF_MM5.cpp:68
virtual ~MM5()=default
amrex::Real m_theta_dir
Definition: ERF_MM5.H:162
amrex::Vector< std::string > LsmVarName
Definition: ERF_MM5.H:122
amrex::Geometry Lsm_Geom() override
Definition: ERF_MM5.H:99
int Lsm_Data_Size() override
Definition: ERF_MM5.H:103
amrex::Real m_k_soil
Definition: ERF_MM5.H:159
void Define(SolverChoice &) override
Definition: ERF_MM5.H:39
Definition: ERF_NullSurf.H:10
Definition: ERF_MM5.H:17
@ NumVars
Definition: ERF_MM5.H:21
@ theta
Definition: ERF_MM5.H:20
Definition: ERF_DataStruct.H:141