ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ERF_NOAH.H
Go to the documentation of this file.
1 #ifndef NOAH_H
2 #define NOAH_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 #include <AMReX_Vector.H>
12 #include <AMReX_MFIter.H>
13 
14 #include <ERF_NullSurf.H>
15 #include <ERF_Constants.H>
16 #include <ERF_IndexDefines.H>
17 #include <ERF_DataStruct.H>
18 
19 // External include from the noahmp library
20 #include <NoahmpIO.H>
21 
22 namespace LsmVar_NOAH {
23  enum {
24  // independent variables
25  theta = 0,
26  NumVars
27  };
28 }
29 
30 class NOAH : public NullSurf {
31 
32  using FabPtr = std::shared_ptr<amrex::MultiFab>;
33 
34 public:
35  // Constructor
36  NOAH () {}
37 
38  // Destructor
39  virtual ~NOAH () = default;
40 
41  // Set thermo and grid properties
42  void
43  Define (SolverChoice& /*sc*/) override
44  {
45  // NOTE: We should parse things from sc here,
46  // but they are hard coded because this
47  // is a demonstration for now.
48  }
49 
50  // Initialize data structures
51  void
52  Init (const amrex::MultiFab& cons_in,
53  const amrex::Geometry& geom,
54  const amrex::Real& dt) override;
55 
56  // Wrapper to do all the updating
57  void
58  Advance (const int& lev,
59  amrex::MultiFab& cons_in,
60  amrex::MultiFab& xvel_in,
61  amrex::MultiFab& yvel_in,
62  amrex::MultiFab* hfx3_out,
63  amrex::MultiFab* qfx3_out,
64  const amrex::Real& dt,
65  const int& nstep) override;
66 
67  // Get state vars from lsm class
68  amrex::MultiFab*
69  Lsm_Data_Ptr (const int& varIdx) override
70  {
71  int lsmIdx = LsmVarMap[varIdx];
72  AMREX_ALWAYS_ASSERT(lsmIdx < NOAH::m_lsm_size && lsmIdx>=0);
73  return lsm_fab_vars[lsmIdx].get();
74  }
75 
76  // Get flux vars from lsm class
77  amrex::MultiFab*
78  Lsm_Flux_Ptr (const int& varIdx) override
79  {
80  int lsmIdx = LsmVarMap[varIdx];
81  AMREX_ALWAYS_ASSERT(lsmIdx < NOAH::m_lsm_size && lsmIdx>=0);
82  return lsm_fab_flux[lsmIdx].get();
83  }
84 
85  // Get lsm geometry
86  amrex::Geometry
87  Lsm_Geom ( ) override { return m_lsm_geom; }
88 
89  // Get number of vars lsm class contains
90  int
91  Lsm_Data_Size () override { return NOAH::m_lsm_size; }
92 
93  // Get variable names
94  std::string
95  Lsm_VarName (const int& varIdx) override
96  {
97  int lsmIdx = LsmVarMap[varIdx];
98  AMREX_ALWAYS_ASSERT(lsmIdx < NOAH::m_lsm_size && lsmIdx>=0);
99  return LsmVarName[lsmIdx];
100  }
101 
102 private:
103  // number of lsm variables (theta)
104  int m_lsm_size = 1;
105 
106  // LsmVar map (state indices -> LsmVar enum)
107  amrex::Vector<int> LsmVarMap;
108 
109  // Lsm varnames
110  amrex::Vector<std::string> LsmVarName;
111 
112  // geometry for atmosphere
113  amrex::Geometry m_geom;
114 
115  // geometry for lsm
116  amrex::Geometry m_lsm_geom;
117 
118  // timestep
119  amrex::Real m_dt;
120 
121  // domain klo-1 or lsm khi
122  int khi_lsm;
123 
124  // constants
125  // amrex::Real m_fac_cond;
126  // amrex::Real m_fac_fus;
127  // amrex::Real m_fac_sub;
128  // amrex::Real m_gOcp;
129 
130  // independent variables
131  amrex::Array<FabPtr, LsmVar_NOAH::NumVars> lsm_fab_vars;
132 
133  // flux array for conjugate transfer
134  amrex::Array<FabPtr, LsmVar_NOAH::NumVars> lsm_fab_flux;
135 
136  // Vars that should be parsed
137  // ==========================
138  // Number of grid points in z
139  int m_nz_lsm = 30;
140 
141  // Size of grid spacing in z
142  amrex::Real m_dz_lsm = 0.1; // 3 [m] below surface
143 
144  // Specific heat
145  amrex::Real m_cp_soil = 1.26e6; // [J/m^3 K]
146 
147  // Conductivity
148  amrex::Real m_k_soil = 0.2; // dry soil [W/m K]
149 
150  // Theta Dirichlet value at lowest point below surface
151  amrex::Real m_theta_dir = 400.0; // [K]
152 
153  // Thermal diffusivity
154  amrex::Real m_d_soil = m_k_soil / m_cp_soil; // [m^2/s]
155 
156  // Vector to store NoahmpIO objects at a level
157  NoahmpIO_vector noahmpio_vect;
158 };
159 #endif
Definition: ERF_NOAH.H:30
virtual ~NOAH()=default
int m_lsm_size
Definition: ERF_NOAH.H:104
std::string Lsm_VarName(const int &varIdx) override
Definition: ERF_NOAH.H:95
amrex::Vector< std::string > LsmVarName
Definition: ERF_NOAH.H:110
amrex::MultiFab * Lsm_Data_Ptr(const int &varIdx) override
Definition: ERF_NOAH.H:69
amrex::Array< FabPtr, LsmVar_NOAH::NumVars > lsm_fab_flux
Definition: ERF_NOAH.H:134
amrex::Vector< int > LsmVarMap
Definition: ERF_NOAH.H:107
amrex::Real m_dz_lsm
Definition: ERF_NOAH.H:142
amrex::MultiFab * Lsm_Flux_Ptr(const int &varIdx) override
Definition: ERF_NOAH.H:78
int m_nz_lsm
Definition: ERF_NOAH.H:139
amrex::Real m_cp_soil
Definition: ERF_NOAH.H:145
amrex::Geometry Lsm_Geom() override
Definition: ERF_NOAH.H:87
amrex::Real m_d_soil
Definition: ERF_NOAH.H:154
NOAH()
Definition: ERF_NOAH.H:36
amrex::Real m_theta_dir
Definition: ERF_NOAH.H:151
amrex::Array< FabPtr, LsmVar_NOAH::NumVars > lsm_fab_vars
Definition: ERF_NOAH.H:131
int Lsm_Data_Size() override
Definition: ERF_NOAH.H:91
amrex::Real m_k_soil
Definition: ERF_NOAH.H:148
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 &dt, const int &nstep) override
Definition: ERF_NOAH.cpp:171
int khi_lsm
Definition: ERF_NOAH.H:122
amrex::Geometry m_geom
Definition: ERF_NOAH.H:113
amrex::Geometry m_lsm_geom
Definition: ERF_NOAH.H:116
amrex::Real m_dt
Definition: ERF_NOAH.H:119
void Init(const amrex::MultiFab &cons_in, const amrex::Geometry &geom, const amrex::Real &dt) override
Definition: ERF_NOAH.cpp:15
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_NOAH.H:32
void Define(SolverChoice &) override
Definition: ERF_NOAH.H:43
NoahmpIO_vector noahmpio_vect
Definition: ERF_NOAH.H:157
Definition: ERF_NullSurf.H:8
Definition: ERF_NOAH.H:22
@ NumVars
Definition: ERF_NOAH.H:26
@ theta
Definition: ERF_NOAH.H:25
Definition: ERF_DataStruct.H:86