ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_LagrangianMicrophysics.H
Go to the documentation of this file.
1 /*! @file ERF_LagrangianMicrophysics.H
2  * \brief Contains the Lagrangian microphysics class
3  */
4 
5 #ifndef ERF_LAGRANGIANMICROPHYSICS_H
6 #define ERF_LAGRANGIANMICROPHYSICS_H
7 
8 #ifdef ERF_USE_PARTICLES
9 
10 #include <utility>
11 #include <string>
12 
14 #include "ERF_SuperDropletsMoist.H"
15 #include "ERF_Microphysics.H"
16 
17 /* forward declaration */
18 class ERFPC;
19 
20 /*! \brief Lagrangian microphysics interface sharing a particle container
21  * across AMR levels, with per-level Eulerian coupling fields. */
22 class LagrangianMicrophysics : public Microphysics {
23 
24 public:
25 
26  /*! \brief Null constructor */
27  LagrangianMicrophysics () { }
28 
29  /*! \brief default destructor */
30  ~LagrangianMicrophysics () = default;
31 
32  /*! \brief Constructor: create the moisture model */
33  LagrangianMicrophysics (const int& /* nlev */, /*!< Number of AMR levels */
34  const MoistureType& a_model_type /*!< moisture model */ )
35  {
36  AMREX_ASSERT( Microphysics::modelType(a_model_type) == MoistureModelType::Lagrangian );
37  if (a_model_type == MoistureType::SuperDroplets) {
38  SetModel<SuperDropletsMoist>();
39  amrex::Print() << "Super-Droplets moisture model!\n";
40  } else {
41  amrex::Abort("Unknown Lagrangian moisture model!") ;
42  }
43  }
44 
45  /*! \brief Define the moisture model */
46  void Define (const int& lev, /*!< AMR level */
47  SolverChoice& sc /*!< Solver choice object */) override
48  {
49  if (lev > 0) return;
50  m_moist_model->Define(sc);
51  }
52 
53  /*! \brief Initialize the moisture model */
54  void Init (const int& lev, /*!< AMR level */
55  const amrex::MultiFab& cons_in, /*!< Conserved state variables */
56  const amrex::BoxArray& grids, /*!< Grids */
57  const amrex::Geometry& geom, /*!< Geometry */
58  const amrex::Real& dt_advance, /*!< Time step */
59  std::unique_ptr<amrex::MultiFab>& z_phys_nd,/*< Nodal z heights */
60  std::unique_ptr<amrex::MultiFab>& detJ_cc /*< CC Jacobian determinants */) override
61  {
62  if (lev == 0) {
63  m_moist_model->Init(cons_in, grids, geom, dt_advance,
64  z_phys_nd, detJ_cc);
65  } else {
66  m_moist_model->InitLevel(lev, cons_in);
67  }
68  }
69 
70  /*! \brief finish initializations steps that require flow variables */
71  void FinishInit (const int& lev, /*!< AMR level */
72  amrex::MultiFab& cons_in, /*!< Conserved state variable */
73  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& z_phys_nd /*!< terrain */) override
74  {
75  m_moist_model->SetCurrentLevel(lev);
76  m_moist_model->FinishInit( lev, cons_in, z_phys_nd );
77  }
78 
79  /*! \brief Advance the moisture model for one time step */
80  void Advance (const int& lev, /*!< AMR level */
81  const amrex::Real& dt_advance, /*!< Time step */
82  const int& iter, /*!< iteration number */
83  const amrex::Real& time, /*!< current time */
84  const SolverChoice& /*solverChoice*/, /*!< Solver choice object */
85  amrex::Vector<amrex::Vector<amrex::MultiFab>>& a_vars, /*!< Dycore state variables */
86  const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& a_z/*!< terrain */,
87  const amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2>& a_phys_bc_types ) override
88  {
89  m_moist_model->SetCurrentLevel(lev);
90  m_moist_model->Advance(dt_advance, iter, time, a_vars, a_z, a_phys_bc_types);
91  }
92 
93  /*! \brief update microphysics variables from ERF state variables */
94  void Update_Micro_Vars_Lev (const int& lev, /*! AMR level */
95  amrex::MultiFab& cons_in, /*!< Conserved state variables */
96  const amrex::MultiFab* base_state = nullptr) override
97  {
98  m_moist_model->SetCurrentLevel(lev);
99  m_moist_model->Update_Micro_Vars(cons_in, base_state);
100  }
101 
102  /*! \brief update ERF state variables from microphysics variables */
103  void Update_State_Vars_Lev (const int& lev, /*!< AMR level */
104  amrex::MultiFab& cons_in, /*!< Conserved state variables */
105  const amrex::MultiFab& z_phys_nd /*!< Nodal terrain heights */) override
106  {
107  m_moist_model->SetCurrentLevel(lev);
108  m_moist_model->Update_State_Vars(cons_in, z_phys_nd);
109  }
110 
111  /*! \brief average down moisture multifabs from finest_level to 0 */
112  void AverageDownMicroVars (const int finest_level) override
113  {
114  m_moist_model->AverageDownMicroVars(finest_level);
115  }
116 
117  void Update_Diagnostic_State_Lev (const int& lev, amrex::MultiFab& cons,
118  const amrex::MultiFab& z) override
119  {
120  m_moist_model->SetCurrentLevel(lev);
121  m_moist_model->Update_Diagnostic_State(cons, z);
122  }
123 
124  /*! \brief get pointer to a moisture variable */
125  amrex::MultiFab* Get_Qmoist_Ptr (const int& lev, /*!< AMR level */
126  const int& varIdx /*!< moisture variable index */) override
127  {
128  m_moist_model->SetCurrentLevel(lev);
129  return m_moist_model->Qmoist_Ptr(varIdx);
130  }
131 
132  /*! \brief get the number of moisture model variables */
133  int Get_Qmoist_Size (const int& /*a_lev*/ /*!< AMR level */) override
134  {
135  return m_moist_model->Qmoist_Size();
136  }
137 
138  /*! \brief get the number of microphysics conserved moist (water-related) state variables */
139  int Get_Qstate_Moist_Size () override
140  {
141  return m_moist_model->Qstate_Moist_Size();
142  }
143 
144  /*! \brief get the number of microphysics conserved moist (water-related) state variables that are number concentrations */
145  int Get_Qstate_Moist_NumConc_Size () override
146  {
147  return m_moist_model->Qstate_Moist_NumConc_Size();
148  }
149 
150  /*! \brief get the number of microphysics conserved non-moist (non-water, i.e., other vapor/condensed species) state variables */
151  int Get_Qstate_NonMoist_Size () override
152  {
153  return m_moist_model->Qstate_NonMoist_Size();
154  }
155 
156  bool Qstate_Is_Diagnostic (int q) const override
157  {
158  return m_moist_model->Qstate_Is_Diagnostic(q);
159  }
160 
162  Get_Surface_Precip_Accumulation_Ptrs (const int& lev) const override
163  {
164  return m_moist_model->Get_Surface_Precip_Accumulation_Ptrs(lev);
165  }
166 
167  /*! \brief initialize particles in particle container at level a_lev */
168  inline void initParticles ( const int a_lev, /*!< AMR level */
169  std::unique_ptr<amrex::MultiFab>& z_phys_nd /*!< Nodal z heights at level a_lev */ )
170  {
171  m_moist_model->InitParticles(a_lev, z_phys_nd);
172  }
173 
174  /*! \brief restart particles in particle container */
175  inline void restartParticles ( amrex::ParGDBBase* a_gdb, const std::string& a_fname)
176  {
177  m_moist_model->RestartParticles(a_gdb, a_fname);
178  }
179 
180  /*! \brief get the particle container from the moisture model */
181  inline ERFPC* getParticleContainer () const
182  {
183  return m_moist_model->getParticleContainer();
184  }
185 
186  /*! \brief get the name of the moisture model's particle container */
187  inline const std::string& getName () const
188  {
189  return m_moist_model->getName();
190  }
191 
192  /*! \brief get the indices and names of moisture model variables for restart
193  at a given level */
194  void Get_Qmoist_Restart_Vars ( const int a_lev, /*!< level */
195  const SolverChoice& a_sc, /*!< Solver choice object */
196  std::vector<int>& a_idx, /*!< indices */
197  std::vector<std::string>& a_names /*!< names */ ) const override
198  {
199  if (a_lev == 0) {
200  m_moist_model->Qmoist_Restart_Vars( a_sc, a_idx, a_names );
201  } else {
202  a_idx.clear();
203  a_names.clear();
204  }
205  }
206 
207  /*! \brief Returns a list of additional plot variable names */
208  virtual void GetPlotVarNames (amrex::Vector<std::string>& a_vec) const override
209  {
210  m_moist_model->GetPlotVarNames(a_vec);
211  }
212 
213  /*! \brief Fills in a MultiFab for plotting */
214  virtual void GetPlotVar (const std::string& a_name,
215  amrex::MultiFab& a_mf,
216  const int a_lev) const override
217  {
218  m_moist_model->SetCurrentLevel(a_lev);
219  m_moist_model->GetPlotVar(a_name, a_mf, a_lev);
220  }
221 
222  /*! \brief get the diagnostics interval */
223  inline int getDiagnosticsInterval () const
224  {
225  return m_moist_model->getDiagnosticsInterval();
226  }
227 
228  /*! \brief Populates dz_min in micro model for precipitation */
229  virtual void Set_dzmin (const int /*a_lev*/,
230  const amrex::Real dz_min) const override
231  {
232  m_moist_model->Set_dzmin(dz_min);
233  }
234 
235  /*! \brief Populates ERF's land/water mask in the micro model */
236  virtual void Set_Lmask (const int /*a_lev*/,
237  amrex::iMultiFab* lmask) const override
238  {
239  m_moist_model->Set_Lmask(lmask);
240  }
241 
242 protected:
243 
244  /*! \brief Create and set the specified moisture model */
245  template<class NewMoistModel>
246  void SetModel ()
247  {
248  m_moist_model = std::make_unique<NewMoistModel>();
249  }
250 
251  std::unique_ptr<NullMoistLagrangian> m_moist_model; /*!< moisture model */
252 };
253 
254 #endif
255 #endif
Contains the base class for microphysics.
Contains the Lagrangian moisture model base class.
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Base class for microphysics interface.
Definition: ERF_Microphysics.H:18
virtual int Get_Qmoist_Size(const int &)=0
get the number of moisture model variables
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 AverageDownMicroVars(const int)
average down moisture multifabs from finest_level to 0 (AMR coverage); no-op for non-Lagrangian model...
Definition: ERF_Microphysics.H:66
virtual int Get_Qstate_Moist_NumConc_Size()=0
get the number of microphysics conserved moist (water-related) state variables that are number concen...
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 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 &, const amrex::MultiFab *base_state=nullptr)=0
update microphysics variables from ERF state variables
virtual SurfacePrecipAccumulationSources Get_Surface_Precip_Accumulation_Ptrs(const int &) const
get scheme-native surface precipitation accumulators and their kg/m^2 conversion factors
Definition: ERF_Microphysics.H:70
virtual void Update_State_Vars_Lev(const int &, amrex::MultiFab &, const amrex::MultiFab &)=0
update ERF state variables from microphysics variables
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
virtual void Set_Lmask(const int lev, amrex::iMultiFab *lmask) const =0
Import ERF's land/water mask at this level.
virtual void Update_Diagnostic_State_Lev(const int &, amrex::MultiFab &, const amrex::MultiFab &)
Definition: ERF_Microphysics.H:63
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:136
virtual void FinishInit(const int &, amrex::MultiFab &, const amrex::Vector< std::unique_ptr< amrex::MultiFab >> &)=0
finish initializations steps that require flow variables
virtual bool Qstate_Is_Diagnostic(int) const
Whether a Q-state offset is a projection rather than host-transported state.
Definition: ERF_Microphysics.H:99
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
@ cons
Definition: ERF_IndexDefines.H:254
@ q
Definition: ERF_WSM6.H:294
Definition: ERF_DataStruct.H:715
Definition: ERF_SurfacePrecipitation.H:34