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 
54 namespace NoahmpInputComp {
55  enum {
56  u_phy = 0,
60  p8w,
62  glw,
64  NumComps
65  };
66 }
67 
68 namespace NoahmpOutputComp {
69  enum {
70  hfx = 0,
71  lh,
74  tsk,
80  NumComps
81  };
82 }
83 
84 class NOAHMP : public NullSurf {
85 
86  using FabPtr = std::shared_ptr<amrex::MultiFab>;
87 
88 public:
89  // Constructor
90  NOAHMP () {}
91 
92  // Destructor
93  virtual ~NOAHMP () = default;
94 
95  // Set thermo and grid properties
96  void
97  Define (SolverChoice& /*sc*/) override
98  {
99  // NOTE: We should parse constants from sc here if needed,
100  }
101 
102  // Initialize data structures
103  void
104  Init (const int& lev,
105  const amrex::MultiFab& cons_in,
106  const amrex::Geometry& geom,
107  const amrex::Real& dt) override;
108 
109  // Wrapper to do all the updating
110  void
111  Advance_With_State (const int& lev,
112  amrex::MultiFab& cons_in,
113  amrex::MultiFab& xvel_in,
114  amrex::MultiFab& yvel_in,
115  amrex::MultiFab* hfx3_out,
116  amrex::MultiFab* qfx3_out,
117  const amrex::Real& elapsed_time,
118  const amrex::Real& dt,
119  const int& nstep) override;
120 
121  void
122  Plot_Landfile (const int& nstep) override;
123 
124  // Get state vars from lsm class
125  amrex::MultiFab*
126  Lsm_Data_Ptr (const int& varIdx) override
127  {
128  int lsmIdx = LsmDataMap[varIdx];
129  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_data_size && lsmIdx>=0);
130  return lsm_fab_data[lsmIdx].get();
131  }
132 
133  // Get flux vars from lsm class
134  amrex::MultiFab*
135  Lsm_Flux_Ptr (const int& varIdx) override
136  {
137  int lsmIdx = LsmFluxMap[varIdx];
138  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_flux_size && lsmIdx>=0);
139  return lsm_fab_flux[lsmIdx].get();
140  }
141 
142  // Get lsm geometry
143  amrex::Geometry
144  Lsm_Geom ( ) override { return m_lsm_geom; }
145 
146  // Get number of vars lsm class contains
147  int
148  Lsm_Data_Size () override { return NOAHMP::m_lsm_data_size; }
149 
150  // Get number of fluxes lsm class contains
151  int
152  Lsm_Flux_Size () override { return NOAHMP::m_lsm_flux_size; }
153 
154  // Get variable names
155  std::string
156  Lsm_DataName (const int& varIdx) override
157  {
158  int lsmIdx = LsmDataMap[varIdx];
159  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_data_size && lsmIdx>=0);
160  return LsmDataName[lsmIdx];
161  }
162 
163  // Get variable index from name
164  int
165  Lsm_DataIndex (std::string varname) override
166  {
167  int varIdx = -1;
168  std::string lc_varname = amrex::toLower(varname);
169  for (int idx(0); idx<LsmData_NOAHMP::NumVars; ++idx) {
170  if (lc_varname == amrex::toLower(LsmDataName[idx])) {
171  varIdx = idx;
172  }
173  }
174  return varIdx;
175  }
176 
177  // Get flux variable names
178  std::string
179  Lsm_FluxName (const int& varIdx) override
180  {
181  int lsmIdx = LsmFluxMap[varIdx];
182  AMREX_ALWAYS_ASSERT(lsmIdx < NOAHMP::m_lsm_flux_size && lsmIdx>=0);
183  return LsmFluxName[lsmIdx];
184  }
185 
186  // Get flux variable index from name
187  int
188  Lsm_FluxIndex (std::string varname) override
189  {
190  int varIdx = -1;
191  std::string lc_varname = amrex::toLower(varname);
192  for (int idx(0); idx<LsmFlux_NOAHMP::NumVars; ++idx) {
193  if (lc_varname == amrex::toLower(LsmFluxName[idx])) {
194  varIdx = idx;
195  }
196  }
197  return varIdx;
198  }
199 
200 private:
201  // number of lsm data variables
203 
204  // number of lsm flux variables
206 
207  // LsmData map (state indices -> LsmVar enum)
208  amrex::Vector<int> LsmDataMap;
209 
210  // LsmFlux map (state indices -> LsmFlux enum)
211  amrex::Vector<int> LsmFluxMap;
212 
213  // Lsm data names
214  amrex::Vector<std::string> LsmDataName;
215 
216  // Lsm flux names
217  amrex::Vector<std::string> LsmFluxName;
218 
219  // geometry for atmosphere
220  amrex::Geometry m_geom;
221 
222  // geometry for lsm
223  amrex::Geometry m_lsm_geom;
224 
225  // timestep
227 
228  // domain klo-1 or lsm khi
229  int khi_lsm;
230 
231  // Number of grid points in z
232  int m_nz_lsm = 1;
233 
234  // Size of grid spacing in z
236 
237  // LSM data variables
238  amrex::Array<FabPtr, LsmData_NOAHMP::NumVars> lsm_fab_data;
239 
240  // LSM data variables
241  amrex::Array<FabPtr, LsmFlux_NOAHMP::NumVars> lsm_fab_flux;
242 
243  // Vector to store NoahmpIO objects at a level
244  NoahmpIO_vector noahmpio_vect;
245 
246  // Pinned memory buffers for host/device coupling to Noah-MP
247  amrex::Vector<std::unique_ptr<amrex::FArrayBox>> noahmp_input_tmp;
248  amrex::Vector<std::unique_ptr<amrex::FArrayBox>> noahmp_output_tmp;
249 
250  // Plot frequency
251  int m_plot_int_1 = -1;
252 };
253 #endif
constexpr amrex::Real one
Definition: ERF_Constants.H:7
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int idx(int i, int j, int k, int nx, int ny)
Definition: ERF_InitForEnsemble.cpp:287
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NOAHMP.H:84
int Lsm_DataIndex(std::string varname) override
Definition: ERF_NOAHMP.H:165
std::string Lsm_DataName(const int &varIdx) override
Definition: ERF_NOAHMP.H:156
int khi_lsm
Definition: ERF_NOAHMP.H:229
NOAHMP()
Definition: ERF_NOAHMP.H:90
void Define(SolverChoice &) override
Definition: ERF_NOAHMP.H:97
std::string Lsm_FluxName(const int &varIdx) override
Definition: ERF_NOAHMP.H:179
int m_plot_int_1
Definition: ERF_NOAHMP.H:251
void Plot_Landfile(const int &nstep) override
Definition: ERF_NOAHMP.cpp:224
int Lsm_FluxIndex(std::string varname) override
Definition: ERF_NOAHMP.H:188
amrex::Array< FabPtr, LsmFlux_NOAHMP::NumVars > lsm_fab_flux
Definition: ERF_NOAHMP.H:241
amrex::Vector< std::string > LsmDataName
Definition: ERF_NOAHMP.H:214
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_NOAHMP.H:86
amrex::Vector< int > LsmDataMap
Definition: ERF_NOAHMP.H:208
amrex::Vector< std::unique_ptr< amrex::FArrayBox > > noahmp_output_tmp
Definition: ERF_NOAHMP.H:248
amrex::Vector< std::unique_ptr< amrex::FArrayBox > > noahmp_input_tmp
Definition: ERF_NOAHMP.H:247
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:152
int Lsm_Data_Size() override
Definition: ERF_NOAHMP.H:148
amrex::Geometry Lsm_Geom() override
Definition: ERF_NOAHMP.H:144
NoahmpIO_vector noahmpio_vect
Definition: ERF_NOAHMP.H:244
int m_lsm_data_size
Definition: ERF_NOAHMP.H:202
virtual ~NOAHMP()=default
amrex::Geometry m_lsm_geom
Definition: ERF_NOAHMP.H:223
amrex::Array< FabPtr, LsmData_NOAHMP::NumVars > lsm_fab_data
Definition: ERF_NOAHMP.H:238
int m_nz_lsm
Definition: ERF_NOAHMP.H:232
int m_lsm_flux_size
Definition: ERF_NOAHMP.H:205
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 &elapsed_time, const amrex::Real &dt, const int &nstep) override
Definition: ERF_NOAHMP.cpp:232
amrex::Vector< int > LsmFluxMap
Definition: ERF_NOAHMP.H:211
amrex::MultiFab * Lsm_Data_Ptr(const int &varIdx) override
Definition: ERF_NOAHMP.H:126
amrex::Vector< std::string > LsmFluxName
Definition: ERF_NOAHMP.H:217
amrex::Geometry m_geom
Definition: ERF_NOAHMP.H:220
amrex::Real m_dz_lsm
Definition: ERF_NOAHMP.H:235
amrex::MultiFab * Lsm_Flux_Ptr(const int &varIdx) override
Definition: ERF_NOAHMP.H:135
amrex::Real m_dt
Definition: ERF_NOAHMP.H:226
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_NOAHMP.H:54
@ v_phy
Definition: ERF_NOAHMP.H:57
@ glw
Definition: ERF_NOAHMP.H:62
@ qv_curr
Definition: ERF_NOAHMP.H:59
@ u_phy
Definition: ERF_NOAHMP.H:56
@ coszen
Definition: ERF_NOAHMP.H:63
@ t_phy
Definition: ERF_NOAHMP.H:58
@ swdown
Definition: ERF_NOAHMP.H:61
@ p8w
Definition: ERF_NOAHMP.H:60
@ NumComps
Definition: ERF_NOAHMP.H:64
Definition: ERF_NOAHMP.H:68
@ hfx
Definition: ERF_NOAHMP.H:70
@ tau_ns
Definition: ERF_NOAHMP.H:73
@ tau_ew
Definition: ERF_NOAHMP.H:72
@ tsk
Definition: ERF_NOAHMP.H:74
@ albsfcdir_vis
Definition: ERF_NOAHMP.H:76
@ NumComps
Definition: ERF_NOAHMP.H:80
@ albsfcdif_nir
Definition: ERF_NOAHMP.H:79
@ emiss
Definition: ERF_NOAHMP.H:75
@ albsfcdif_vis
Definition: ERF_NOAHMP.H:78
@ albsfcdir_nir
Definition: ERF_NOAHMP.H:77
@ lh
Definition: ERF_NOAHMP.H:71
Definition: ERF_DataStruct.H:141