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 
104 
105  void
106  Update_Micro_Vars (amrex::MultiFab& cons_in) override
107  {
108  this->Copy_State_to_Micro(cons_in);
109  }
110 
111  void
112  Update_State_Vars (amrex::MultiFab& cons_in,
113  const amrex::MultiFab& /*z_phys_nd*/) override
114  {
115  this->Copy_Micro_to_State(cons_in);
116  }
117 
118  // wrapper to do all the updating
119  void
120  Advance (const amrex::Real& dt_advance,
121  const SolverChoice& sc) override;
122 
123  amrex::MultiFab*
124  Qmoist_Ptr (const int& varIdx) override
125  {
127  return mic_fab_vars[MicVarMap[varIdx]].get();
128  }
129 
130  int
131  Qmoist_Size () override { return Morrison::m_qmoist_size; }
132 
133  int
135 
136  int
138 
139  void
141  std::vector<int>& a_idx,
142  std::vector<std::string>& a_names) const override
143  {
144  a_idx.clear();
145  a_names.clear();
146 
147  // The ordering here needs to match that in
148  // MicVarMap = {MicVar_Morr::rain_accum, MicVar_Morr::snow_accum, MicVar_Morr::graup_accum};
149  //
150  a_idx.push_back(0); a_names.push_back("RainAccum");
151  a_idx.push_back(1); a_names.push_back("SnowAccum");
152  a_idx.push_back(2); a_names.push_back("GraupAccum");
153  }
154 
156  Get_Surface_Precip_Accumulation_Ptrs (const int&) const override
157  {
159  sources.total = {mic_fab_vars[MicVar_Morr::rain_accum].get(), rhor / amrex::Real(1000.0)};
160 
161  if (m_moisture_type == MoistureType::Morrison) {
162  sources.snow = {mic_fab_vars[MicVar_Morr::snow_accum].get(), rhor / amrex::Real(1000.0)};
163  sources.graupel = {mic_fab_vars[MicVar_Morr::graup_accum].get(), rhor / amrex::Real(1000.0)};
164  }
165 
166  return sources;
167  }
168 
169  void
170  GetPlotVarNames (amrex::Vector<std::string>& a_vec) const override;
171 
172  void
173  GetPlotVar (const std::string& a_name,
174  amrex::MultiFab& a_mf) const override;
175 
176  void
177  GetPlotVar (const std::string& a_name,
178  amrex::MultiFab& a_mf,
179  const int /*a_lev*/) const override
180  {
181  GetPlotVar(a_name, a_mf);
182  }
183 
184 private:
185  // Number of qmoist variables (rain_accum, snow_accum, graup_accum)
186  int m_qmoist_size = 3;
187 
188  // Number of qstate variables
190 
191  // Number of qstate variables that are number concentrations
193 
194  // MicVar map (Qmoist indices -> MicVar enum)
195  amrex::Vector<int> MicVarMap;
196 
197  // geometry
198  amrex::Geometry m_geom;
199 
200  // constants
202  bool m_do_cond;
203  MoistureType m_moisture_type = MoistureType::None;
204 
205  // Minimum dz at this level
207 
208  // Pointer to terrain data
209  amrex::MultiFab* m_z_phys_nd;
210  amrex::MultiFab* m_detJ_cc;
211 
212  // independent variables
213  amrex::Array<FabPtr, MicVar_Morr::NumVars> mic_fab_vars;
214 };
215 #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:198
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:140
int Qstate_Moist_Size() override
Definition: ERF_Morrison.H:134
int n_qstate_moist_size
Definition: ERF_Morrison.H:189
void Update_Micro_Vars(amrex::MultiFab &cons_in) override
Definition: ERF_Morrison.H:106
void GetPlotVar(const std::string &a_name, amrex::MultiFab &a_mf, const int) const override
Definition: ERF_Morrison.H:177
void Update_State_Vars(amrex::MultiFab &cons_in, const amrex::MultiFab &) override
Definition: ERF_Morrison.H:112
int Qstate_Moist_NumConc_Size() override
Definition: ERF_Morrison.H:137
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:206
amrex::Vector< int > MicVarMap
Definition: ERF_Morrison.H:195
amrex::MultiFab * Qmoist_Ptr(const int &varIdx) override
Definition: ERF_Morrison.H:124
amrex::MultiFab * m_z_phys_nd
Definition: ERF_Morrison.H:209
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:210
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:131
void GetPlotVar(const std::string &a_name, amrex::MultiFab &a_mf) const override
int m_qmoist_size
Definition: ERF_Morrison.H:186
int n_qstate_moist_numconc_size
Definition: ERF_Morrison.H:192
SurfacePrecipAccumulationSources Get_Surface_Precip_Accumulation_Ptrs(const int &) const override
Definition: ERF_Morrison.H:156
MoistureType m_moisture_type
Definition: ERF_Morrison.H:203
amrex::Real m_rdOcp
Definition: ERF_Morrison.H:201
amrex::Array< FabPtr, MicVar_Morr::NumVars > mic_fab_vars
Definition: ERF_Morrison.H:213
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_Morrison.H:61
bool m_do_cond
Definition: ERF_Morrison.H:202
Definition: ERF_NullMoist.H:9
virtual void Update_Micro_Vars(amrex::MultiFab &)
Definition: ERF_NullMoist.H:35
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:241
MoistureType moisture_type
Moisture or microphysics model.
Definition: ERF_DataStruct.H:1604
amrex::Real rdOcp
Ratio of dry-air gas constant to c_p.
Definition: ERF_DataStruct.H:1477
bool uses_shoc_family() const noexcept
Query whether any SHOC-family PBL scheme is active.
Definition: ERF_DataStruct.H:1566
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