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