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];
const ExecFlagType EXEC_TIMESTEP_END
const ExecFlagType EXEC_INITIAL
const ExecFlagType EXEC_LINEAR
const ExecFlagType EXEC_NONLINEAR
virtual void addInitialCondition(const std::string &ic_name, const std::string &name, InputParameters ¶meters)
virtual void addPostprocessor(const std::string &pp_name, const std::string &name, InputParameters ¶meters)
InputParameters getValidParams(const std::string &name) const
bool isParamSetByUser(const std::string &name) const
void mooseError(Args &&... args) const
const T & getParam(const std::string &name) const
bool isParamValid(const std::string &name) const
const bool _use_ad
Whether to use automatic differentiation or not.
void addComponent(const ActionComponent &component) override
virtual void addPreconditioning() override
Add default preconditioning options.
MultiSpeciesDiffusionPhysicsBase(const InputParameters ¶meters)
const std::vector< VariableName > & _species_names
Name of the diffused variables.
virtual void addInitialConditions() override
Add initial conditions for each diffused variable.
static InputParameters validParams()
virtual void addPostprocessors() override
Add postprocessing of the fluxes.
void addPetscPairsToPetscOptions(const std::vector< std::pair< MooseEnumItem, std::string > > &petsc_pair_options)
static InputParameters validParams()
virtual FEProblemBase & getProblem()
bool shouldCreateIC(const VariableName &var_name, const std::vector< SubdomainName > &blocks, const bool ic_is_default_ic, const bool error_if_already_defined) const
void assignBlocks(InputParameters ¶ms, const std::vector< SubdomainName > &blocks) const
void saveSolverVariableName(const VariableName &var_name)
std::string prefix() const
std::vector< SubdomainName > _blocks
const MooseEnum & _preconditioning
void addRequiredPhysicsTask(const std::string &task)