https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ADDGKernel.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "ADDGKernel.h"
11#include "Assembly.h"
12#include "MooseVariable.h"
13#include "Problem.h"
14#include "SubProblem.h"
15#include "NonlinearSystemBase.h"
16#include "ADUtils.h"
17
18// libmesh includes
19#include "libmesh/threads.h"
20
23{
26 "Base class for all DG kernels making use of automatic differentiation");
27 return params;
28}
29
31 : DGKernelBase(parameters),
33 this, false, Moose::VarKindType::VAR_SOLVER, Moose::VarFieldType::VAR_FIELD_STANDARD),
34 _var(*mooseVariable()),
35 _phi(_assembly.phiFace(_var)),
36 _grad_phi(_assembly.gradPhiFace(_var)),
37
38 _test(_var.phiFace()),
39 _grad_test(_var.gradPhiFace()),
40
41 _phi_neighbor(_assembly.phiFaceNeighbor(_var)),
42 _grad_phi_neighbor(_assembly.gradPhiFaceNeighbor(_var)),
43
44 _test_neighbor(_var.phiFaceNeighbor()),
45 _grad_test_neighbor(_var.gradPhiFaceNeighbor()),
46
47 _u(_var.adSln()),
48 _grad_u(_var.adGradSln()),
49 _u_neighbor(_var.adSlnNeighbor()),
50 _grad_u_neighbor(_var.adGradSlnNeighbor())
51{
53
55
56 _save_in.resize(_save_in_strings.size());
58
59 for (unsigned int i = 0; i < _save_in_strings.size(); i++)
60 {
65
67 mooseError("Trying to use solution variable " + _save_in_strings[i] +
68 " as a save_in variable in " + name());
69
70 if (var->feType() != _var.feType())
72 "save_in",
73 "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
75
76 _save_in[i] = var;
79 }
80
81 _has_save_in = _save_in.size() > 0;
82
83 for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
84 {
89
91 mooseError("Trying to use solution variable " + _diag_save_in_strings[i] +
92 " as a diag_save_in variable in " + name());
93
94 if (var->feType() != _var.feType())
96 "diag_save_in",
97 "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
99
100 _diag_save_in[i] = var;
103 }
104
105 _has_diag_save_in = _diag_save_in.size() > 0;
106}
107
108void
110{
111 bool is_elem;
112 if (type == Moose::Element)
113 is_elem = true;
114 else
115 is_elem = false;
116
117 const VariableTestValue & test_space = is_elem ? _test : _test_neighbor;
118
119 if (is_elem)
121 else
123
125 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
126 for (_i = 0; _i < test_space.size(); _i++)
127 _local_re(_i) += raw_value(_JxW[_qp] * _coord[_qp] * computeQpResidual(type));
128
130
131 if (_has_save_in)
132 for (const auto & var : _save_in)
133 {
134 const std::vector<dof_id_type> & dof_indices =
135 is_elem ? var->dofIndices() : var->dofIndicesNeighbor();
136 var->sys().solution().add_vector(_local_re, dof_indices);
137 }
138}
139
140void
142{
143 // AD only needs to do one computation for one variable because it does the derivatives all at
144 // once
145 if (!excludeBoundary())
146 {
149 }
150}
151
152void
154{
156 "With AD you should need one call per side");
157
159
160 std::vector<ADReal> residuals(test_space.size(), 0);
161
163 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
164 for (_i = 0; _i < test_space.size(); _i++)
165 residuals[_i] +=
166 _JxW[_qp] * _coord[_qp] *
168
170 residuals,
173
175 {
176 unsigned int rows = _local_ke.m();
177 DenseVector<Number> diag(rows);
178 for (unsigned int i = 0; i < rows; i++)
179 diag(i) = _local_ke(i, i);
180
181 for (const auto & var : _diag_save_in)
182 {
184 var->sys().solution().add_vector(diag, var->dofIndices());
185 else
186 var->sys().solution().add_vector(diag, var->dofIndicesNeighbor());
187 }
188 }
189}
190
191void
192ADDGKernel::computeOffDiagJacobian(const unsigned int jvar_num)
193{
194 // AD only needs to do one computation for one variable because it does the derivatives all at
195 // once
196 if (!excludeBoundary() && jvar_num == _var.number())
197 {
198 const auto & jvar = getVariable(jvar_num);
201 }
202}
203
204void
206{
208 "With AD you should need one call per side");
209
211
212 std::vector<ADReal> residuals(test_space.size(), 0);
213
215 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
216 for (_i = 0; _i < test_space.size(); _i++)
217 residuals[_i] +=
218 _JxW[_qp] * _coord[_qp] *
220
222 residuals,
225}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
OutputTools< Real >::VariableTestValue VariableTestValue
Definition MooseTypes.h:358
MooseVariable & _var
Variable this kernel operates on.
Definition ADDGKernel.h:36
const VariableTestValue & _test_neighbor
Side test function.
Definition ADDGKernel.h:50
static InputParameters validParams()
Definition ADDGKernel.C:22
const VariableTestValue & _test
test functions
Definition ADDGKernel.h:42
void computeElemNeighJacobian(Moose::DGJacobianType type) override final
Computes the element/neighbor-element/neighbor Jacobian.
Definition ADDGKernel.C:153
virtual ADReal computeQpResidual(Moose::DGResidualType type)=0
Compute this Kernel's contribution to the residual at the current quadrature point.
void computeElemNeighResidual(Moose::DGResidualType type) override final
Computes the residual for this element or the neighbor.
Definition ADDGKernel.C:109
void computeJacobian() override final
Computes the jacobian for the current side.
Definition ADDGKernel.C:141
void computeOffDiagElemNeighJacobian(Moose::DGJacobianType type, const MooseVariableFEBase &jvar) override final
Computes the element-element off-diagonal Jacobian.
Definition ADDGKernel.C:205
void computeOffDiagJacobian(unsigned int jvar) override final
Computes d-residual / d-jvar...
Definition ADDGKernel.C:192
Serves as a base class for DGKernel and ADDGKernel.
const QBase *const & _qrule
Quadrature rule.
friend class ADDGKernel
std::vector< AuxVariableName > _save_in_strings
std::vector< MooseVariableFEBase * > _diag_save_in
const MooseArray< Real > & _JxW
Jacobian det times quadrature weighting on quadrature points.
unsigned int _i
std::vector< AuxVariableName > _diag_save_in_strings
unsigned int _qp
bool _has_diag_save_in
The aux variables to save the diagonal Jacobian contributions to.
bool excludeBoundary() const
Check current element if it contains broken boundary.
std::vector< MooseVariableFEBase * > _save_in
static InputParameters validParams()
Factory constructor initializes all internal references needed for residual computation.
const MooseArray< Real > & _coord
Coordinate transform mainly for curvilinear coordinates.
bool _has_save_in
The aux variables to save the residual contributions to.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump.
const std::string & type() const
Get the type of this class.
Definition MooseBase.h:93
const std::string & name() const
Get the name of the class.
Definition MooseBase.h:103
void paramError(const std::string &param, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
Definition MooseBase.h:457
const libMesh::FEType & feType() const
Get the type of finite element object.
void scalingFactor(const std::vector< Real > &factor)
Set the scaling factor for this variable.
SystemBase & sys()
Get the system this variable is part of.
unsigned int number() const
Get variable number coming from libMesh.
void addMooseVariableDependency(MooseVariableFieldBase *var)
Call this function to add the passed in MooseVariableFieldBase as a variable that this object depends...
const std::vector< dof_id_type > & dofIndicesNeighbor() const final
Get neighbor DOF indices for currently selected element.
const std::vector< dof_id_type > & dofIndices() const final
Get local DoF indices.
This class provides an interface for common operations on field variables of both FE and FV types wit...
MooseVariableFE< T > * mooseVariable() const
Return the MooseVariableFE object that this interface acts on.
Enhances MooseVariableInterface interface provide values from neighbor elements.
THREAD_ID _tid
The thread ID for this kernel.
Assembly & _assembly
Reference to this Kernel's assembly object.
const MooseVariableFieldBase & getVariable(unsigned int jvar_num) const
Retrieve the variable object from our system associated with jvar_num.
SubProblem & _subproblem
Reference to this kernel's SubProblem.
SystemBase & _sys
Reference to the EquationSystem object.
virtual void precalculateResidual()
virtual void haveADObjects(bool have_ad_objects)
Method for setting whether we have any ad objects.
Definition SubProblem.h:775
virtual const MooseVariableFieldBase & getVariable(const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY) const =0
Returns the variable reference for requested variable which must be of the expected_var_type (Nonline...
virtual void addVariableToZeroOnJacobian(std::string var_name)
Adds this variable to the list of variables to be zeroed during each Jacobian evaluation.
Definition SystemBase.C:181
virtual void addVariableToZeroOnResidual(std::string var_name)
Adds this variable to the list of variables to be zeroed during each residual evaluation.
Definition SystemBase.C:175
virtual bool hasVariable(const std::string &var_name) const
Query a system for a variable.
Definition SystemBase.C:850
DenseMatrix< Number > _local_ke
Holds local Jacobian entries as they are accumulated by this Kernel.
void addJacobian(Assembly &assembly, const Residuals &residuals, const Indices &dof_indices, Real scaling_factor)
Add the provided residual derivatives into the Jacobian for the provided dof indices.
void accumulateTaggedLocalResidual()
Local residual blocks will be appended by adding the current local kernel residual.
void prepareVectorTagNeighbor(Assembly &assembly, unsigned int ivar)
Prepare data for computing element residual the according to active tags for DG and interface kernels...
void prepareVectorTag(Assembly &assembly, unsigned int ivar)
Prepare data for computing element residual according to active tags.
DenseVector< Number > _local_re
Holds local residual entries as they are accumulated by this Kernel.
unsigned int m() const
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
@ VAR_FIELD_STANDARD
Definition MooseTypes.h:777
DGResidualType
Definition MooseTypes.h:798
@ Element
Definition MooseTypes.h:799
@ Neighbor
Definition MooseTypes.h:800
@ VAR_AUXILIARY
Definition MooseTypes.h:771
@ VAR_SOLVER
Definition MooseTypes.h:770
DGJacobianType
Definition MooseTypes.h:804
@ NeighborNeighbor
Definition MooseTypes.h:808
@ ElementElement
Definition MooseTypes.h:805
std::string incompatVarMsg(MooseVariableFieldBase &var1, MooseVariableFieldBase &var2)
Builds and returns a string of the form:
Definition MooseError.C:26