https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ADIntegratedBC.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 "ADIntegratedBC.h"
11
12// MOOSE includes
13#include "Assembly.h"
14#include "SubProblem.h"
15#include "SystemBase.h"
16#include "MooseVariableFE.h"
17#include "MooseVariableScalar.h"
18#include "ADUtils.h"
19
20#include "libmesh/quadrature.h"
21
22template <typename T>
30
31template <typename T>
33 : IntegratedBCBase(parameters),
35 false,
36 "variable",
37 Moose::VarKindType::VAR_SOLVER,
38 std::is_same<T, Real>::value ? Moose::VarFieldType::VAR_FIELD_STANDARD
39 : Moose::VarFieldType::VAR_FIELD_VECTOR),
41 _var(*this->mooseVariable()),
42 _normals(_assembly.adNormals()),
43 _ad_q_points(_assembly.adQPointsFace()),
44 _test(_var.phiFace()),
45 _grad_test(_var.adGradPhiFace()),
46 _u(_var.adSln()),
47 _grad_u(_var.adGradSln()),
48 _ad_JxW(_assembly.adJxWFace()),
49 _ad_coord(_assembly.adCoordTransformation()),
50 _phi(_assembly.phi(_var)),
51 _use_displaced_mesh(getParam<bool>("use_displaced_mesh"))
52{
54
56
57 _save_in.resize(_save_in_strings.size());
59
60 for (unsigned int i = 0; i < _save_in_strings.size(); i++)
61 {
63
64 if (var->feType() != _var.feType())
66 "save_in",
67 "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
69 _save_in[i] = var;
72 }
73
74 _has_save_in = _save_in.size() > 0;
75
76 for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
77 {
79
80 if (var->feType() != _var.feType())
82 "diag_save_in",
83 "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
85
86 _diag_save_in[i] = var;
89 }
90
92}
93
94template <typename T>
95void
97{
98 _residuals.resize(_test.size(), 0);
99 for (auto & r : _residuals)
100 r = 0;
101
102 precalculateResidual();
103 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
104 {
105 const auto jxw_c = _JxW[_qp] * _coord[_qp];
106 for (_i = 0; _i < _test.size(); _i++)
107 _residuals[_i] += jxw_c * raw_value(computeQpResidual());
108 }
109
110 addResiduals(_assembly, _residuals, _var.dofIndices(), _var.scalingFactor());
111
112 if (_has_save_in)
113 for (unsigned int i = 0; i < _save_in.size(); i++)
114 _save_in[i]->sys().solution().add_vector(_residuals.data(), _save_in[i]->dofIndices());
115}
116
117template <typename T>
118void
120{
121 if (_residuals_and_jacobians.size() != _test.size())
122 _residuals_and_jacobians.resize(_test.size(), 0);
123 for (auto & r : _residuals_and_jacobians)
124 r = 0;
125
126 precalculateResidual();
127 if (_use_displaced_mesh)
128 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
129 {
130 _r = _ad_JxW[_qp];
131 _r *= _ad_coord[_qp];
132 for (_i = 0; _i < _test.size(); _i++)
133 _residuals_and_jacobians[_i] += _r * computeQpResidual();
134 }
135 else
136 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
137 {
138 const auto jxw_c = _JxW[_qp] * _coord[_qp];
139 for (_i = 0; _i < _test.size(); _i++)
140 _residuals_and_jacobians[_i] += jxw_c * computeQpResidual();
141 }
142}
143
144template <typename T>
145void
147{
148 computeResidualsForJacobian();
149 addResidualsAndJacobian(
150 _assembly, _residuals_and_jacobians, _var.dofIndices(), _var.scalingFactor());
151}
152
153template <typename T>
154void
156{
157 computeADJacobian();
158
159 if (_has_diag_save_in && !_sys.computingScalingJacobian())
160 mooseError("_local_ke not computed for global AD indexing. Save-in is deprecated anyway. Use "
161 "the tagging system instead.");
162}
163
164template <typename T>
165void
167{
168 computeResidualsForJacobian();
169 addJacobian(_assembly, _residuals_and_jacobians, _var.dofIndices(), _var.scalingFactor());
170}
171
172template <typename T>
173void
175{
176 // Only need to do this once because AD does all the derivatives at once
177 if (jvar == _var.number())
178 computeADJacobian();
179}
180
181template <typename T>
182void
186
187template class ADIntegratedBCTempl<Real>;
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
An interface for accessing Moose::Functors for systems that care about automatic differentiation,...
static InputParameters validParams()
Base class for deriving any boundary condition of a integrated type.
void computeOffDiagJacobianScalar(unsigned int jvar) override
Computes jacobian block with respect to a scalar variable.
void computeOffDiagJacobian(unsigned int jvar) override
Computes this object's contribution to off-diagonal blocks of the system Jacobian matrix.
ADIntegratedBCTempl(const InputParameters &parameters)
void computeResidual() override
Compute this object's contribution to the residual.
void computeJacobian() override
Compute this object's contribution to the diagonal Jacobian entries.
virtual void computeResidualsForJacobian()
compute the _residuals member for filling the Jacobian.
void computeADJacobian()
compute all the Jacobian entries
void computeResidualAndJacobian() override
Compute this object's contribution to the residual and Jacobian simultaneously.
static InputParameters validParams()
MooseVariableFE< T > & _var
The variable that this IntegratedBC operates on.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
Base class for deriving any boundary condition of a integrated type.
static InputParameters validParams()
bool _has_diag_save_in
The aux variables to save the diagonal Jacobian contributions to.
std::vector< AuxVariableName > _diag_save_in_strings
bool _has_save_in
The aux variables to save the residual contributions to.
std::vector< AuxVariableName > _save_in_strings
std::vector< MooseVariableFEBase * > _diag_save_in
std::vector< MooseVariableFEBase * > _save_in
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.
SystemBase & sys()
Get the system this variable is part of.
void addMooseVariableDependency(MooseVariableFieldBase *var)
Call this function to add the passed in MooseVariableFieldBase as a variable that this object depends...
Interface for objects that need to get values of MooseVariables.
MooseVariableFE< T > * mooseVariable() const
Return the MooseVariableFE object that this interface acts on.
THREAD_ID _tid
The thread ID for this kernel.
SubProblem & _subproblem
Reference to this kernel's SubProblem.
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.
virtual void haveADObjects(bool have_ad_objects)
Method for setting whether we have any ad objects.
Definition SubProblem.h:775
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
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
std::string incompatVarMsg(MooseVariableFieldBase &var1, MooseVariableFieldBase &var2)
Builds and returns a string of the form:
Definition MooseError.C:26