ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_WSM6.H
Go to the documentation of this file.
1 #ifndef ERF_WSM6_H
2 #define ERF_WSM6_H
3 
4 #include <memory>
5 #include <string>
6 #include <vector>
7 
8 #include <AMReX_FArrayBox.H>
9 #include <AMReX_Geometry.H>
10 #include <AMReX_MultiFabUtil.H>
11 
12 #include "ERF_Constants.H"
13 #include "ERF_DataStruct.H"
14 #include "ERF_IndexDefines.H"
15 #include "ERF_MicrophysicsUtils.H"
16 #include "ERF_NullMoist.H"
17 
18 namespace MicVar_WSM6 {
19  enum {
20  rho = 0,
24  qv,
25  qc,
26  qi,
27  qr,
28  qs,
29  qg,
33  NumVars
34  };
35 }
36 
37 class WSM6 : public NullMoist {
38  using FabPtr = std::shared_ptr<amrex::MultiFab>;
39 
40 public:
41  WSM6() {}
42  virtual ~WSM6() = default;
43 
44  void Define(SolverChoice& sc) override
45  {
46  m_axis = sc.ave_plane;
47  m_do_cond = (!sc.use_shoc);
48  }
49 
50  // WSM6 module parameter constants (Fortran: parameter, private)
51  static constexpr amrex::Real dtcldcr = amrex::Real(120.0);
52  static constexpr amrex::Real n0r = amrex::Real(8.0e6);
53  static constexpr amrex::Real avtr = amrex::Real(841.9);
54  static constexpr amrex::Real bvtr = amrex::Real(0.8);
55  static constexpr amrex::Real r0 = amrex::Real(0.8e-5);
56  static constexpr amrex::Real peaut = amrex::Real(0.55);
57  static constexpr amrex::Real xncr = amrex::Real(3.0e8);
58  static constexpr amrex::Real xmyu = amrex::Real(1.718e-5);
59  static constexpr amrex::Real avts = amrex::Real(11.72);
60  static constexpr amrex::Real bvts = amrex::Real(0.41);
61  static constexpr amrex::Real lamdarmax = amrex::Real(8.0e4);
62  static constexpr amrex::Real lamdasmax = amrex::Real(1.0e5);
63  static constexpr amrex::Real dicon = amrex::Real(11.9);
64  static constexpr amrex::Real dimax = amrex::Real(500.0e-6);
65  static constexpr amrex::Real pfrz1 = amrex::Real(100.0);
66  static constexpr amrex::Real pfrz2 = amrex::Real(0.66);
67  static constexpr amrex::Real qcrmin = amrex::Real(1.0e-9);
68  static constexpr amrex::Real eacrc = amrex::Real(1.0);
69  static constexpr amrex::Real dens_snow = amrex::Real(100.0);
70  static constexpr amrex::Real qs0 = amrex::Real(6.0e-4);
71  static constexpr amrex::Real n0smax = amrex::Real(1.0e11);
72  static constexpr amrex::Real n0s = amrex::Real(2.0e6);
73  static constexpr amrex::Real alpha_wsm6 = amrex::Real(0.12);
74 
75  void Init(const amrex::MultiFab& cons_in,
76  const amrex::BoxArray& grids,
77  const amrex::Geometry& geom,
78  const amrex::Real& dt_advance,
79  std::unique_ptr<amrex::MultiFab>& z_phys_nd,
80  std::unique_ptr<amrex::MultiFab>& detJ_cc) override;
81 
82  void Set_dzmin(const amrex::Real dz_min) override { m_dzmin = dz_min; }
83 
84  void Copy_State_to_Micro(const amrex::MultiFab& cons_in) override;
85  void Copy_Micro_to_State(amrex::MultiFab& cons_in) override;
86 
87  void Update_Micro_Vars(amrex::MultiFab& cons_in) override
88  {
89  Copy_State_to_Micro(cons_in);
90  }
91 
92  void Update_State_Vars(amrex::MultiFab& cons_in,
93  const amrex::MultiFab& /*z_phys_nd*/) override
94  {
95  Copy_Micro_to_State(cons_in);
96  }
97 
98  void Advance(const amrex::Real& dt_advance,
99  const SolverChoice& solverChoice) override;
100 
101  amrex::MultiFab* Qmoist_Ptr(const int& varIdx) override
102  {
104  return mic_fab_vars[MicVarMap[varIdx]].get();
105  }
106 
107  int Qmoist_Size() override { return m_qmoist_size; }
108  int Qstate_Moist_Size() override { return n_qstate_moist_size; }
110 
112  std::vector<int>& a_idx,
113  std::vector<std::string>& a_names) const override
114  {
115  a_idx = {0, 1, 2};
116  a_names = {"RainAccum", "SnowAccum", "GraupAccum"};
117  }
118 
119 private:
120  int m_qmoist_size = 3;
123 
124  amrex::Vector<int> MicVarMap;
125 
126  amrex::Geometry m_geom;
129  int nlev{0}, zlo{0}, zhi{0};
130  int m_axis{2};
131  bool m_do_cond{true};
132 
133  amrex::MultiFab* m_z_phys_nd{nullptr};
134  amrex::MultiFab* m_detJ_cc{nullptr};
135 
136  amrex::Array<FabPtr, MicVar_WSM6::NumVars> mic_fab_vars;
137 
138  // ---- WSM6 init coefficients (from mp_wsm6_init save variables) ----
139  // hail_opt-dependent (set in Initialize() based on m_hail_opt)
140  bool m_hail_opt{false};
142 
143  void initialize_coeffs();
144 
145  // Derived coefficients (computed in initialize_coeffs(), called from Init())
163 };
164 
165 namespace WSM6Ind {
166  enum {
167  // --- inout state (mirrors mp_wsm6_run arguments) ---
168  t = 0,
169  q,
170  qc,
171  qi,
172  qr,
173  qs,
174  qg,
176  p,
178 
179  // --- sedimentation working arrays ---
188 
189  // --- microphysics process rates ---
217 
218  // --- derived thermodynamic fields ---
220  xl,
230 
231  // --- multi-component arrays expanded from Fortran dimension(:,:,N) ---
232  // rh/qsat: N=2, w=over liquid(1), i=over ice(2) — matches Morrison qsatw/qsati
233  // slope/fall/qrs/falk/work1: N=3, _r=rain(1) _s=snow(2) _g=graupel(3)
234  // workdiff: w=liquid diffusion work1(1), i=ice diffusion work1(2) — separate from work1_r/s/g
235  rhw, rhi, // relative humidity: w=over liquid, i=over ice (Fortran rh(:,:,1/2))
236  qsatw, qsati, // saturation mixing ratio: w=over liquid, i=over ice (Fortran qsat(:,:,1/2))
244  work1_r, work1_s, work1_g, // fall speeds post slope_wsm6: 1=rain 2=snow 3=graupel
245  workdiffw, workdiffi, // diffusion denominators post slope_wsm6 call 2: w=liq i=ice
246 
247  NumInds
248  };
249 }
250 
251 #endif
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NullMoist.H:8
Definition: ERF_WSM6.H:37
amrex::Real m_g5pbgo2
Definition: ERF_WSM6.H:157
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_WSM6.H:38
amrex::Real m_roqimax
Definition: ERF_WSM6.H:151
amrex::Real m_dzmin
Definition: ERF_WSM6.H:128
amrex::Real m_bvts3
Definition: ERF_WSM6.H:152
amrex::MultiFab * m_z_phys_nd
Definition: ERF_WSM6.H:133
amrex::Real m_rslopesbmax
Definition: ERF_WSM6.H:160
static constexpr amrex::Real avtr
Definition: ERF_WSM6.H:53
bool m_hail_opt
Definition: ERF_WSM6.H:140
static constexpr amrex::Real dicon
Definition: ERF_WSM6.H:63
amrex::Real m_rslopes2max
Definition: ERF_WSM6.H:161
amrex::Real m_rsloper2max
Definition: ERF_WSM6.H:161
amrex::Real m_bvtr1
Definition: ERF_WSM6.H:148
static constexpr amrex::Real qcrmin
Definition: ERF_WSM6.H:67
amrex::Real m_g4pbs
Definition: ERF_WSM6.H:153
amrex::Real m_g1pbg
Definition: ERF_WSM6.H:157
amrex::Real m_rslopermax
Definition: ERF_WSM6.H:159
amrex::MultiFab * m_detJ_cc
Definition: ERF_WSM6.H:134
amrex::Real m_pacrc
Definition: ERF_WSM6.H:155
static constexpr amrex::Real pfrz1
Definition: ERF_WSM6.H:65
void Qmoist_Restart_Vars(const SolverChoice &, std::vector< int > &a_idx, std::vector< std::string > &a_names) const override
Definition: ERF_WSM6.H:111
amrex::Real m_rsloperbmax
Definition: ERF_WSM6.H:160
amrex::Real m_g4pbg
Definition: ERF_WSM6.H:157
amrex::Real m_g5pbro2
Definition: ERF_WSM6.H:149
amrex::Real m_g3pbr
Definition: ERF_WSM6.H:149
amrex::Real m_bvtg1
Definition: ERF_WSM6.H:156
amrex::Real m_pi_wsm6
Definition: ERF_WSM6.H:146
amrex::Real m_bvts4
Definition: ERF_WSM6.H:152
static constexpr amrex::Real n0smax
Definition: ERF_WSM6.H:71
amrex::Real m_deng
Definition: ERF_WSM6.H:141
int zlo
Definition: ERF_WSM6.H:129
bool m_do_cond
Definition: ERF_WSM6.H:131
amrex::Real m_pidn0s
Definition: ERF_WSM6.H:155
static constexpr amrex::Real dimax
Definition: ERF_WSM6.H:64
int nlev
Definition: ERF_WSM6.H:129
int zhi
Definition: ERF_WSM6.H:129
static constexpr amrex::Real pfrz2
Definition: ERF_WSM6.H:66
int m_qmoist_size
Definition: ERF_WSM6.H:120
static constexpr amrex::Real alpha_wsm6
Definition: ERF_WSM6.H:73
int m_axis
Definition: ERF_WSM6.H:130
amrex::Real m_g3pbg
Definition: ERF_WSM6.H:157
amrex::Real m_pvtg
Definition: ERF_WSM6.H:158
int n_qstate_moist_size
Definition: ERF_WSM6.H:121
static constexpr amrex::Real lamdasmax
Definition: ERF_WSM6.H:62
amrex::Real m_bvtr6
Definition: ERF_WSM6.H:148
amrex::Real m_bvtr2
Definition: ERF_WSM6.H:148
amrex::Real m_qck1
Definition: ERF_WSM6.H:147
amrex::Real m_precg2
Definition: ERF_WSM6.H:158
amrex::Real m_bvts1
Definition: ERF_WSM6.H:152
amrex::Real m_pacrs
Definition: ERF_WSM6.H:154
amrex::Real m_precg1
Definition: ERF_WSM6.H:158
void Update_State_Vars(amrex::MultiFab &cons_in, const amrex::MultiFab &) override
Definition: ERF_WSM6.H:92
amrex::Real m_rsloper3max
Definition: ERF_WSM6.H:162
static constexpr amrex::Real n0s
Definition: ERF_WSM6.H:72
amrex::Real m_eacrr
Definition: ERF_WSM6.H:150
amrex::Real m_precr2
Definition: ERF_WSM6.H:151
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_InitWSM6.cpp:9
amrex::Real m_g1pbs
Definition: ERF_WSM6.H:153
amrex::Real m_lamdagmax
Definition: ERF_WSM6.H:141
static constexpr amrex::Real n0r
Definition: ERF_WSM6.H:52
amrex::Real m_n0g
Definition: ERF_WSM6.H:141
void Update_Micro_Vars(amrex::MultiFab &cons_in) override
Definition: ERF_WSM6.H:87
amrex::Real m_pidn0g
Definition: ERF_WSM6.H:158
void Define(SolverChoice &sc) override
Definition: ERF_WSM6.H:44
static constexpr amrex::Real dens_snow
Definition: ERF_WSM6.H:69
void initialize_coeffs()
Definition: ERF_InitWSM6.cpp:79
static constexpr amrex::Real dtcldcr
Definition: ERF_WSM6.H:51
amrex::Real m_rslopegmax
Definition: ERF_WSM6.H:159
amrex::Real m_bvtg2
Definition: ERF_WSM6.H:156
static constexpr amrex::Real bvts
Definition: ERF_WSM6.H:60
static constexpr amrex::Real r0
Definition: ERF_WSM6.H:55
amrex::Real m_g6pbr
Definition: ERF_WSM6.H:149
amrex::MultiFab * Qmoist_Ptr(const int &varIdx) override
Definition: ERF_WSM6.H:101
void Advance(const amrex::Real &dt_advance, const SolverChoice &solverChoice) override
Definition: ERF_AdvanceWSM6.cpp:842
amrex::Real m_pacrg
Definition: ERF_WSM6.H:158
amrex::Real m_precs2
Definition: ERF_WSM6.H:154
amrex::Real m_bvtg4
Definition: ERF_WSM6.H:156
void Copy_Micro_to_State(amrex::MultiFab &cons_in) override
Definition: ERF_UpdateWSM6.cpp:7
amrex::Real m_bvtr4
Definition: ERF_WSM6.H:148
int n_qstate_moist_numconc_size
Definition: ERF_WSM6.H:122
amrex::Real m_rslopeg3max
Definition: ERF_WSM6.H:162
amrex::Real m_bvts2
Definition: ERF_WSM6.H:152
amrex::Real m_pvts
Definition: ERF_WSM6.H:154
amrex::Real m_rslopegbmax
Definition: ERF_WSM6.H:160
static constexpr amrex::Real qs0
Definition: ERF_WSM6.H:70
amrex::Real m_bvtg3
Definition: ERF_WSM6.H:156
amrex::Geometry m_geom
Definition: ERF_WSM6.H:126
amrex::Real m_pidnc
Definition: ERF_WSM6.H:147
amrex::Real m_precs1
Definition: ERF_WSM6.H:154
amrex::Real dt
Definition: ERF_WSM6.H:127
amrex::Real m_g3pbs
Definition: ERF_WSM6.H:153
static constexpr amrex::Real lamdarmax
Definition: ERF_WSM6.H:61
int Qstate_Moist_Size() override
Definition: ERF_WSM6.H:108
static constexpr amrex::Real xncr
Definition: ERF_WSM6.H:57
static constexpr amrex::Real bvtr
Definition: ERF_WSM6.H:54
amrex::Real m_rslopesmax
Definition: ERF_WSM6.H:159
int Qstate_Moist_NumConc_Size() override
Definition: ERF_WSM6.H:109
amrex::Real m_avtg
Definition: ERF_WSM6.H:141
void Copy_State_to_Micro(const amrex::MultiFab &cons_in) override
Definition: ERF_InitWSM6.cpp:39
amrex::Real m_qc0
Definition: ERF_WSM6.H:147
amrex::Real m_g4pbr
Definition: ERF_WSM6.H:149
virtual ~WSM6()=default
amrex::Vector< int > MicVarMap
Definition: ERF_WSM6.H:124
amrex::Real m_g1pbr
Definition: ERF_WSM6.H:149
amrex::Array< FabPtr, MicVar_WSM6::NumVars > mic_fab_vars
Definition: ERF_WSM6.H:136
WSM6()
Definition: ERF_WSM6.H:41
amrex::Real m_bvtg
Definition: ERF_WSM6.H:141
static constexpr amrex::Real peaut
Definition: ERF_WSM6.H:56
amrex::Real m_pvtr
Definition: ERF_WSM6.H:150
amrex::Real m_pacrr
Definition: ERF_WSM6.H:150
static constexpr amrex::Real avts
Definition: ERF_WSM6.H:59
amrex::Real m_precr1
Definition: ERF_WSM6.H:151
amrex::Real m_pidn0r
Definition: ERF_WSM6.H:155
static constexpr amrex::Real eacrc
Definition: ERF_WSM6.H:68
amrex::Real m_rslopes3max
Definition: ERF_WSM6.H:162
amrex::Real m_g5pbso2
Definition: ERF_WSM6.H:153
amrex::Real m_xlv1
Definition: ERF_WSM6.H:146
static constexpr amrex::Real xmyu
Definition: ERF_WSM6.H:58
amrex::Real m_rslopeg2max
Definition: ERF_WSM6.H:161
void Set_dzmin(const amrex::Real dz_min) override
Definition: ERF_WSM6.H:82
amrex::Real m_bvtr3
Definition: ERF_WSM6.H:148
int Qmoist_Size() override
Definition: ERF_WSM6.H:107
Definition: ERF_WSM6.H:18
@ qr
Definition: ERF_WSM6.H:27
@ qi
Definition: ERF_WSM6.H:26
@ theta
Definition: ERF_WSM6.H:21
@ qs
Definition: ERF_WSM6.H:28
@ qv
Definition: ERF_WSM6.H:24
@ qc
Definition: ERF_WSM6.H:25
@ rain_accum
Definition: ERF_WSM6.H:30
@ snow_accum
Definition: ERF_WSM6.H:31
@ rho
Definition: ERF_WSM6.H:20
@ graup_accum
Definition: ERF_WSM6.H:32
@ qg
Definition: ERF_WSM6.H:29
@ pres
Definition: ERF_WSM6.H:23
@ NumVars
Definition: ERF_WSM6.H:33
@ tabs
Definition: ERF_WSM6.H:22
Definition: ERF_WSM6.H:165
@ pigen
Definition: ERF_WSM6.H:190
@ pgacw
Definition: ERF_WSM6.H:208
@ paacw
Definition: ERF_WSM6.H:212
@ pgacr
Definition: ERF_WSM6.H:210
@ delz
Definition: ERF_WSM6.H:177
@ rslope2_s
Definition: ERF_WSM6.H:238
@ psacw
Definition: ERF_WSM6.H:205
@ rslopeb_s
Definition: ERF_WSM6.H:240
@ qrs_tmp_g
Definition: ERF_WSM6.H:241
@ psaut
Definition: ERF_WSM6.H:199
@ pseml
Definition: ERF_WSM6.H:215
@ prevp
Definition: ERF_WSM6.H:193
@ psacr
Definition: ERF_WSM6.H:207
@ den
Definition: ERF_WSM6.H:175
@ denqrs1
Definition: ERF_WSM6.H:225
@ rslope3_g
Definition: ERF_WSM6.H:239
@ qg
Definition: ERF_WSM6.H:174
@ fall_s
Definition: ERF_WSM6.H:243
@ workr
Definition: ERF_WSM6.H:184
@ pracw
Definition: ERF_WSM6.H:202
@ qsatw
Definition: ERF_WSM6.H:236
@ rslope2_g
Definition: ERF_WSM6.H:238
@ falk_r
Definition: ERF_WSM6.H:242
@ q
Definition: ERF_WSM6.H:169
@ n0sfac
Definition: ERF_WSM6.H:229
@ denqci
Definition: ERF_WSM6.H:228
@ pgaut
Definition: ERF_WSM6.H:200
@ rslope3_s
Definition: ERF_WSM6.H:239
@ workdiffi
Definition: ERF_WSM6.H:245
@ delz_tmp
Definition: ERF_WSM6.H:187
@ denqrs2
Definition: ERF_WSM6.H:226
@ qsati
Definition: ERF_WSM6.H:236
@ workdiffw
Definition: ERF_WSM6.H:245
@ psaci
Definition: ERF_WSM6.H:206
@ worka
Definition: ERF_WSM6.H:185
@ falkc
Definition: ERF_WSM6.H:181
@ pgevp
Definition: ERF_WSM6.H:195
@ work2
Definition: ERF_WSM6.H:222
@ pgacs
Definition: ERF_WSM6.H:211
@ rslope2_r
Definition: ERF_WSM6.H:238
@ psdep
Definition: ERF_WSM6.H:196
@ xl
Definition: ERF_WSM6.H:220
@ rslope_r
Definition: ERF_WSM6.H:237
@ work1_g
Definition: ERF_WSM6.H:244
@ praci
Definition: ERF_WSM6.H:203
@ qc
Definition: ERF_WSM6.H:170
@ qi
Definition: ERF_WSM6.H:171
@ pcond
Definition: ERF_WSM6.H:192
@ cpm
Definition: ERF_WSM6.H:221
@ denqrs3
Definition: ERF_WSM6.H:227
@ qs
Definition: ERF_WSM6.H:173
@ falk_g
Definition: ERF_WSM6.H:242
@ NumInds
Definition: ERF_WSM6.H:247
@ rslope3_r
Definition: ERF_WSM6.H:239
@ qsum
Definition: ERF_WSM6.H:219
@ rslope_s
Definition: ERF_WSM6.H:237
@ psmlt
Definition: ERF_WSM6.H:213
@ fall_g
Definition: ERF_WSM6.H:243
@ pgeml
Definition: ERF_WSM6.H:216
@ qrs_tmp_s
Definition: ERF_WSM6.H:241
@ psevp
Definition: ERF_WSM6.H:194
@ den_tmp
Definition: ERF_WSM6.H:186
@ work1c
Definition: ERF_WSM6.H:182
@ work2c
Definition: ERF_WSM6.H:183
@ pgmlt
Definition: ERF_WSM6.H:214
@ rhi
Definition: ERF_WSM6.H:235
@ t
Definition: ERF_WSM6.H:168
@ piacr
Definition: ERF_WSM6.H:201
@ pgaci
Definition: ERF_WSM6.H:209
@ work1_s
Definition: ERF_WSM6.H:244
@ pracs
Definition: ERF_WSM6.H:204
@ qr
Definition: ERF_WSM6.H:172
@ p
Definition: ERF_WSM6.H:176
@ rhw
Definition: ERF_WSM6.H:235
@ work1_r
Definition: ERF_WSM6.H:244
@ fallc
Definition: ERF_WSM6.H:180
@ qrs_tmp_r
Definition: ERF_WSM6.H:241
@ rslopeb_g
Definition: ERF_WSM6.H:240
@ rslopeb_r
Definition: ERF_WSM6.H:240
@ pidep
Definition: ERF_WSM6.H:191
@ praut
Definition: ERF_WSM6.H:198
@ pgdep
Definition: ERF_WSM6.H:197
@ denfac
Definition: ERF_WSM6.H:223
@ rslope_g
Definition: ERF_WSM6.H:237
@ fall_r
Definition: ERF_WSM6.H:243
@ falk_s
Definition: ERF_WSM6.H:242
@ xni
Definition: ERF_WSM6.H:224
Definition: ERF_DataStruct.H:141
bool use_shoc
Definition: ERF_DataStruct.H:1253
int ave_plane
Definition: ERF_DataStruct.H:1313