19 #include "libmesh/threads.h" 26 if (std::is_same<T, Real>::value)
27 params.registerBase(
"Kernel");
28 else if (std::is_same<T, RealVectorValue>::value)
29 params.registerBase(
"VectorKernel");
31 ::mooseError(
"unsupported ADKernelTempl specialization");
46 _var(*this->mooseVariable()),
48 _grad_test(_var.adGradPhi()),
49 _regular_grad_test(_var.gradPhi()),
51 _grad_u(_var.adGradSln()),
52 _ad_JxW(_assembly.adJxW()),
53 _ad_coord(_assembly.adCoordTransformation()),
54 _ad_q_point(_assembly.adQPoints()),
55 _phi(_assembly.phi(_var)),
56 _grad_phi(_assembly.template adGradPhi<T>(_var)),
57 _regular_grad_phi(_assembly.gradPhi(_var)),
71 paramError(
"save_in",
"cannot use solution variable as save-in variable");
76 "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
91 paramError(
"diag_save_in",
"cannot use solution variable as diag save-in variable");
96 "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
107 template <
typename T>
111 precalculateResidual();
113 std::vector<Real> residuals(_test.size(), 0);
115 if (_use_displaced_mesh)
116 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
117 for (_i = 0; _i < _test.size(); _i++)
118 residuals[_i] +=
raw_value(_ad_JxW[_qp] * _ad_coord[_qp] * computeQpResidual());
120 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
121 for (_i = 0; _i < _test.size(); _i++)
122 residuals[_i] +=
raw_value(_JxW[_qp] * _coord[_qp] * computeQpResidual());
124 addResiduals(_assembly, residuals, _var.dofIndices(), _var.scalingFactor());
127 for (
unsigned int i = 0; i < _save_in.size(); i++)
128 _save_in[i]->sys().solution().add_vector(residuals.data(), _save_in[i]->dofIndices());
131 template <
typename T>
135 if (_residuals.size() != _test.size())
136 _residuals.resize(_test.size(), 0);
137 for (
auto & r : _residuals)
140 precalculateResidual();
141 if (_use_displaced_mesh)
142 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
145 _r *= _ad_coord[_qp];
146 for (_i = 0; _i < _test.size(); _i++)
147 _residuals[_i] += _r * computeQpResidual();
150 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
151 for (_i = 0; _i < _test.size(); _i++)
152 _residuals[_i] += _JxW[_qp] * _coord[_qp] * computeQpResidual();
155 template <
typename T>
161 if (_has_diag_save_in && !_sys.computingScalingJacobian())
162 mooseError(
"_local_ke not computed for global AD indexing. Save-in is deprecated anyway. Use " 163 "the tagging system instead.");
166 template <
typename T>
170 computeResidualsForJacobian();
171 addJacobian(_assembly, _residuals, dofIndices(), _var.scalingFactor());
174 template <
typename T>
181 template <
typename T>
185 if (_my_elem != _current_elem)
188 _my_elem = _current_elem;
192 template <
typename T>
198 template <
typename T>
202 computeResidualsForJacobian();
203 addResidualsAndJacobian(_assembly, _residuals, _var.dofIndices(), _var.scalingFactor());
void computeOffDiagJacobianScalar(unsigned int jvar) override
Computes jacobian block with respect to a scalar variable.
void computeResidual() override
Compute this object's contribution to the residual.
virtual void haveADObjects(bool have_ad_objects)
Method for setting whether we have any ad objects.
std::vector< MooseVariableFEBase * > _save_in
std::string incompatVarMsg(MooseVariableFieldBase &var1, MooseVariableFieldBase &var2)
Builds and returns a string of the form:
std::vector< AuxVariableName > _diag_save_in_strings
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
static InputParameters validParams()
void computeJacobian() override
Compute this object's contribution to the diagonal Jacobian entries.
ADKernelTempl(const InputParameters ¶meters)
THREAD_ID _tid
The thread ID for this kernel.
void jacobianSetup() override
Gets called just before the Jacobian is computed and before this object is asked to do its job...
bool _has_diag_save_in
The aux variables to save the diagonal Jacobian contributions to.
const FEType & feType() const
Get the type of finite element object.
An interface for accessing Moose::Functors for systems that care about automatic differentiation, e.g.
void computeADJacobian()
compute all the Jacobian entries
SystemBase & _sys
Reference to the EquationSystem object.
void computeResidualAndJacobian() override
Compute this object's contribution to the residual and Jacobian simultaneously.
MooseVariableFE< T > * mooseVariable() const
This is the common base class for the three main kernel types implemented in MOOSE, Kernel, VectorKernel and ArrayKernel.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
std::vector< MooseVariableFEBase * > _diag_save_in
SubProblem & _subproblem
Reference to this kernel's SubProblem.
VarKindType
Framework-wide stuff.
bool _has_save_in
The aux variables to save the residual contributions to.
FEProblemBase & _fe_problem
Reference to this kernel's FEProblemBase.
virtual MooseVariable & getStandardVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the variable reference for requested MooseVariable which may be in any system.
NonlinearSystemBase & getNonlinearSystemBase(const unsigned int sys_num)
static InputParameters validParams()
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 ...
unsigned int number() const
Gets the number of this system.
std::vector< AuxVariableName > _save_in_strings
void addMooseVariableDependency(MooseVariableFieldBase *var)
Call this function to add the passed in MooseVariableFieldBase as a variable that this object depends...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void addVariableToZeroOnResidual(std::string var_name)
Adds this variable to the list of variables to be zeroed during each residual evaluation.
virtual void computeResidualsForJacobian()
compute the _residuals member for filling the Jacobian.
Interface for objects that need to get values of MooseVariables.
virtual void addVariableToZeroOnJacobian(std::string var_name)
Adds this variable to the list of variables to be zeroed during each Jacobian evaluation.
MooseVariableFE< T > & _var
This is a regular kernel so we cast to a regular MooseVariable.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
static InputParameters validParams()
SystemBase & sys()
Get the system this variable is part of.
void computeOffDiagJacobian(unsigned int) override
Computes this object's contribution to off-diagonal blocks of the system Jacobian matrix...