ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_Morrison.H
Go to the documentation of this file.
1 /*
2  * Implementation of a 2-moment microphysics model
3  * This model is based on the Morrison model as implemented in WRF (in Fortran)
4  */
5 #ifndef ERF_Morrison_H
6 #define ERF_Morrison_H
7 
8 #include <string>
9 #include <vector>
10 #include <memory>
11 
12 #include <AMReX_FArrayBox.H>
13 #include <AMReX_Geometry.H>
14 #include <AMReX_TableData.H>
15 #include <AMReX_MultiFabUtil.H>
16 
17 #include "ERF_Constants.H"
18 #include "ERF_MicrophysicsUtils.H"
19 #include "ERF_IndexDefines.H"
20 #include "ERF_DataStruct.H"
21 #include "ERF_NullMoist.H"
24 
25 namespace MicVar_Morr {
26  enum {
27  // independent variables
28  rho=0, // density
29  theta, // liquid/ice water potential temperature
30  tabs, // temperature
31  pres, // pressure
32  // non-precipitating vars
33  qt, // total cloud
34  qn, // cloud condensate (liquid + ice)
35  qv, // cloud vapor
36  qcl, // cloud water
37  qci, // cloud ice
38  // precipitating vars
39  qp, // total precip
40  qpr, // precip rain
41  qps, // precip ice
42  qpg, // graupel
43  // The "numbers" and the "accums" are written/read at checkpoint/restart
44  // number concentrations
45  nc, // cloud droplet number
46  nr, // rain number
47  ni, // cloud ice number
48  ns, // snow number
49  ng, // graupel number
50  // derived vars
55  NumVars
56  };
57 }
58 
59 class Morrison : public NullMoist {
60 
61  using FabPtr = std::shared_ptr<amrex::MultiFab>;
62 
63 public:
64  // constructor
65  Morrison () {}
66 
67  // destructor
68  virtual ~Morrison () = default;
69 
70  // Set up for first time
71  void
72  Define (SolverChoice& sc) override
73  {
75  m_rdOcp = sc.rdOcp;
76  m_do_cond = (!sc.uses_shoc_family());
77  }
78 
79  // init
80  void
81  Init (const amrex::MultiFab& cons_in,
82  const amrex::BoxArray& grids,
83  const amrex::Geometry& geom,
84  const amrex::Real& dt_advance,
85  std::unique_ptr<amrex::MultiFab>& z_phys_nd,
86  std::unique_ptr<amrex::MultiFab>& detJ_cc) override;
87 
88  // Import minimum dz at this level
89  void
90  Set_dzmin (const amrex::Real dz_min) override
91  {
92  m_dzmin = dz_min;
93  }
94 
95  // Copy state into micro vars
96  void
97  Copy_State_to_Micro (const amrex::MultiFab& cons_in) override;
98 
99  // Copy state into micro vars
100  void
101  Copy_Micro_to_State (amrex::MultiFab& cons_in) override;
102 
103  void
104  Update_Micro_Vars (amrex::MultiFab& cons_in) override
105  {
106  this->Copy_State_to_Micro(cons_in);
107  }
108 
109  void
110  Update_State_Vars (amrex::MultiFab& cons_in,
111  const amrex::MultiFab& /*z_phys_nd*/) override
112  {
113  this->Copy_Micro_to_State(cons_in);
114  }
115 
116  // wrapper to do all the updating
117  void
118  Advance (const amrex::Real& dt_advance,
119  const SolverChoice& sc) override;
120 
121  amrex::MultiFab*
122  Qmoist_Ptr (const int& varIdx) override
123  {
125  return mic_fab_vars[MicVarMap[varIdx]].get();
126  }
127 
128  int
129  Qmoist_Size () override { return Morrison::m_qmoist_size; }
130 
131  int
133 
134  int
136 
137  void
139  std::vector<int>& a_idx,
140  std::vector<std::string>& a_names) const override
141  {
142  a_idx.clear();
143  a_names.clear();
144 
145  // The ordering here needs to match that in
146  // MicVarMap = {MicVar_Morr::rain_accum, MicVar_Morr::snow_accum, MicVar_Morr::graup_accum};
147  //
148  a_idx.push_back(0); a_names.push_back("RainAccum");
149  a_idx.push_back(1); a_names.push_back("SnowAccum");
150  a_idx.push_back(2); a_names.push_back("GraupAccum");
151  }
152 
154  Get_Surface_Precip_Accumulation_Ptrs (const int&) const override
155  {
157  sources.total = {mic_fab_vars[MicVar_Morr::rain_accum].get(), rhor / amrex::Real(1000.0)};
158 
159  if (m_moisture_type == MoistureType::Morrison) {
160  sources.snow = {mic_fab_vars[MicVar_Morr::snow_accum].get(), rhor / amrex::Real(1000.0)};
161  sources.graupel = {mic_fab_vars[MicVar_Morr::graup_accum].get(), rhor / amrex::Real(1000.0)};
162  }
163 
164  return sources;
165  }
166 
167  void
168  GetPlotVarNames (amrex::Vector<std::string>& a_vec) const override;
169 
170  void
171  GetPlotVar (const std::string& a_name,
172  amrex::MultiFab& a_mf) const override;
173 
174  void
175  GetPlotVar (const std::string& a_name,
176  amrex::MultiFab& a_mf,
177  const int /*a_lev*/) const override
178  {
179  GetPlotVar(a_name, a_mf);
180  }
181 
182 private:
183  // Number of qmoist variables (rain_accum, snow_accum, graup_accum)
184  int m_qmoist_size = 3;
185 
186  // Number of qstate variables
188 
189  // Number of qstate variables that are number concentrations
191 
192  // MicVar map (Qmoist indices -> MicVar enum)
193  amrex::Vector<int> MicVarMap;
194 
195  // geometry
196  amrex::Geometry m_geom;
197 
198  // constants
200  bool m_do_cond;
201  MoistureType m_moisture_type = MoistureType::None;
202 
203  // Minimum dz at this level
205 
206  // Pointer to terrain data
207  amrex::MultiFab* m_z_phys_nd;
208  amrex::MultiFab* m_detJ_cc;
209 
210  // independent variables
211  amrex::Array<FabPtr, MicVar_Morr::NumVars> mic_fab_vars;
212 };
213 #endif
constexpr amrex::Real rhor
Definition: ERF_Constants.H:71
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_Morrison.H:59
virtual ~Morrison()=default
amrex::Geometry m_geom
Definition: ERF_Morrison.H:196
Morrison()
Definition: ERF_Morrison.H:65
void Advance(const amrex::Real &dt_advance, const SolverChoice &sc) override
Definition: ERF_AdvanceMorrison.cpp:164
void GetPlotVarNames(amrex::Vector< std::string > &a_vec) const override
Populate a vector with names of all available Morrison plot variables.
Definition: ERF_Morrison_Plot.cpp:101
void Qmoist_Restart_Vars(const SolverChoice &, std::vector< int > &a_idx, std::vector< std::string > &a_names) const override
Definition: ERF_Morrison.H:138
int Qstate_Moist_Size() override
Definition: ERF_Morrison.H:132
int n_qstate_moist_size
Definition: ERF_Morrison.H:187
void Update_Micro_Vars(amrex::MultiFab &cons_in) override
Definition: ERF_Morrison.H:104
void GetPlotVar(const std::string &a_name, amrex::MultiFab &a_mf, const int) const override
Definition: ERF_Morrison.H:175
void Update_State_Vars(amrex::MultiFab &cons_in, const amrex::MultiFab &) override
Definition: ERF_Morrison.H:110
int Qstate_Moist_NumConc_Size() override
Definition: ERF_Morrison.H:135
void Set_dzmin(const amrex::Real dz_min) override
Definition: ERF_Morrison.H:90
void Copy_State_to_Micro(const amrex::MultiFab &cons_in) override
Definition: ERF_InitMorrison.cpp:73
amrex::Real m_dzmin
Definition: ERF_Morrison.H:204
amrex::Vector< int > MicVarMap
Definition: ERF_Morrison.H:193
amrex::MultiFab * Qmoist_Ptr(const int &varIdx) override
Definition: ERF_Morrison.H:122
amrex::MultiFab * m_z_phys_nd
Definition: ERF_Morrison.H:207
void Copy_Micro_to_State(amrex::MultiFab &cons_in) override
Definition: ERF_UpdateMorrison.cpp:17
void Define(SolverChoice &sc) override
Definition: ERF_Morrison.H:72
amrex::MultiFab * m_detJ_cc
Definition: ERF_Morrison.H:208
void Init(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
Definition: ERF_InitMorrison.cpp:21
int Qmoist_Size() override
Definition: ERF_Morrison.H:129
void GetPlotVar(const std::string &a_name, amrex::MultiFab &a_mf) const override
int m_qmoist_size
Definition: ERF_Morrison.H:184
int n_qstate_moist_numconc_size
Definition: ERF_Morrison.H:190
SurfacePrecipAccumulationSources Get_Surface_Precip_Accumulation_Ptrs(const int &) const override
Definition: ERF_Morrison.H:154
MoistureType m_moisture_type
Definition: ERF_Morrison.H:201
amrex::Real m_rdOcp
Definition: ERF_Morrison.H:199
amrex::Array< FabPtr, MicVar_Morr::NumVars > mic_fab_vars
Definition: ERF_Morrison.H:211
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_Morrison.H:61
bool m_do_cond
Definition: ERF_Morrison.H:200
Definition: ERF_NullMoist.H:9
Definition: ERF_Morrison.H:25
@ qv
Definition: ERF_Morrison.H:35
@ ng
Definition: ERF_Morrison.H:49
@ nc
Definition: ERF_Morrison.H:45
@ qpg
Definition: ERF_Morrison.H:42
@ pres
Definition: ERF_Morrison.H:31
@ nr
Definition: ERF_Morrison.H:46
@ qcl
Definition: ERF_Morrison.H:36
@ tabs
Definition: ERF_Morrison.H:30
@ theta
Definition: ERF_Morrison.H:29
@ qp
Definition: ERF_Morrison.H:39
@ ni
Definition: ERF_Morrison.H:47
@ ns
Definition: ERF_Morrison.H:48
@ omega
Definition: ERF_Morrison.H:54
@ qps
Definition: ERF_Morrison.H:41
@ qn
Definition: ERF_Morrison.H:34
@ graup_accum
Definition: ERF_Morrison.H:53
@ rho
Definition: ERF_Morrison.H:28
@ qpr
Definition: ERF_Morrison.H:40
@ qci
Definition: ERF_Morrison.H:37
@ NumVars
Definition: ERF_Morrison.H:55
@ rain_accum
Definition: ERF_Morrison.H:51
@ snow_accum
Definition: ERF_Morrison.H:52
@ qt
Definition: ERF_Morrison.H:33
Definition: ERF_DataStruct.H:141
amrex::Real rdOcp
Definition: ERF_DataStruct.H:1320
bool uses_shoc_family() const noexcept
Definition: ERF_DataStruct.H:1385
MoistureType moisture_type
Definition: ERF_DataStruct.H:1415
Definition: ERF_SurfacePrecipitation.H:21
SurfacePrecipAccumulationSource snow
Definition: ERF_SurfacePrecipitation.H:24
SurfacePrecipAccumulationSource total
Definition: ERF_SurfacePrecipitation.H:22
SurfacePrecipAccumulationSource graupel
Definition: ERF_SurfacePrecipitation.H:25