22 "Base class for creating a diffusion equation for multiple diffused species");
24 params.
addRequiredParam<std::vector<VariableName>>(
"species",
"Species being diffused");
27 params.
addParam<std::vector<MaterialPropertyName>>(
28 "diffusivity_matprops",
29 "Material properties defining the diffusion coefficient for each species");
30 params.
addParam<std::vector<MooseFunctorName>>(
31 "diffusivity_functors",
"Functors specifying the diffusivity for each species");
34 params.
addParam<std::vector<MooseFunctorName>>(
35 "source_functors",
"Source terms in the diffusion problem for each species");
36 params.
addParam<std::vector<Real>>(
"source_coefs", {1},
"Coefficient multiplying the source");
39 params.
addParam<std::vector<std::vector<BoundaryName>>>(
40 "neumann_boundaries", {},
"Boundaries on which to apply a diffusive flux for each species");
41 params.
addParam<std::vector<std::vector<BoundaryName>>>(
42 "dirichlet_boundaries", {},
"Boundaries on which to apply a fixed value for each species");
43 params.
addParam<std::vector<std::vector<MooseFunctorName>>>(
46 "Functors to compute the diffusive flux on each Neumann boundary for each species");
47 params.
addParam<std::vector<std::vector<MooseFunctorName>>>(
50 "Functors to compute the diffusive flux on each Dirichlet boundary for each species");
53 "Boundary conditions");
56 params.
addParam<std::vector<FunctionName>>(
57 "initial_conditions_species",
"Functions describing the initial conditions for the species");
60 params.
addParam<std::vector<BoundaryName>>(
61 "compute_diffusive_fluxes_on", {},
"Surfaces to compute the diffusive flux on");
64 MooseEnum pc_options(
"default defer",
"default");
66 "preconditioning", pc_options,
"Which preconditioning to use for this Physics");
69 "use_automatic_differentiation",
71 "Whether to use automatic differentiation for all the terms in the equation");
79 _species_names(getParam<
std::vector<VariableName>>(
"species")),
80 _num_species(_species_names.size()),
81 _neumann_boundaries(getParam<
std::vector<
std::vector<BoundaryName>>>(
"neumann_boundaries")),
82 _dirichlet_boundaries(getParam<
std::vector<
std::vector<BoundaryName>>>(
"dirichlet_boundaries")),
83 _use_ad(getParam<bool>(
"use_automatic_differentiation"))
90 checkTwoDVectorParamsSameLength<BoundaryName, MooseFunctorName>(
"neumann_boundaries",
92 checkTwoDVectorParamsSameLength<BoundaryName, MooseFunctorName>(
"dirichlet_boundaries",
94 checkTwoDVectorParamsNoRespectiveOverlap<BoundaryName>(
95 {
"neumann_boundaries",
"dirichlet_boundaries"});
99 checkVectorParamsSameLength<VariableName, MooseFunctorName>(
"species",
"source_functors");
101 checkVectorParamsSameLength<VariableName, FunctionName>(
"species",
102 "initial_conditions_species");
115 const auto option_pair1 =
116 std::make_pair<MooseEnumItem, std::string>(
MooseEnumItem(
"-pc_type"),
"hypre");
117 const auto option_pair2 =
118 std::make_pair<MooseEnumItem, std::string>(
MooseEnumItem(
"-pc_hypre_type"),
"boomeramg");
129 for (
const auto & boundary_name :
130 getParam<std::vector<BoundaryName>>(
"compute_diffusive_fluxes_on"))
133 const std::string pp_type =
134 _use_ad ?
"ADSideDiffusiveFluxIntegral" :
"SideDiffusiveFluxIntegral";
136 params.
set<std::vector<VariableName>>(
"variable") = {var_name};
139 params.set<MaterialPropertyName>(
"diffusivity") =
140 getParam<std::vector<MaterialPropertyName>>(
"diffusivity_matprops")[i];
143 params.set<MooseFunctorName>(
"functor_diffusivity") =
144 getParam<std::vector<MooseFunctorName>>(
"diffusivity_functors")[i];
146 mooseError(
"No diffusivity parameter specified");
147 params.set<std::vector<BoundaryName>>(
"boundary") = {boundary_name};
152 pp_type,
prefix() +
"diffusive_flux_" + var_name +
"_" + boundary_name, params);
160 for (
const auto & block :
component.blocks())
181 params.
set<VariableName>(
"variable") = var_name;
182 params.
set<FunctionName>(
"function") =
183 getParam<std::vector<FunctionName>>(
"initial_conditions_species")[i];
std::string prefix() const
void assignBlocks(InputParameters ¶ms, const std::vector< SubdomainName > &blocks) const
void addRequiredPhysicsTask(const std::string &task)
void addPetscPairsToPetscOptions(const std::vector< std::pair< MooseEnumItem, std::string >> &petsc_pair_options)
static const std::string component
InputParameters getValidParams(const std::string &name) const
const MooseEnum & _preconditioning
const ExecFlagType EXEC_TIMESTEP_END
bool shouldCreateIC(const VariableName &var_name, const std::vector< SubdomainName > &blocks, const bool ic_is_default_ic, const bool error_if_already_defined) const
std::vector< SubdomainName > _blocks
bool isParamValid(const std::string &name) const
virtual void addInitialCondition(const std::string &ic_name, const std::string &name, InputParameters ¶meters)
virtual FEProblemBase & getProblem()
virtual void addInitialConditions() override
Add initial conditions for each diffused variable.
virtual void addPostprocessor(const std::string &pp_name, const std::string &name, InputParameters ¶meters)
const T & getParam(const std::string &name) const
MultiSpeciesDiffusionPhysicsBase(const InputParameters ¶meters)
const ExecFlagType EXEC_LINEAR
void addComponent(const ActionComponent &component) override
virtual void addPreconditioning() override
Add default preconditioning options.
const std::vector< VariableName > & _species_names
Name of the diffused variables.
static InputParameters validParams()
const ExecFlagType EXEC_NONLINEAR
bool isParamSetByUser(const std::string &nm) const
void mooseError(Args &&... args) const
virtual void addPostprocessors() override
Add postprocessing of the fluxes.
const bool _use_ad
Whether to use automatic differentiation or not.
static InputParameters validParams()
void saveSolverVariableName(const VariableName &var_name)
auto index_range(const T &sizable)
const ExecFlagType EXEC_INITIAL