21 params.
addClassDescription(
"Conservative form of $\\nabla \\cdot \\vec{v} u$ which in its weak "
22 "form is given by: $(-\\nabla \\psi_i, \\vec{v} u)$. Velocity can be "
23 "given as 1) a variable, for which the gradient is automatically "
24 "taken, 2) a vector variable, or a 3) vector material.");
25 params.
addParam<MaterialPropertyName>(
26 "velocity_scalar_coef",
28 "Name of material property multiplied against the velocity to scale advection strength.");
29 MooseEnum upwinding_type(
"none full",
"none");
32 "Type of upwinding used. None: Typically results in overshoots and "
33 "undershoots, but numerical diffusion is minimized. Full: Overshoots "
34 "and undershoots are avoided, but numerical diffusion is large");
35 params.
addParam<MaterialPropertyName>(
"advected_quantity",
36 "An optional material property to be advected. If not "
37 "supplied, then the variable will be used.");
39 "velocity_as_variable_gradient",
40 "Gradient of this coupled variable is used to define the advection velocity. "
41 "Can be supplied instead of velocity material or velocity variable.");
52 params.
addParam<MaterialPropertyName>(
"velocity_material",
"Velocity vector given as a material");
61 params.
addCoupledVar(
"velocity_variable",
"Velocity vector given as a variable");
62 params.
addParam<MaterialPropertyName>(
"velocity",
"Velocity vector given as a material");
63 params.
deprecateParam(
"velocity",
"velocity_material",
"12/31/2025");
70 _scalar(this->template getGenericMaterialProperty<Real, is_ad>(
"velocity_scalar_coef")),
71 _coupled_variable_present(isParamValid(
"velocity_as_variable_gradient")),
72 _coupled_variable_var(_coupled_variable_present ? coupled(
"velocity_as_variable_gradient") : 0),
74 _coupled_variable_present
75 ? &this->template coupledGenericGradient<is_ad>(
"velocity_as_variable_gradient")
76 : (this->isParamValid(
"velocity_variable")
77 ? &this->template coupledGenericVectorValue<is_ad>(
"velocity_variable")
78 : (this->isParamValid(
"velocity_material")
79 ? &this->template getGenericMaterialProperty<RealVectorValue, is_ad>(
83 _user_supplied_adv_quant(isParamValid(
"advected_quantity")),
85 _user_supplied_adv_quant
86 ? this->template getGenericMaterialProperty<Real, is_ad>(
"advected_quantity").get()
90 _u_nodal(_var.template genericDofValues<is_ad>()),
96 "Use a different kernel (i.e., diffusion) if the gradient used as the velocity is "
97 "the same as the member variable");
101 "Upwinding is not compatible with an advected quantity that is not the primary variable.");
107 "velocity_as_variable_gradient",
108 "One and only one of the following input variables must be specified: velocity_variable, "
109 "velocity_material, or velocity_as_variable_gradient.");
113 "_local_ke not computed for global AD indexing. Save-in is deprecated anyway. Use "
114 "the tagging system instead.");
121 return -_grad_test[_i][_qp] * (*_velocity)[_qp] * _scalar[_qp];
130 return negSpeedQp() * _adv_quant[_qp];
139 if (!_user_supplied_adv_quant)
140 return negSpeedQp() * _phi[_j][_qp];
148 mooseError(
"Internal error, should never get here when using AD");
158 if (_coupled_variable_present && _coupled_variable_var == jvar)
159 return -_grad_test[_i][_qp] * _grad_phi[_j][_qp] * _adv_quant[_qp] * _scalar[_qp];
168 mooseError(
"Internal error, should never get here when using AD");
178 case UpwindingType::none:
181 case UpwindingType::full:
182 fullUpwind(JacRes::CALCULATE_RESIDUAL);
193 case UpwindingType::none:
196 case UpwindingType::full:
197 fullUpwind(JacRes::CALCULATE_JACOBIAN);
207 const unsigned int num_nodes = _test.size();
211 _my_local_re.resize(_var.dofIndices().size());
213 if (!is_ad && (res_or_jac == JacRes::CALCULATE_JACOBIAN))
214 prepareMatrixTag(this->_assembly, _var.number(), _var.number());
219 _upwind_node.resize(num_nodes);
220 for (_i = 0; _i < num_nodes; ++_i)
222 for (_qp = 0; _qp < this->_qrule->n_points(); _qp++)
223 _my_local_re(_i) += this->_JxW[_qp] * this->_coord[_qp] * negSpeedQp();
230 if (res_or_jac == JacRes::CALCULATE_JACOBIAN)
231 _dtotal_mass_out.assign(num_nodes, 0.0);
233 for (
const auto n : make_range(num_nodes))
237 if constexpr (!is_ad)
238 if (res_or_jac == JacRes::CALCULATE_JACOBIAN)
240 if (_test.size() == _phi.size())
247 _local_ke(n, n) += _my_local_re(n);
249 _dtotal_mass_out[n] += _local_ke(n, n);
251 _my_local_re(n) *= getUNodal(n);
252 total_mass_out += _my_local_re(n);
255 total_in -= _my_local_re(n);
260 for (
const auto n : make_range(num_nodes))
261 if (!_upwind_node[n])
263 if constexpr (!is_ad)
264 if (res_or_jac == JacRes::CALCULATE_JACOBIAN)
265 for (_j = 0; _j < _phi.size(); _j++)
266 _local_ke(n, _j) += _my_local_re(n) * _dtotal_mass_out[_j] / total_in;
267 _my_local_re(n) *= total_mass_out / total_in;
271 if (res_or_jac == JacRes::CALCULATE_RESIDUAL)
273 this->addResiduals(this->_assembly, _my_local_re, _var.dofIndices(), _var.scalingFactor());
275 if (this->_has_save_in)
276 for (
const auto & var : this->_save_in)
280 if (res_or_jac == JacRes::CALCULATE_JACOBIAN)
283 this->addJacobian(this->_assembly, _my_local_re, _var.dofIndices(), _var.scalingFactor());
285 accumulateTaggedLocalMatrix();
registerMooseObject("MooseApp", ConservativeAdvection)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Moose::GenericType< Real, is_ad > GenericReal
Advection of the variable by the velocity provided by the user.
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
For coupling standard variables.
const unsigned int _coupled_variable_var
Coupled variable variable number.
JacRes
enum to make the code clearer
static InputParameters generalParams()
virtual GenericReal< is_ad > negSpeedQp() const
Returns - _grad_test * velocity.
virtual void computeJacobian() override
Compute this Kernel's contribution to the diagonal Jacobian entries.
virtual void computeResidual() override
Compute this Kernel's contribution to the residual.
const bool _coupled_variable_present
Flag to determine if coupled variable is present.
ConservativeAdvectionTempl(const InputParameters ¶meters)
virtual Real computeQpJacobian() override
Compute this Kernel's contribution to the Jacobian at the current quadrature point.
static InputParameters validParams()
UpwindingType
Type of upwinding.
void fullUpwind(JacRes res_or_jac)
Calculates the fully-upwind Residual and Jacobian (depending on res_or_jac)
virtual GenericReal< is_ad > computeQpResidual() override
Compute this Kernel's contribution to the residual at the current quadrature point.
const MooseArray< GenericRealVectorValue< is_ad > > * _velocity
advection velocity
enum ConservativeAdvectionTempl::UpwindingType _upwinding
static InputParameters validParams()
bool _has_diag_save_in
The aux variables to save the diagonal Jacobian contributions to.
MooseVariable & _var
This is a regular kernel so we cast to a regular MooseVariable.
void paramError(const std::string ¶m, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
unsigned int number() const
Get variable number coming from libMesh.
virtual void computeResidual()=0
Compute this object's contribution to the residual.
virtual void computeJacobian()=0
Compute this object's contribution to the diagonal Jacobian entries.