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