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 LsmData_NOAHMP {
23  enum {
24  // 2D RRTMGP coupling vars
25  t_sfc = 0,
34  NumVars
35  };
36 }
37 
38 namespace LsmFlux_NOAHMP {
39  enum {
40  // 2D SurfaceLayer flux vars
45  NumVars
46  };
47 }
48 
49 class NOAHMP : public NullSurf {
50 
51  using FabPtr = std::shared_ptr<amrex::MultiFab>;
52 
53 public:
54  // Constructor
55  NOAHMP () {}
56 
57  // Destructor
58  virtual ~NOAHMP () = default;
59 
60  // Set thermo and grid properties
61  void
62  Define (SolverChoice& /*sc*/) override
63  {
64  // NOTE: We should parse constants from sc here if needed,
65  }
66 
67  // Initialize data structures
68  void
69  Init (const int& lev,
70  const amrex::MultiFab& cons_in,
71  const amrex::Geometry& geom,
72  const amrex::Real& dt) override;
73 
74  // Wrapper to do all the updating
75  void
76  Advance_With_State (const int& lev,
77  amrex::MultiFab& cons_in,
78  amrex::MultiFab& xvel_in,
79  amrex::MultiFab& yvel_in,
80  amrex::MultiFab* hfx3_out,
81  amrex::MultiFab* qfx3_out,
82  const amrex::Real& dt,
83  const int& nstep) override;
84 
85  // Get state vars from lsm class
86  amrex::MultiFab*
87  Lsm_Data_Ptr (const int& varIdx) override
88  {
89  int lsmIdx = LsmDataMap[varIdx];
90  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_data_size && lsmIdx>=0);
91  return lsm_fab_data[lsmIdx].get();
92  }
93 
94  // Get flux vars from lsm class
95  amrex::MultiFab*
96  Lsm_Flux_Ptr (const int& varIdx) override
97  {
98  int lsmIdx = LsmFluxMap[varIdx];
99  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_flux_size && lsmIdx>=0);
100  return lsm_fab_flux[lsmIdx].get();
101  }
102 
103  // Get lsm geometry
104  amrex::Geometry
105  Lsm_Geom ( ) override { return m_lsm_geom; }
106 
107  // Get number of vars lsm class contains
108  int
109  Lsm_Data_Size () override { return NOAHMP::m_lsm_data_size; }
110 
111  // Get number of fluxes lsm class contains
112  int
113  Lsm_Flux_Size () override { return NOAHMP::m_lsm_flux_size; }
114 
115  // Get variable names
116  std::string
117  Lsm_DataName (const int& varIdx) override
118  {
119  int lsmIdx = LsmDataMap[varIdx];
120  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_data_size && lsmIdx>=0);
121  return LsmDataName[lsmIdx];
122  }
123 
124  // Get variable index from name
125  int
126  Lsm_DataIndex (std::string varname) override
127  {
128  int varIdx = -1;
129  std::string lc_varname = amrex::toLower(varname);
130  for (int idx(0); idx<LsmData_NOAHMP::NumVars; ++idx) {
131  if (lc_varname == amrex::toLower(LsmDataName[idx])) {
132  varIdx = idx;
133  }
134  }
135  return varIdx;
136  }
137 
138  // Get flux variable names
139  std::string
140  Lsm_FluxName (const int& varIdx) override
141  {
142  int lsmIdx = LsmFluxMap[varIdx];
143  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_flux_size && lsmIdx>=0);
144  return LsmFluxName[lsmIdx];
145  }
146 
147  // Get flux variable index from name
148  int
149  Lsm_FluxIndex (std::string varname) override
150  {
151  int varIdx = -1;
152  std::string lc_varname = amrex::toLower(varname);
153  for (int idx(0); idx<LsmFlux_NOAHMP::NumVars; ++idx) {
154  if (lc_varname == amrex::toLower(LsmFluxName[idx])) {
155  varIdx = idx;
156  }
157  }
158  return varIdx;
159  }
160 
161 private:
162  // number of lsm data variables
164 
165  // number of lsm flux variables
167 
168  // LsmData map (state indices -> LsmVar enum)
169  amrex::Vector<int> LsmDataMap;
170 
171  // LsmFlux map (state indices -> LsmFlux enum)
172  amrex::Vector<int> LsmFluxMap;
173 
174  // Lsm data names
175  amrex::Vector<std::string> LsmDataName;
176 
177  // Lsm flux names
178  amrex::Vector<std::string> LsmFluxName;
179 
180  // geometry for atmosphere
181  amrex::Geometry m_geom;
182 
183  // geometry for lsm
184  amrex::Geometry m_lsm_geom;
185 
186  // timestep
188 
189  // domain klo-1 or lsm khi
190  int khi_lsm;
191 
192  // Number of grid points in z
193  int m_nz_lsm = 1;
194 
195  // Size of grid spacing in z
197 
198  // LSM data variables
199  amrex::Array<FabPtr, LsmData_NOAHMP::NumVars> lsm_fab_data;
200 
201  // LSM data variables
202  amrex::Array<FabPtr, LsmFlux_NOAHMP::NumVars> lsm_fab_flux;
203 
204  // Vector to store NoahmpIO objects at a level
205  NoahmpIO_vector noahmpio_vect;
206 
207  // Plot frequency
208  int m_plot_int_1 = -1;
209 };
210 #endif
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NOAHMP.H:49
int Lsm_DataIndex(std::string varname) override
Definition: ERF_NOAHMP.H:126
std::string Lsm_DataName(const int &varIdx) override
Definition: ERF_NOAHMP.H:117
int khi_lsm
Definition: ERF_NOAHMP.H:190
NOAHMP()
Definition: ERF_NOAHMP.H:55
void Define(SolverChoice &) override
Definition: ERF_NOAHMP.H:62
std::string Lsm_FluxName(const int &varIdx) override
Definition: ERF_NOAHMP.H:140
int m_plot_int_1
Definition: ERF_NOAHMP.H:208
int Lsm_FluxIndex(std::string varname) override
Definition: ERF_NOAHMP.H:149
amrex::Array< FabPtr, LsmFlux_NOAHMP::NumVars > lsm_fab_flux
Definition: ERF_NOAHMP.H:202
amrex::Vector< std::string > LsmDataName
Definition: ERF_NOAHMP.H:175
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_NOAHMP.H:51
amrex::Vector< int > LsmDataMap
Definition: ERF_NOAHMP.H:169
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_Flux_Size() override
Definition: ERF_NOAHMP.H:113
int Lsm_Data_Size() override
Definition: ERF_NOAHMP.H:109
amrex::Geometry Lsm_Geom() override
Definition: ERF_NOAHMP.H:105
NoahmpIO_vector noahmpio_vect
Definition: ERF_NOAHMP.H:205
int m_lsm_data_size
Definition: ERF_NOAHMP.H:163
virtual ~NOAHMP()=default
amrex::Geometry m_lsm_geom
Definition: ERF_NOAHMP.H:184
amrex::Array< FabPtr, LsmData_NOAHMP::NumVars > lsm_fab_data
Definition: ERF_NOAHMP.H:199
int m_nz_lsm
Definition: ERF_NOAHMP.H:193
int m_lsm_flux_size
Definition: ERF_NOAHMP.H:166
amrex::Vector< int > LsmFluxMap
Definition: ERF_NOAHMP.H:172
amrex::MultiFab * Lsm_Data_Ptr(const int &varIdx) override
Definition: ERF_NOAHMP.H:87
amrex::Vector< std::string > LsmFluxName
Definition: ERF_NOAHMP.H:178
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:207
amrex::Geometry m_geom
Definition: ERF_NOAHMP.H:181
amrex::Real m_dz_lsm
Definition: ERF_NOAHMP.H:196
amrex::MultiFab * Lsm_Flux_Ptr(const int &varIdx) override
Definition: ERF_NOAHMP.H:96
amrex::Real m_dt
Definition: ERF_NOAHMP.H:187
Definition: ERF_NullSurf.H:8
Definition: ERF_NOAHMP.H:22
@ sw_flux_dn
Definition: ERF_NOAHMP.H:32
@ sfc_emis
Definition: ERF_NOAHMP.H:26
@ sfc_alb_dir_vis
Definition: ERF_NOAHMP.H:27
@ sfc_alb_dif_nir
Definition: ERF_NOAHMP.H:30
@ lw_flux_dn
Definition: ERF_NOAHMP.H:33
@ cos_zenith_angle
Definition: ERF_NOAHMP.H:31
@ t_sfc
Definition: ERF_NOAHMP.H:25
@ NumVars
Definition: ERF_NOAHMP.H:34
@ sfc_alb_dir_nir
Definition: ERF_NOAHMP.H:28
@ sfc_alb_dif_vis
Definition: ERF_NOAHMP.H:29
Definition: ERF_NOAHMP.H:38
@ t_flux
Definition: ERF_NOAHMP.H:42
@ tau13
Definition: ERF_NOAHMP.H:43
@ q_flux
Definition: ERF_NOAHMP.H:41
@ NumVars
Definition: ERF_NOAHMP.H:45
@ tau23
Definition: ERF_NOAHMP.H:44
Definition: ERF_DataStruct.H:123