1 #ifndef SUPERDROPLETSMOIST_H
2 #define SUPERDROPLETSMOIST_H
4 #ifdef ERF_USE_PARTICLES
8 #include <AMReX_Enum.H>
9 #include <AMReX_Geometry.H>
30 namespace MicVar_SD_Species {
41 namespace MicVar_SD_Aerosols {
48 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
49 static int s_qt_idx (
const int a_i )
51 AMREX_ALWAYS_ASSERT(a_i > 0);
54 + MicVar_SD_Species::q_t;
57 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
58 static int s_qv_idx (
const int a_i )
60 AMREX_ALWAYS_ASSERT(a_i > 0);
63 + MicVar_SD_Species::q_v;
66 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
67 static int s_qc_idx (
const int a_i )
69 AMREX_ALWAYS_ASSERT(a_i > 0);
72 + MicVar_SD_Species::q_c;
75 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
76 static int s_sr_idx (
const int a_i )
78 AMREX_ALWAYS_ASSERT(a_i > 0);
81 + MicVar_SD_Species::sr;
84 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
85 static int s_accum_idx (
const int a_i )
87 AMREX_ALWAYS_ASSERT(a_i > 0);
90 + MicVar_SD_Species::accum;
93 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
94 static int a_accum_idx (
const int a_ns,
97 AMREX_ALWAYS_ASSERT(a_i >= 0);
101 + MicVar_SD_Aerosols::accum;
111 one_d_z, two_d_xz, two_d_yz, three_d
114 class SuperDropletsMoist :
public NullMoistLagrangian {
116 using FabPtr = std::shared_ptr<amrex::MultiFab>;
117 using MFPtr = std::unique_ptr<amrex::MultiFab>;
118 using BCTypeArr = amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2>;
126 m_qstate_moist_size = 3;
127 m_qstate_nonmoist_size = -1;
128 m_name =
"super_droplets_moisture";
136 virtual ~SuperDropletsMoist() =
default;
142 virtual void Init (
const amrex::MultiFab&,
143 const amrex::BoxArray&,
144 const amrex::Geometry&,
150 virtual void InitParticles ( MFPtr& )
override;
153 virtual void RestartParticles ( amrex::ParGDBBase*,
const std::string& )
override;
156 virtual void FinishInit(
const int&,
158 const amrex::Vector<MFPtr>&)
override;
162 amrex::Abort(
"Do not use this advance() for Lagrangian microphysics.");
174 const int& iteration,
176 amrex::Vector<amrex::Vector<amrex::MultiFab>>& cons_vars,
177 const amrex::Vector<MFPtr>& mf_array,
178 const BCTypeArr& bc_arr)
override;
183 virtual void Update_Micro_Vars (amrex::MultiFab& a_cons_vars)
override;
188 virtual void Update_State_Vars (amrex::MultiFab& a_cons_vars)
override;
193 virtual void Copy_State_to_Micro (
const amrex::MultiFab& a_state)
override;
198 virtual void Copy_Micro_to_State (amrex::MultiFab& a_state)
override;
201 inline virtual amrex::MultiFab* Qmoist_Ptr (
const int& a_idx)
override
203 AMREX_ALWAYS_ASSERT( a_idx < m_qmoist_size );
204 return m_mic_fab_vars[m_mic_var_map[a_idx]].get();
208 inline virtual int Qmoist_Size ()
override
210 return m_qmoist_size;
214 inline virtual int Qstate_Moist_Size ()
override
216 return m_qstate_moist_size;
220 inline virtual int Qstate_NonMoist_Size ()
override
222 AMREX_ALWAYS_ASSERT(m_qstate_nonmoist_size >= 0);
223 return m_qstate_nonmoist_size;
227 inline virtual ERFPC* getParticleContainer()
override
229 return m_super_droplets;
232 inline virtual const std::string& getName()
const override
238 virtual void computeQcQrWater ();
241 virtual void computeQcSpecies ()
243 for (
int is = 1; is < m_num_species; is++) { computeQcSpecies(is); }
247 virtual void computeQcSpecies (
const int a_i);
250 virtual void computeQc (
const int a_i)
252 if (a_i == m_idx_w) { computeQcQrWater(); }
253 else { computeQcSpecies(a_i); }
257 virtual void computeQtWater ();
260 virtual void computeQtSpecies ()
262 for (
int is = 1; is < m_num_species; is++) { computeQtSpecies(is); }
266 virtual void computeQtSpecies (
const int a_i);
269 virtual void computeQt (
const int a_i)
271 if (a_i == m_idx_w) { computeQtWater(); }
272 else { computeQtSpecies(a_i); }
276 virtual void rainAccumulation ();
279 virtual void speciesAccumulation ();
282 virtual void aerosolAccumulation ();
285 void densityToRatio ( amrex::MultiFab&,
const int a_comp = 0 );
287 void ratioToDensity ( amrex::MultiFab&,
const int a_comp = 0 );
294 virtual void phaseChange (
const amrex::Real& a_dt,
295 const amrex::Vector<MFPtr>& a_z,
296 const bool a_update_qv);
298 virtual void GetPlotVarNames (amrex::Vector<std::string>& a_names)
const override
300 for (
int v = 1; v < m_num_species; v++) {
301 a_names.push_back(
"qv_"+amrex::getEnumNameString(m_species[v]));
302 a_names.push_back(
"qc_"+amrex::getEnumNameString(m_species[v]));
303 a_names.push_back(
"qt_"+amrex::getEnumNameString(m_species[v]));
304 a_names.push_back(
"sat_ratio_"+amrex::getEnumNameString(m_species[v]));
305 a_names.push_back(
"accum_"+amrex::getEnumNameString(m_species[v]));
307 for (
int v = 0; v < m_num_aerosols; v++) {
308 a_names.push_back(
"accum_"+amrex::getEnumNameString(m_aerosols[v]));
312 virtual void GetPlotVar (
const std::string& a_name,
313 amrex::MultiFab& a_mf )
const override
315 AMREX_ASSERT(a_mf.nComp() >= 1);
316 for (
int v = 1; v < m_num_species; v++) {
318 std::string varname =
"qv_" + amrex::getEnumNameString(m_species[v]);
319 if (a_name == varname) {
320 amrex::MultiFab::Copy( a_mf,
321 *m_mic_fab_vars[s_qv_idx(v)],
322 0, 0, 1, amrex::IntVect::TheZeroVector() );
327 std::string varname =
"qc_" + amrex::getEnumNameString(m_species[v]);
328 if (a_name == varname) {
329 amrex::MultiFab::Copy( a_mf,
330 *m_mic_fab_vars[s_qc_idx(v)],
331 0, 0, 1, amrex::IntVect::TheZeroVector() );
336 std::string varname =
"qt_" + amrex::getEnumNameString(m_species[v]);
337 if (a_name == varname) {
338 amrex::MultiFab::Copy( a_mf,
339 *m_mic_fab_vars[s_qt_idx(v)],
340 0, 0, 1, amrex::IntVect::TheZeroVector() );
345 std::string varname =
"sat_ratio_" + amrex::getEnumNameString(m_species[v]);
346 if (a_name == varname) {
347 amrex::MultiFab::Copy( a_mf,
348 *m_mic_fab_vars[s_sr_idx(v)],
349 0, 0, 1, amrex::IntVect::TheZeroVector() );
354 std::string varname =
"accum_" + amrex::getEnumNameString(m_species[v]);
355 if (a_name == varname) {
356 amrex::MultiFab::Copy( a_mf,
357 *m_mic_fab_vars[s_accum_idx(v)],
358 0, 0, 1, amrex::IntVect::TheZeroVector() );
363 for (
int v = 0; v < m_num_aerosols; v++) {
365 std::string varname =
"accum_" + amrex::getEnumNameString(m_aerosols[v]);
366 if (a_name == varname) {
367 amrex::MultiFab::Copy( a_mf,
368 *m_mic_fab_vars[a_accum_idx(m_num_species,v)],
369 0, 0, 1, amrex::IntVect::TheZeroVector() );
374 amrex::Abort(
"SuperDropletsMoist::GetPlotVar() called with invalid name");
378 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
379 int q_qv_idx (
const int a_i )
381 AMREX_ALWAYS_ASSERT(a_i > 0);
382 return RhoQ1_comp + m_qstate_moist_size + 2*(a_i-1) + 0;
385 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
386 int q_qc_idx (
const int a_i )
388 AMREX_ALWAYS_ASSERT(a_i > 0);
389 return RhoQ1_comp + m_qstate_moist_size + 2*(a_i-1) + 1;
394 bool m_flag_phase_change;
395 bool m_flag_advection;
396 bool m_flag_coalescence;
403 bool m_init_phase_change;
407 int m_diagnostics_iter;
410 SDMoistInit m_init_type;
415 SuperDropletPC* m_super_droplets;
418 amrex::Geometry m_geom;
423 int m_qstate_moist_size;
425 int m_qstate_nonmoist_size;
428 amrex::Vector<int> m_mic_var_map;
431 amrex::Vector<FabPtr> m_mic_fab_vars;
434 std::vector<Species::Name> m_species;
438 std::vector<Species::Name> m_aerosols;
442 int m_num_substeps_phase_change;
445 bool m_kinematic_mode;
448 SDMSimulationDim m_dimensionality;
451 bool m_recycle_particles;
457 virtual void readInputs();
AMREX_ENUM(InitType, None, Input_Sounding, NCFile, WRFInput, Metgrid, Uniform, HindCast)
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
Contains the Lagrangian moisture model base class.
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ NumVars
Definition: ERF_MM5.H:21
@ theta
Definition: ERF_MM5.H:20
@ rho
Definition: ERF_Kessler.H:22
@ rain_accum
Definition: ERF_Kessler.H:33
Definition: ERF_DataStruct.H:129