ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_EulerianMicrophysics.H
Go to the documentation of this file.
1 /*! @file ERF_EulerianMicrophysics.H
2  * \brief Contains the Eulerian microphysics class
3  */
4 
5 #ifndef ERF_EULERIANMICROPHYSICS_H
6 #define ERF_EULERIANMICROPHYSICS_H
7 
8 #include "ERF_NullMoist.H"
9 #include "ERF_SAM.H"
10 #include "ERF_Kessler.H"
11 #include "ERF_Morrison.H"
12 #include "ERF_WSM6.H"
13 #include "ERF_WDM6.H"
14 #include "ERF_SatAdj.H"
16 #include "ERF_Microphysics.H"
17 
18 /*! \brief Eulerian microphysics interface */
20 
21 public:
22 
23  /*! \brief Null constructor */
25 
26  /*! \brief default destructor */
27  ~EulerianMicrophysics () = default;
28 
29  /*! \brief Constructor: create the moisture model */
30  EulerianMicrophysics (const int& nlev, /*!< Number of AMR levels */
31  const MoistureType& a_model_type /*!< moisture model */)
32  {
33  AMREX_ASSERT( Microphysics::modelType(a_model_type) == MoistureModelType::Eulerian );
34  m_moist_model.resize(nlev);
35  if (a_model_type == MoistureType::SAM ||
36  a_model_type == MoistureType::SAM_NoIce ||
37  a_model_type == MoistureType::SAM_NoPrecip_NoIce) {
38  SetModel<SAM>();
39  } else if (a_model_type == MoistureType::Kessler ||
40  a_model_type == MoistureType::Kessler_NoRain) {
41  SetModel<Kessler>();
42  } else if (a_model_type == MoistureType::Morrison ||
43  a_model_type == MoistureType::Morrison_NoIce) {
44  SetModel<Morrison>();
45  } else if (a_model_type == MoistureType::WSM6) {
46  SetModel<WSM6>();
47  } else if (a_model_type == MoistureType::WDM6) {
48  SetModel<WDM6>();
49  } else if (a_model_type == MoistureType::SatAdj) {
50  SetModel<SatAdj>();
51  } else if (a_model_type == MoistureType::MoistNoCondensation) {
52  SetModel<MoistNoCondensation>();
53  } else if (a_model_type == MoistureType::None) {
54  SetModel<NullMoist>();
55  } else {
56  amrex::Abort("EulerianMicrophysics: Dont know this moisture_type!") ;
57  }
58  }
59 
60  /*! \brief Define the moisture model */
61  void Define (const int& lev, /*!< AMR level */
62  SolverChoice& sc /*!< Solver choice object */) override
63  {
64  m_moist_model[lev]->SetCurrentLevel(lev);
65  m_moist_model[lev]->Define(sc);
66  }
67 
68  /*! \brief Initialize the moisture model */
69  void Init (const int& lev, /*!< AMR level */
70  const amrex::MultiFab& cons_in, /*!< Conserved state variables */
71  const amrex::BoxArray& grids, /*!< Grids */
72  const amrex::Geometry& geom, /*!< Geometry */
73  const amrex::Real& dt_advance, /*!< Time step */
74  std::unique_ptr<amrex::MultiFab>& z_phys_nd, /*< Nodal z heights */
75  std::unique_ptr<amrex::MultiFab>& detJ_cc /*< CC Jacobian determinants */) override
76  {
77  m_moist_model[lev]->Init(cons_in, grids, geom, dt_advance,
78  z_phys_nd, detJ_cc);
79  }
80 
81  /*! \brief finish initializations steps that require flow variables */
82  virtual void FinishInit (const int&,
83  amrex::MultiFab&,
84  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& ) override { }
85 
86  /*! \brief Advance the moisture model for one time step */
87  void Advance (const int& lev, /*!< AMR level */
88  const amrex::Real& dt_advance, /*!< Time step */
89  const int&, /*!< iteration number */
90  const amrex::Real&, /*!< current time */
91  const SolverChoice &solverChoice, /*!< Solver choice object */
92  amrex::Vector<amrex::Vector<amrex::MultiFab>>&, /*!< Dycore state variables */
93  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>&, /*!< terrain */
94  const amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2>& ) override
95  {
96  m_moist_model[lev]->Advance(dt_advance, solverChoice);
97  }
98 
99  /*! \brief update microphysics variables from ERF state variables */
100  void Update_Micro_Vars_Lev (const int& lev, /*! AMR level */
101  amrex::MultiFab& cons_in, /*!< Conserved state variables */
102  const amrex::MultiFab* base_state = nullptr) override
103  {
104  m_moist_model[lev]->Update_Micro_Vars(cons_in, base_state);
105  }
106 
107  /*! \brief update ERF state variables from microphysics variables */
108  void Update_State_Vars_Lev (const int& lev, /*!< AMR level */
109  amrex::MultiFab& cons_in, /*!< Conserved state variables */
110  const amrex::MultiFab& z_phys_nd /*!< Nodal terrain heights */) override
111  {
112  m_moist_model[lev]->Update_State_Vars(cons_in, z_phys_nd);
113  }
114 
115  /*! \brief get pointer to a moisture variable */
116  amrex::MultiFab* Get_Qmoist_Ptr (const int& lev, /*!< AMR level */
117  const int& varIdx /*!< moisture variable index */) override
118  {
119  return m_moist_model[lev]->Qmoist_Ptr(varIdx);
120  }
121 
122  /*! \brief get the number of moisture model variables */
123  int Get_Qmoist_Size (const int& /* lev */) override
124  {
125  return m_moist_model[0]->Qmoist_Size();
126  }
127 
128  /*! \brief get the number of microphysics conserved moist (water-related) state variables */
129  int Get_Qstate_Moist_Size () override
130  {
131  return m_moist_model[0]->Qstate_Moist_Size();
132  }
133 
134  /*! \brief get the number of microphysics conserved moist (water-related) state variables that are number concentrations */
136  {
137  return m_moist_model[0]->Qstate_Moist_NumConc_Size();
138  }
139 
140  /*! \brief get the number of microphysics conserved non-moist (non-water, i.e., other vapor/condensed species) state variables */
141  int Get_Qstate_NonMoist_Size () override
142  {
143  return m_moist_model[0]->Qstate_NonMoist_Size();
144  }
145 
146  /*! \brief get the indices and names of moisture model variables for restart
147  at a given level */
148  void Get_Qmoist_Restart_Vars (const int a_lev, /*!< level */
149  const SolverChoice& a_sc, /*!< Solver choice object */
150  std::vector<int>& a_idx, /*!< indices */
151  std::vector<std::string>& a_names /*!< names */ ) const override
152  {
153  m_moist_model[a_lev]->Qmoist_Restart_Vars(a_sc, a_idx, a_names);
154  }
155 
156  /*! \brief Returns a list of additional plot variable names */
157  virtual void GetPlotVarNames (amrex::Vector<std::string>& a_vec) const override
158  {
159  m_moist_model[0]->GetPlotVarNames(a_vec);
160  }
161 
162  /*! \brief Fills in a MultiFab for plotting */
163  virtual void GetPlotVar (const std::string& a_name,
164  amrex::MultiFab& a_mf,
165  const int a_lev) const override
166  {
167  m_moist_model[a_lev]->GetPlotVar(a_name, a_mf);
168  }
169 
170  /*! \brief Populates dz_min in micro model for precipitation */
171  virtual void Set_dzmin (const int a_lev,
172  const amrex::Real dz_min) const override
173  {
174  m_moist_model[a_lev]->Set_dzmin(dz_min);
175  }
176 
177  /*! \brief Populates ERF's land/water mask in the micro model */
178  virtual void Set_Lmask (const int a_lev,
179  amrex::iMultiFab* lmask) const override
180  {
181  m_moist_model[a_lev]->Set_Lmask(lmask);
182  }
183 
185  Get_Surface_Precip_Accumulation_Ptrs (const int& lev) const override
186  {
187  return m_moist_model[lev]->Get_Surface_Precip_Accumulation_Ptrs(lev);
188  }
189 
190 protected:
191 
192  /*! \brief Create and set the specified moisture model */
193  template<class NewMoistModel>
194  void SetModel ()
195  {
196  for (int lev(0); lev<m_moist_model.size(); ++lev) {
197  m_moist_model[lev] = std::make_unique<NewMoistModel>();
198  }
199  }
200 
201 private:
202  amrex::Vector<std::unique_ptr<NullMoist>> m_moist_model; /*!< moisture model */
203 };
204 #endif
Contains the base class for microphysics.
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Eulerian microphysics interface.
Definition: ERF_EulerianMicrophysics.H:19
void Get_Qmoist_Restart_Vars(const int a_lev, const SolverChoice &a_sc, std::vector< int > &a_idx, std::vector< std::string > &a_names) const override
get the indices and names of moisture model variables for restart at a given level
Definition: ERF_EulerianMicrophysics.H:148
virtual void Set_dzmin(const int a_lev, const amrex::Real dz_min) const override
Populates dz_min in micro model for precipitation.
Definition: ERF_EulerianMicrophysics.H:171
void Update_State_Vars_Lev(const int &lev, amrex::MultiFab &cons_in, const amrex::MultiFab &z_phys_nd) override
update ERF state variables from microphysics variables
Definition: ERF_EulerianMicrophysics.H:108
void Update_Micro_Vars_Lev(const int &lev, amrex::MultiFab &cons_in, const amrex::MultiFab *base_state=nullptr) override
update microphysics variables from ERF state variables
Definition: ERF_EulerianMicrophysics.H:100
EulerianMicrophysics(const int &nlev, const MoistureType &a_model_type)
Constructor: create the moisture model.
Definition: ERF_EulerianMicrophysics.H:30
SurfacePrecipAccumulationSources Get_Surface_Precip_Accumulation_Ptrs(const int &lev) const override
get scheme-native surface precipitation accumulators and their kg/m^2 conversion factors
Definition: ERF_EulerianMicrophysics.H:185
~EulerianMicrophysics()=default
default destructor
amrex::Vector< std::unique_ptr< NullMoist > > m_moist_model
Definition: ERF_EulerianMicrophysics.H:202
amrex::MultiFab * Get_Qmoist_Ptr(const int &lev, const int &varIdx) override
get pointer to a moisture variable
Definition: ERF_EulerianMicrophysics.H:116
void Define(const int &lev, SolverChoice &sc) override
Define the moisture model.
Definition: ERF_EulerianMicrophysics.H:61
int Get_Qstate_NonMoist_Size() override
get the number of microphysics conserved non-moist (non-water, i.e., other vapor/condensed species) s...
Definition: ERF_EulerianMicrophysics.H:141
int Get_Qstate_Moist_NumConc_Size() override
get the number of microphysics conserved moist (water-related) state variables that are number concen...
Definition: ERF_EulerianMicrophysics.H:135
virtual void GetPlotVar(const std::string &a_name, amrex::MultiFab &a_mf, const int a_lev) const override
Fills in a MultiFab for plotting.
Definition: ERF_EulerianMicrophysics.H:163
void SetModel()
Create and set the specified moisture model.
Definition: ERF_EulerianMicrophysics.H:194
virtual void GetPlotVarNames(amrex::Vector< std::string > &a_vec) const override
Returns a list of additional plot variable names.
Definition: ERF_EulerianMicrophysics.H:157
virtual void FinishInit(const int &, amrex::MultiFab &, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &) override
finish initializations steps that require flow variables
Definition: ERF_EulerianMicrophysics.H:82
void Advance(const int &lev, const amrex::Real &dt_advance, const int &, const amrex::Real &, const SolverChoice &solverChoice, amrex::Vector< amrex::Vector< amrex::MultiFab >> &, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &, const amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &) override
Advance the moisture model for one time step.
Definition: ERF_EulerianMicrophysics.H:87
virtual void Set_Lmask(const int a_lev, amrex::iMultiFab *lmask) const override
Populates ERF's land/water mask in the micro model.
Definition: ERF_EulerianMicrophysics.H:178
void Init(const int &lev, const amrex::MultiFab &cons_in, const amrex::BoxArray &grids, const amrex::Geometry &geom, const amrex::Real &dt_advance, std::unique_ptr< amrex::MultiFab > &z_phys_nd, std::unique_ptr< amrex::MultiFab > &detJ_cc) override
Initialize the moisture model.
Definition: ERF_EulerianMicrophysics.H:69
int Get_Qmoist_Size(const int &) override
get the number of moisture model variables
Definition: ERF_EulerianMicrophysics.H:123
int Get_Qstate_Moist_Size() override
get the number of microphysics conserved moist (water-related) state variables
Definition: ERF_EulerianMicrophysics.H:129
EulerianMicrophysics()
Null constructor.
Definition: ERF_EulerianMicrophysics.H:24
Base class for microphysics interface.
Definition: ERF_Microphysics.H:17
static MoistureModelType modelType(const MoistureType a_moisture_type)
query if a specified moisture model is Eulerian or Lagrangian
Definition: ERF_Microphysics.H:121
Definition: ERF_DataStruct.H:662
Definition: ERF_SurfacePrecipitation.H:34