1 #ifndef SUPERDROPLETSMOIST_H
2 #define SUPERDROPLETSMOIST_H
4 #ifdef ERF_USE_PARTICLES
8 #include <AMReX_Enum.H>
9 #include <AMReX_Geometry.H>
10 #include <AMReX_iMultiFab.H>
11 #include <AMReX_MultiFabUtil.H>
39 namespace MicVar_SD_Species {
50 namespace MicVar_SD_Aerosols {
57 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
58 static int s_qt_idx (
const int a_i,
67 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
68 static int s_qv_idx (
const int a_i,
74 + MicVar_SD_Species::q_v;
77 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
78 static int s_qc_idx (
const int a_i,
84 + MicVar_SD_Species::q_c;
87 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
88 static int s_sr_idx (
const int a_i,
94 + MicVar_SD_Species::sr;
97 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
98 static int s_accum_idx (
const int a_i,
104 + MicVar_SD_Species::accum;
107 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
108 static int a_accum_idx (
const int a_ns,
115 + MicVar_SD_Aerosols::accum;
125 one_d_z, two_d_xz, two_d_yz, three_d
128 class SuperDropletsMoist :
public NullMoistLagrangian {
130 using FabPtr = std::shared_ptr<amrex::MultiFab>;
131 using MFPtr = std::unique_ptr<amrex::MultiFab>;
132 using BCTypeArr = amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2>;
137 SuperDropletsMoist ()
140 m_qstate_moist_size = 6;
141 m_qstate_nonmoist_size = -1;
142 m_name =
"super_droplets_moisture";
150 virtual ~SuperDropletsMoist () =
default;
156 virtual void Init (
const amrex::MultiFab&,
157 const amrex::BoxArray&,
158 const amrex::Geometry&,
164 virtual void InitParticles (
const int, MFPtr& )
override;
167 virtual void RestartParticles ( amrex::ParGDBBase*,
const std::string& )
override;
170 virtual void FinishInit (
const int&,
172 const amrex::Vector<MFPtr>&)
override;
176 amrex::Abort(
"Do not use this advance() for Lagrangian microphysics.");
180 void SetCurrentLevel (
const int& a_lev)
override
183 m_current_lev = a_lev;
187 int getDiagnosticsInterval ()
const override {
return m_diagnostics_iter; }
190 void EnsureMicFabVars (
const int a_lev,
const amrex::MultiFab& a_cons_vars);
193 amrex::iMultiFab buildFineMask (
const int a_lev)
const;
196 void InitLevel (
const int a_lev,
const amrex::MultiFab& a_cons_vars)
override;
207 const int& iteration,
209 amrex::Vector<amrex::Vector<amrex::MultiFab>>& cons_vars,
210 const amrex::Vector<MFPtr>& mf_array,
211 const BCTypeArr& bc_arr)
override;
218 virtual void Update_Micro_Vars (amrex::MultiFab& a_cons_vars)
override;
224 virtual void Update_State_Vars (amrex::MultiFab& a_cons_vars,
225 const amrex::MultiFab& a_z_phys_nd)
override;
228 virtual void AverageDownMicroVars (
const int finest_level)
override;
233 virtual void Copy_State_to_Micro (
const amrex::MultiFab& a_state)
override;
238 virtual void Copy_Micro_to_State (amrex::MultiFab& a_state)
override;
241 inline virtual amrex::MultiFab* Qmoist_Ptr (
const int& a_idx)
override
244 const int lev = m_current_lev;
245 if (lev < 0 || lev >=
static_cast<int>(m_mic_fab_vars.size()) ||
246 m_mic_var_map[a_idx] < 0 || m_mic_var_map[a_idx] >=
static_cast<int>(m_mic_fab_vars[lev].size())) {
249 return m_mic_fab_vars[lev][m_mic_var_map[a_idx]].get();
253 inline virtual int Qmoist_Size ()
override
255 return m_qmoist_size;
260 Get_Surface_Precip_Accumulation_Ptrs (
const int& a_lev)
const override
263 if (a_lev >= 0 && a_lev <
static_cast<int>(m_mic_fab_vars.size())) {
271 inline virtual int Qstate_Moist_Size ()
override
273 return m_qstate_moist_size;
277 inline virtual int Qstate_Moist_NumConc_Size ()
override
279 return m_qstate_moist_numconc_size;
283 inline virtual int Qstate_NonMoist_Size ()
override
286 return m_qstate_nonmoist_size;
289 bool Qstate_Is_Diagnostic (
int q)
const override
294 return q >= m_qstate_moist_size && (
q - m_qstate_moist_size) % 2 == 1;
297 void Update_Diagnostic_State (amrex::MultiFab&,
const amrex::MultiFab&)
override;
300 inline virtual ERFPC* getParticleContainer ()
override
302 return m_super_droplets;
305 inline virtual const std::string& getName ()
const override
311 virtual void computeQcQrWater (
const amrex::MultiFab& a_z_phys_nd);
314 virtual void computeQiQgQsWater (
const amrex::MultiFab& a_z_phys_nd);
317 virtual void computeQcSpecies (
const amrex::MultiFab& a_z_phys_nd)
319 for (
int is = m_istart_sp; is <
m_num_species; is++) { computeQcSpecies(is, a_z_phys_nd); }
323 virtual void computeQcSpecies (
const int a_i,
const amrex::MultiFab& a_z_phys_nd);
326 virtual void computeQc (
const int a_i,
const amrex::MultiFab& a_z_phys_nd)
328 if (a_i == m_idx_w) { computeQcQrWater(a_z_phys_nd); }
329 else if (a_i == m_idx_i) { computeQiQgQsWater(a_z_phys_nd); }
330 else { computeQcSpecies(a_i, a_z_phys_nd); }
334 virtual void computeQtWater ();
337 virtual void computeQtSpecies ()
339 for (
int is = m_istart_sp; is <
m_num_species; is++) { computeQtSpecies(is); }
343 virtual void computeQtSpecies (
const int a_i);
346 virtual void rainAccumulation (
const amrex::MultiFab& a_z_phys_nd);
349 virtual void snowAccumulation (
const amrex::MultiFab& a_z_phys_nd);
352 virtual void speciesAccumulation (
const amrex::MultiFab& a_z_phys_nd);
355 virtual void aerosolAccumulation (
const amrex::MultiFab& a_z_phys_nd);
358 void densityToRatio ( amrex::MultiFab&,
const int a_comp = 0 );
360 void ratioToDensity ( amrex::MultiFab&,
const int a_comp = 0 );
367 virtual void phaseChange (
const amrex::Real& a_dt,
368 const amrex::Vector<MFPtr>& a_z,
372 virtual void phaseChange_LV_w (
const amrex::Real&,
const amrex::Vector<MFPtr>&,
const int,
373 const amrex::iMultiFab&);
376 virtual void phaseChange_LV_s (
const int,
const amrex::Real&,
const amrex::Vector<MFPtr>&,
const int,
377 const amrex::iMultiFab&);
380 virtual void phaseChange_SL_w (
const amrex::Real&,
const amrex::Vector<MFPtr>&,
const int,
381 const amrex::iMultiFab&);
384 virtual void phaseChange_SV_i (
const amrex::Real&,
const amrex::Vector<MFPtr>&,
const int,
385 const amrex::iMultiFab&);
387 virtual void GetPlotVarNames (amrex::Vector<std::string>& a_names)
const override
390 a_names.push_back(
"qv_"+amrex::getEnumNameString(
m_species[v]));
391 a_names.push_back(
"qc_"+amrex::getEnumNameString(
m_species[v]));
392 a_names.push_back(
"qt_"+amrex::getEnumNameString(
m_species[v]));
393 a_names.push_back(
"sat_ratio_"+amrex::getEnumNameString(
m_species[v]));
394 a_names.push_back(
"accum_"+amrex::getEnumNameString(
m_species[v]));
396 for (
int v = 0; v < m_num_aerosols; v++) {
397 a_names.push_back(
"accum_"+amrex::getEnumNameString(m_aerosols[v]));
401 virtual void GetPlotVar (
const std::string& ,
402 amrex::MultiFab& )
const override
404 amrex::Abort(
"SuperDropletsMoist::GetPlotVar() requires a level argument");
407 virtual void GetPlotVar (
const std::string& a_name,
408 amrex::MultiFab& a_mf,
409 const int a_lev)
const override
412 AMREX_ASSERT(a_mf.nComp() >= 1);
414 const int lev = a_lev;
415 if (lev < 0 || lev >=
static_cast<int>(m_mic_fab_vars.size()) ||
416 m_mic_fab_vars[lev].empty()) {
420 const auto& lev_vec = m_mic_fab_vars[lev];
423 auto try_copy = [&](
const std::string& prefix,
int idx) ->
bool {
424 if (a_name == prefix) {
425 if (
idx >= 0 &&
idx <
static_cast<int>(lev_vec.size()) && lev_vec[
idx] &&
426 lev_vec[
idx]->boxArray() == a_mf.boxArray() &&
427 lev_vec[
idx]->DistributionMap() == a_mf.DistributionMap()) {
428 amrex::MultiFab::Copy(a_mf, *lev_vec[
idx],
429 0, 0, 1, amrex::IntVect::TheZeroVector());
438 std::string sp_name = amrex::getEnumNameString(
m_species[v]);
439 if (try_copy(
"qv_" + sp_name, s_qv_idx(v, m_istart_sp)) ||
440 try_copy(
"qc_" + sp_name, s_qc_idx(v, m_istart_sp)) ||
441 try_copy(
"qt_" + sp_name, s_qt_idx(v, m_istart_sp)) ||
442 try_copy(
"sat_ratio_" + sp_name, s_sr_idx(v, m_istart_sp)) ||
443 try_copy(
"accum_" + sp_name, s_accum_idx(v, m_istart_sp))) {
449 for (
int v = 0; v < m_num_aerosols; v++) {
450 std::string ae_name = amrex::getEnumNameString(m_aerosols[v]);
451 if (try_copy(
"accum_" + ae_name, a_accum_idx(m_num_nonmoist_sp, v))) {
return; }
454 amrex::Abort(
"SuperDropletsMoist::GetPlotVar() called with invalid name");
457 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
458 int q_qv_idx (
const int a_i,
462 return RhoQ1_comp + m_qstate_moist_size + 2*(a_i-a_is) + 0;
465 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
466 int q_qc_idx (
const int a_i,
470 return RhoQ1_comp + m_qstate_moist_size + 2*(a_i-a_is) + 1;
475 bool m_flag_phase_change;
476 bool m_flag_advection;
477 bool m_flag_coalescence;
484 bool m_init_phase_change;
485 bool m_restarted_particles =
false;
489 int m_diagnostics_iter;
492 SDMoistInit m_init_type;
497 amrex::Geometry m_geom;
501 int m_qstate_moist_size;
504 int m_qstate_moist_numconc_size = 0;
507 int m_qstate_nonmoist_size;
510 amrex::Vector<int> m_mic_var_map;
513 amrex::Vector<amrex::Vector<FabPtr>> m_mic_fab_vars;
516 mutable int m_current_lev = 0;
523 std::vector<Species::Name> m_aerosols;
527 int m_num_substeps_phase_change;
530 bool m_kinematic_mode;
533 SDMSimulationDim m_dimensionality;
536 bool m_recycle_particles;
548 int m_num_nonmoist_sp;
556 SuperDropletPC* m_super_droplets;
559 virtual void readInputs ();
AMREX_ENUM(PlotFileType, None, Amrex, Netcdf)
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:66
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
int m_num_species
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:32
std::vector< std::string > m_species
Definition: ERF_InitCustomPert_MultiSpeciesBubble.H:31
Real q_t
Definition: ERF_InitCustomPert_SquallLine.H:28
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int idx(int i, int j, int k, int nx, int ny)
Definition: ERF_InitForEnsemble.cpp:404
Contains the Lagrangian moisture model base class.
amrex::Real Real
Definition: ERF_ShocInterface.H:19
virtual void SetCurrentLevel(const int &lev)
Definition: ERF_NullMoist.H:115
virtual void Update_Micro_Vars(amrex::MultiFab &)
Definition: ERF_NullMoist.H:37
@ NumVars
Definition: ERF_NOAHMP_Fields.H:116
@ rho
Definition: ERF_Kessler.H:25
@ theta
Definition: ERF_Kessler.H:26
@ rain_accum
Definition: ERF_Kessler.H:36
@ graupel_accum
Definition: ERF_Morrison.H:55
@ precip_accum
Definition: ERF_Morrison.H:56
@ snow_accum
Definition: ERF_Morrison.H:54
@ q
Definition: ERF_WSM6.H:294
Definition: ERF_DataStruct.H:715
Definition: ERF_SurfacePrecipitation.H:34
SurfacePrecipAccumulationSource rain
Definition: ERF_SurfacePrecipitation.H:36