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
41  t_flux = 0,
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  void
86  Plot_Landfile (const int& nstep) override;
87 
88  // Get state vars from lsm class
89  amrex::MultiFab*
90  Lsm_Data_Ptr (const int& varIdx) override
91  {
92  int lsmIdx = LsmDataMap[varIdx];
93  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_data_size && lsmIdx>=0);
94  return lsm_fab_data[lsmIdx].get();
95  }
96 
97  // Get flux vars from lsm class
98  amrex::MultiFab*
99  Lsm_Flux_Ptr (const int& varIdx) override
100  {
101  int lsmIdx = LsmFluxMap[varIdx];
102  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_flux_size && lsmIdx>=0);
103  return lsm_fab_flux[lsmIdx].get();
104  }
105 
106  // Get lsm geometry
107  amrex::Geometry
108  Lsm_Geom ( ) override { return m_lsm_geom; }
109 
110  // Get number of vars lsm class contains
111  int
112  Lsm_Data_Size () override { return NOAHMP::m_lsm_data_size; }
113 
114  // Get number of fluxes lsm class contains
115  int
116  Lsm_Flux_Size () override { return NOAHMP::m_lsm_flux_size; }
117 
118  // Get variable names
119  std::string
120  Lsm_DataName (const int& varIdx) override
121  {
122  int lsmIdx = LsmDataMap[varIdx];
123  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_data_size && lsmIdx>=0);
124  return LsmDataName[lsmIdx];
125  }
126 
127  // Get variable index from name
128  int
129  Lsm_DataIndex (std::string varname) override
130  {
131  int varIdx = -1;
132  std::string lc_varname = amrex::toLower(varname);
133  for (int idx(0); idx<LsmData_NOAHMP::NumVars; ++idx) {
134  if (lc_varname == amrex::toLower(LsmDataName[idx])) {
135  varIdx = idx;
136  }
137  }
138  return varIdx;
139  }
140 
141  // Get flux variable names
142  std::string
143  Lsm_FluxName (const int& varIdx) override
144  {
145  int lsmIdx = LsmFluxMap[varIdx];
146  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_flux_size && lsmIdx>=0);
147  return LsmFluxName[lsmIdx];
148  }
149 
150  // Get flux variable index from name
151  int
152  Lsm_FluxIndex (std::string varname) override
153  {
154  int varIdx = -1;
155  std::string lc_varname = amrex::toLower(varname);
156  for (int idx(0); idx<LsmFlux_NOAHMP::NumVars; ++idx) {
157  if (lc_varname == amrex::toLower(LsmFluxName[idx])) {
158  varIdx = idx;
159  }
160  }
161  return varIdx;
162  }
163 
164 private:
165  // number of lsm data variables
167 
168  // number of lsm flux variables
170 
171  // LsmData map (state indices -> LsmVar enum)
172  amrex::Vector<int> LsmDataMap;
173 
174  // LsmFlux map (state indices -> LsmFlux enum)
175  amrex::Vector<int> LsmFluxMap;
176 
177  // Lsm data names
178  amrex::Vector<std::string> LsmDataName;
179 
180  // Lsm flux names
181  amrex::Vector<std::string> LsmFluxName;
182 
183  // geometry for atmosphere
184  amrex::Geometry m_geom;
185 
186  // geometry for lsm
187  amrex::Geometry m_lsm_geom;
188 
189  // timestep
191 
192  // domain klo-1 or lsm khi
193  int khi_lsm;
194 
195  // Number of grid points in z
196  int m_nz_lsm = 1;
197 
198  // Size of grid spacing in z
200 
201  // LSM data variables
202  amrex::Array<FabPtr, LsmData_NOAHMP::NumVars> lsm_fab_data;
203 
204  // LSM data variables
205  amrex::Array<FabPtr, LsmFlux_NOAHMP::NumVars> lsm_fab_flux;
206 
207  // Vector to store NoahmpIO objects at a level
208  NoahmpIO_vector noahmpio_vect;
209 
210  // Plot frequency
211  int m_plot_int_1 = -1;
212 };
213 #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:129
std::string Lsm_DataName(const int &varIdx) override
Definition: ERF_NOAHMP.H:120
int khi_lsm
Definition: ERF_NOAHMP.H:193
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:143
int m_plot_int_1
Definition: ERF_NOAHMP.H:211
void Plot_Landfile(const int &nstep) override
Definition: ERF_NOAHMP.cpp:208
int Lsm_FluxIndex(std::string varname) override
Definition: ERF_NOAHMP.H:152
amrex::Array< FabPtr, LsmFlux_NOAHMP::NumVars > lsm_fab_flux
Definition: ERF_NOAHMP.H:205
amrex::Vector< std::string > LsmDataName
Definition: ERF_NOAHMP.H:178
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_NOAHMP.H:51
amrex::Vector< int > LsmDataMap
Definition: ERF_NOAHMP.H:172
void Init(const int &lev, const amrex::MultiFab &cons_in, const amrex::Geometry &geom, const amrex::Real &dt) override
Definition: ERF_NOAHMP.cpp:17
int Lsm_Flux_Size() override
Definition: ERF_NOAHMP.H:116
int Lsm_Data_Size() override
Definition: ERF_NOAHMP.H:112
amrex::Geometry Lsm_Geom() override
Definition: ERF_NOAHMP.H:108
NoahmpIO_vector noahmpio_vect
Definition: ERF_NOAHMP.H:208
int m_lsm_data_size
Definition: ERF_NOAHMP.H:166
virtual ~NOAHMP()=default
amrex::Geometry m_lsm_geom
Definition: ERF_NOAHMP.H:187
amrex::Array< FabPtr, LsmData_NOAHMP::NumVars > lsm_fab_data
Definition: ERF_NOAHMP.H:202
int m_nz_lsm
Definition: ERF_NOAHMP.H:196
int m_lsm_flux_size
Definition: ERF_NOAHMP.H:169
amrex::Vector< int > LsmFluxMap
Definition: ERF_NOAHMP.H:175
amrex::MultiFab * Lsm_Data_Ptr(const int &varIdx) override
Definition: ERF_NOAHMP.H:90
amrex::Vector< std::string > LsmFluxName
Definition: ERF_NOAHMP.H:181
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:216
amrex::Geometry m_geom
Definition: ERF_NOAHMP.H:184
amrex::Real m_dz_lsm
Definition: ERF_NOAHMP.H:199
amrex::MultiFab * Lsm_Flux_Ptr(const int &varIdx) override
Definition: ERF_NOAHMP.H:99
amrex::Real m_dt
Definition: ERF_NOAHMP.H:190
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:41
@ tau13
Definition: ERF_NOAHMP.H:43
@ q_flux
Definition: ERF_NOAHMP.H:42
@ NumVars
Definition: ERF_NOAHMP.H:45
@ tau23
Definition: ERF_NOAHMP.H:44
Definition: ERF_DataStruct.H:123