24 "continuous Galerkin finite element method");
45 std::string kernel_type;
47 kernel_type =
_use_ad ?
"ADMatDiffusion" :
"MatDiffusion";
50 const auto &
d = getParam<std::vector<MooseFunctorName>>(
"diffusivity_functors")[s];
52 kernel_type =
"FunctionDiffusion";
55 "diffusivity_functors",
"No diffusion kernel implemented for the source type of",
d);
59 params.
set<NonlinearVariableName>(
"variable") = var_name;
64 params.
set<MaterialPropertyName>(
"diffusivity") =
65 getParam<std::vector<MaterialPropertyName>>(
"diffusivity_matprops")[s];
67 params.
set<FunctionName>(
"function") =
68 getParam<std::vector<MooseFunctorName>>(
"diffusivity_functors")[s];
77 std::string kernel_type;
78 const auto & sources = getParam<std::vector<MooseFunctorName>>(
"source_functors");
79 const auto & source = sources[s];
82 kernel_type =
_use_ad ?
"ADBodyForce" :
"BodyForce";
84 kernel_type =
_use_ad ?
"ADCoupledForce" :
"CoupledForce";
87 "No kernel defined for a source term in CG for the type of '",
92 params.
set<NonlinearVariableName>(
"variable") = var_name;
96 const auto coefs = getParam<std::vector<Real>>(
"source_coefs");
97 const auto coef = coefs[s];
99 params.
set<Real>(
"value") = MooseUtils::convert<Real>(source) * coef;
102 params.
set<Real>(
"value") = coef;
103 params.
set<FunctionName>(
"function") = source;
107 params.
set<Real>(
"value") = coef;
108 params.
set<PostprocessorName>(
"postprocessor") = source;
112 params.
set<Real>(
"coef") = coef;
113 params.
set<std::vector<VariableName>>(
"v") = {source};
122 const std::string kernel_type =
_use_ad ?
"ADTimeDerivative" :
"TimeDerivative";
124 params.
set<NonlinearVariableName>(
"variable") = var_name;
136 const auto & boundary_fluxes =
137 getParam<std::vector<std::vector<MooseFunctorName>>>(
"boundary_fluxes");
145 const auto & bc_flux = boundary_fluxes[s][i];
149 std::string bc_type =
"";
151 bc_type =
_use_ad ?
"ADNeumannBC" :
"NeumannBC";
153 bc_type =
"CoupledVarNeumannBC";
155 bc_type =
_use_ad ?
"ADFunctionNeumannBC" :
"FunctionNeumannBC";
156 else if (
getProblem().hasPostprocessorValueByName(bc_flux))
157 bc_type =
"PostprocessorNeumannBC";
159 bc_type =
"FunctorNeumannBC";
163 params.
set<NonlinearVariableName>(
"variable") = var_name;
168 params.
set<Real>(
"value") = MooseUtils::convert<Real>(bc_flux);
170 params.
set<std::vector<VariableName>>(
"v") = {bc_flux};
172 params.
set<FunctionName>(
"function") = bc_flux;
174 params.
set<PostprocessorName>(
"postprocessor") = bc_flux;
176 params.
set<MooseFunctorName>(
"functor") = bc_flux;
185 const auto & boundary_values =
186 getParam<std::vector<std::vector<MooseFunctorName>>>(
"boundary_values");
192 const auto & bc_value = boundary_values[s][i];
195 std::string bc_type =
"";
197 bc_type =
_use_ad ?
"ADDirichletBC" :
"DirichletBC";
199 bc_type =
_use_ad ?
"ADMatchedValueBC" :
"MatchedValueBC";
201 bc_type =
_use_ad ?
"ADFunctionDirichletBC" :
"FunctionDirichletBC";
202 else if (
getProblem().hasPostprocessorValueByName(bc_value))
203 bc_type =
"PostprocessorDirichletBC";
205 bc_type =
"FunctorDirichletBC";
208 params.
set<NonlinearVariableName>(
"variable") = var_name;
213 params.
set<Real>(
"value") = MooseUtils::convert<Real>(bc_value);
215 params.
set<std::vector<VariableName>>(
"v") = {bc_value};
217 params.
set<FunctionName>(
"function") = bc_value;
219 params.
set<PostprocessorName>(
"postprocessor") = bc_value;
221 params.
set<MooseFunctorName>(
"functor") = bc_value;
240 "Cannot specify the variable order if variable " + var_name +
241 " is defined outside the Physics block");
246 const std::string variable_type =
"MooseVariable";
248 params.
set<
MooseEnum>(
"order") = getParam<MooseEnum>(
"variable_order");
registerMooseAction("ScalarTransportApp", MultiSpeciesDiffusionCG, "add_kernel")
registerMultiSpeciesDiffusionPhysicsBaseTasks("ScalarTransportApp", MultiSpeciesDiffusionCG)
virtual void addVariable(const std::string &var_type, const std::string &var_name, InputParameters ¶ms)
bool hasPostprocessorValueByName(const PostprocessorName &name) const
virtual void addBoundaryCondition(const std::string &bc_name, const std::string &name, InputParameters ¶meters)
virtual void addKernel(const std::string &kernel_name, const std::string &name, InputParameters ¶meters)
virtual bool hasFunction(const std::string &name, const THREAD_ID tid=0)
InputParameters getValidParams(const std::string &name) const
void paramError(const std::string ¶m, Args... args) const
bool isParamSetByUser(const std::string &name) const
const T & getParam(const std::string &name) const
bool isParamValid(const std::string &name) const
static InputParameters validParams()
Creates all the objects needed to solve diffusion equations for multiple species with a continuous Ga...
MultiSpeciesDiffusionCG(const InputParameters ¶meters)
virtual void addFEBCs() override
virtual void addFEKernels() override
static InputParameters validParams()
virtual void addSolverVariables() override
Base class to host all common parameters and attributes of Physics actions to solve the diffusion equ...
const bool _use_ad
Whether to use automatic differentiation or not.
const std::vector< std::vector< BoundaryName > > & _dirichlet_boundaries
Boundaries on which a Dirichlet boundary condition is applied. Outer indexing is variables.
const std::vector< VariableName > & _species_names
Name of the diffused variables.
static InputParameters validParams()
const std::vector< std::vector< BoundaryName > > & _neumann_boundaries
Boundaries on which a Neumann boundary condition is applied. Outer indexing is variables.
virtual FEProblemBase & getProblem()
bool shouldCreateTimeDerivative(const VariableName &var_name, const std::vector< SubdomainName > &blocks, const bool error_if_already_defined) const
void assignBlocks(InputParameters ¶ms, const std::vector< SubdomainName > &blocks) const
std::string prefix() const
bool variableExists(const VariableName &var_name, bool error_if_aux) const
const SolverSystemName & getSolverSystem(unsigned int variable_index) const
std::vector< SubdomainName > _blocks
bool parsesToReal(const std::string &input, Real *parsed_real)