ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_Microphysics.H
Go to the documentation of this file.
1 /*! @file ERF_Microphysics.H
2  * \brief Contains the base class for microphysics
3  */
4 
5 #ifndef ERF_MICROPHYSICS_H
6 #define ERF_MICROPHYSICS_H
7 
8 #include <vector>
9 #include <string>
10 #include "ERF_DataStruct.H"
11 #include "ERF_IndexDefines.H"
12 
13 /*! \brief Base class for microphysics interface */
14 class Microphysics {
15 
16 public:
17 
18  /*! \brief Null constructor */
19  Microphysics () { }
20 
21  /*! \brief default destructor */
22  virtual ~Microphysics () = default;
23 
24  /*! \brief define the microphysics object */
25  virtual void Define (const int&, SolverChoice&) = 0;
26 
27  /*! \brief initialize the microphysics object */
28  virtual void Init (const int&,
29  const amrex::MultiFab&,
30  const amrex::BoxArray&,
31  const amrex::Geometry&,
32  const amrex::Real&,
33  std::unique_ptr<amrex::MultiFab>&,
34  std::unique_ptr<amrex::MultiFab>&) = 0;
35 
36  /*! \brief finish initializations steps that require flow variables */
37  virtual void FinishInit (const int&,
38  amrex::MultiFab&,
39  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& ) = 0;
40 
41  /*! \brief advance microphysics for one time step */
42  virtual void Advance (const int&,
43  const amrex::Real&,
44  const int&,
45  const amrex::Real&,
46  const SolverChoice&,
47  amrex::Vector<amrex::Vector<amrex::MultiFab>>&,
48  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>&,
49  const amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2>& ) = 0;
50 
51  /*! \brief update microphysics variables from ERF state variables */
52  virtual void Update_Micro_Vars_Lev (const int&, amrex::MultiFab&) = 0;
53 
54  /*! \brief update ERF state variables from microphysics variables */
55  virtual void Update_State_Vars_Lev (const int&, amrex::MultiFab&) = 0;
56 
57  /*! \brief get pointer to a moisture variable */
58  virtual amrex::MultiFab* Get_Qmoist_Ptr (const int&, const int&) = 0;
59 
60  /*! \brief get the number of moisture model variables */
61  virtual int Get_Qmoist_Size (const int&) = 0;
62 
63  /*! \brief get the number of microphysics conserved moist (water-related) state variables */
64  virtual int Get_Qstate_Moist_Size () = 0;
65 
66  /*! \brief get the number of microphysics conserved non-moist (non-water, i.e., other vapor/condensed species) state variables */
67  virtual int Get_Qstate_NonMoist_Size () = 0;
68 
69  /*! \brief get total number of conserved state variables */
70  inline int Get_Qstate_Size()
71  {
73  }
74 
75  /*! \brief get the indices and names of moisture model variables for restart
76  at a given level */
77  virtual void Get_Qmoist_Restart_Vars (int,
78  const SolverChoice&,
79  std::vector<int>&,
80  std::vector<std::string>& ) const = 0;
81 
82  /*! \brief Returns a list of additional plot variable names */
83  virtual void GetPlotVarNames (amrex::Vector<std::string>& a_vec) const = 0;
84 
85  /*! \brief Fills in a MultiFab for plotting */
86  virtual void GetPlotVar (const std::string& a_name,
87  amrex::MultiFab& a_mf,
88  const int a_lev) const = 0;
89 
90  /*! \brief Import minimum dz at this level */
91  virtual void Set_dzmin (const int lev,
92  const amrex::Real dz_min) const = 0;
93 
94  /*! \brief Define the nudging+set width for real BCs */
95  virtual void Set_RealWidth (const int lev,
96  const int real_width) const = 0;
97 
98  /*! \brief query if a specified moisture model is Eulerian or Lagrangian */
99  static MoistureModelType modelType (const MoistureType a_moisture_type)
100  {
101  if ( (a_moisture_type == MoistureType::SAM)
102  || (a_moisture_type == MoistureType::SAM_NoIce)
103  || (a_moisture_type == MoistureType::SAM_NoPrecip_NoIce)
104  || (a_moisture_type == MoistureType::Morrison)
105  || (a_moisture_type == MoistureType::Morrison_NoIce)
106  || (a_moisture_type == MoistureType::Kessler)
107  || (a_moisture_type == MoistureType::Kessler_NoRain)
108  || (a_moisture_type == MoistureType::SatAdj)
109  || (a_moisture_type == MoistureType::None) ) {
110  return MoistureModelType::Eulerian;
111  } else if ( (a_moisture_type == MoistureType::SuperDroplets) ) {
112  return MoistureModelType::Lagrangian;
113  } else {
114  amrex::Abort("Dont know this moisture_type!") ;
115  return MoistureModelType::Undefined;
116  }
117  }
118 private:
119 
120 };
121 #endif
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Base class for microphysics interface.
Definition: ERF_Microphysics.H:14
virtual int Get_Qmoist_Size(const int &)=0
get the number of moisture model variables
virtual ~Microphysics()=default
default destructor
virtual int Get_Qstate_NonMoist_Size()=0
get the number of microphysics conserved non-moist (non-water, i.e., other vapor/condensed species) s...
virtual void Define(const int &, SolverChoice &)=0
define the microphysics object
virtual void Init(const int &, const amrex::MultiFab &, const amrex::BoxArray &, const amrex::Geometry &, const amrex::Real &, std::unique_ptr< amrex::MultiFab > &, std::unique_ptr< amrex::MultiFab > &)=0
initialize the microphysics object
virtual void Update_State_Vars_Lev(const int &, amrex::MultiFab &)=0
update ERF state variables from microphysics variables
virtual int Get_Qstate_Moist_Size()=0
get the number of microphysics conserved moist (water-related) state variables
virtual void Update_Micro_Vars_Lev(const int &, amrex::MultiFab &)=0
update microphysics variables from ERF state variables
Microphysics()
Null constructor.
Definition: ERF_Microphysics.H:19
virtual amrex::MultiFab * Get_Qmoist_Ptr(const int &, const int &)=0
get pointer to a moisture variable
virtual void GetPlotVarNames(amrex::Vector< std::string > &a_vec) const =0
Returns a list of additional plot variable names.
virtual void Get_Qmoist_Restart_Vars(int, const SolverChoice &, std::vector< int > &, std::vector< std::string > &) const =0
get the indices and names of moisture model variables for restart at a given level
int Get_Qstate_Size()
get total number of conserved state variables
Definition: ERF_Microphysics.H:70
virtual void Set_dzmin(const int lev, const amrex::Real dz_min) const =0
Import minimum dz at this level.
static MoistureModelType modelType(const MoistureType a_moisture_type)
query if a specified moisture model is Eulerian or Lagrangian
Definition: ERF_Microphysics.H:99
virtual void FinishInit(const int &, amrex::MultiFab &, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &)=0
finish initializations steps that require flow variables
virtual void GetPlotVar(const std::string &a_name, amrex::MultiFab &a_mf, const int a_lev) const =0
Fills in a MultiFab for plotting.
virtual void Advance(const int &, const amrex::Real &, const int &, const amrex::Real &, const SolverChoice &, amrex::Vector< amrex::Vector< amrex::MultiFab >> &, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &, const amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &)=0
advance microphysics for one time step
virtual void Set_RealWidth(const int lev, const int real_width) const =0
Define the nudging+set width for real BCs.
Definition: ERF_DataStruct.H:129