https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ArrayKernel.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 "ArrayKernel.h"
11
12#include "Assembly.h"
13#include "MooseVariableFE.h"
14#include "MooseVariableScalar.h"
15#include "SubProblem.h"
16#include "NonlinearSystem.h"
17#include "FEProblemBase.h"
18
19#include "libmesh/threads.h"
20#include "libmesh/quadrature.h"
21
24{
26 params.registerBase("ArrayKernel");
27 return params;
28}
29
31 : KernelBase(parameters),
32 MooseVariableInterface<RealEigenVector>(this,
33 false,
34 "variable",
35 Moose::VarKindType::VAR_SOLVER,
36 Moose::VarFieldType::VAR_FIELD_ARRAY),
37 _var(*mooseVariable()),
38 _test(_var.phi()),
39 _grad_test(_var.gradPhi()),
40 _array_grad_test(_var.arrayGradPhi()),
41 _phi(_assembly.phi(_var)),
42 _grad_phi(_assembly.gradPhi(_var)),
43 _u(_is_implicit ? _var.sln() : _var.slnOld()),
44 _grad_u(_is_implicit ? _var.gradSln() : _var.gradSlnOld()),
45 _count(_var.count()),
46 _work_vector(_count)
47{
49
50 _save_in.resize(_save_in_strings.size());
52
53 for (unsigned int i = 0; i < _save_in_strings.size(); i++)
54 {
56
58 paramError("save_in", "cannot use solution variable as save-in variable");
59
60 if (var->feType() != _var.feType())
62 "save_in",
63 "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
65
66 _save_in[i] = var;
69 }
70
71 _has_save_in = _save_in.size() > 0;
72
73 for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
74 {
76
78 paramError("diag_save_in", "cannot use solution variable as diag save-in variable");
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
94void
96{
98
100 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
101 {
103 for (_i = 0; _i < _test.size(); _i++)
104 {
105 _work_vector.setZero();
107 mooseAssert(_work_vector.size() == _count,
108 "Size of local residual is not equal to the number of array variable compoments");
111 }
112 }
113
115
116 if (_has_save_in)
117 {
118 for (const auto & var : _save_in)
119 {
120 auto * avar = dynamic_cast<ArrayMooseVariable *>(var);
121 if (avar)
122 avar->addSolution(_local_re);
123 else
124 mooseError("Save-in variable for an array kernel must be an array variable");
125 }
126 }
127}
128
129void
131{
133
135 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
136 {
138 for (_i = 0; _i < _test.size(); _i++)
139 for (_j = 0; _j < _phi.size(); _j++)
140 {
143 _local_ke, _i, _test.size(), _j, _phi.size(), _var.number(), _work_vector);
144 }
145 }
146
148
150 {
151 DenseVector<Number> diag = _assembly.getJacobianDiagonal(_local_ke);
152 for (const auto & var : _diag_save_in)
153 {
154 auto * avar = dynamic_cast<ArrayMooseVariable *>(var);
155 if (avar)
156 avar->addSolution(diag);
157 else
158 mooseError("Save-in variable for an array kernel must be an array variable");
159 }
160 }
161}
162
163RealEigenVector
165{
166 return RealEigenVector::Zero(_var.count());
167}
168
169void
170ArrayKernel::computeOffDiagJacobian(const unsigned int jvar_num)
171{
172 const auto & jvar = getVariable(jvar_num);
173
174 bool same_var = (jvar_num == _var.number());
175
177
179 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
180 {
182 for (_i = 0; _i < _test.size(); _i++)
183 for (_j = 0; _j < _phi.size(); _j++)
184 {
187 _local_ke, _i, _test.size(), _j, _phi.size(), _var.number(), jvar_num, _work_matrix);
188 }
189 }
190
192
193 if (_has_diag_save_in && same_var)
194 {
195 DenseVector<Number> diag = _assembly.getJacobianDiagonal(_local_ke);
196 for (const auto & var : _diag_save_in)
197 {
198 auto * avar = dynamic_cast<ArrayMooseVariable *>(var);
199 if (avar)
200 avar->addSolution(diag);
201 else
202 mooseError("Save-in variable for an array kernel must be an array variable");
203 }
204 }
205}
206
207RealEigenMatrix
209{
210 if (jvar.number() == _var.number())
211 return computeQpJacobian().asDiagonal();
212 else
213 return RealEigenMatrix::Zero(_var.count(), jvar.count());
214}
215
216void
218{
221
222 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
223 for (_i = 0; _i < _test.size(); _i++)
224 {
227 _local_ke, _i, _test.size(), 0, 1, _var.number(), jvar, _work_matrix);
228 }
229
231}
232
233RealEigenMatrix
235{
236 return RealEigenMatrix::Zero(_var.count(), (unsigned int)jvar.order() + 1);
237}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
unsigned int count
Definition MortarUtils.C:53
virtual RealEigenMatrix computeQpOffDiagJacobianScalar(const MooseVariableScalar &jvar)
This is the virtual that derived classes should override for computing a full Jacobian component.
const ArrayVariableTestValue & _test
the current test function
Definition ArrayKernel.h:88
ArrayKernel(const InputParameters &parameters)
Definition ArrayKernel.C:30
virtual void initQpJacobian()
Put necessary evaluations depending on qp but independent on test and shape functions here.
Definition ArrayKernel.h:72
static InputParameters validParams()
Definition ArrayKernel.C:23
const unsigned int _count
Number of components of the array variable.
virtual void computeJacobian() override
Compute this ArrayKernel's contribution to the diagonal Jacobian entries.
virtual void computeResidual() override
Compute this ArrayKernel's contribution to the residual.
Definition ArrayKernel.C:95
RealEigenMatrix _work_matrix
Work vector for off diag jacobian.
ArrayMooseVariable & _var
This is an array kernel so we cast to a ArrayMooseVariable.
Definition ArrayKernel.h:85
RealEigenVector _work_vector
Work vector for residual and diag jacobian.
virtual RealEigenMatrix computeQpOffDiagJacobian(const MooseVariableFEBase &jvar)
This is the virtual that derived classes should override for computing a full Jacobian component.
virtual void initQpResidual()
Put necessary evaluations depending on qp but independent on test functions here.
Definition ArrayKernel.h:67
virtual void initQpOffDiagJacobian(const MooseVariableFEBase &jvar)
Put necessary evaluations depending on qp but independent on test and shape functions here for off-di...
Definition ArrayKernel.h:78
virtual void computeOffDiagJacobianScalar(unsigned int jvar) override
Computes jacobian block with respect to a scalar variable.
virtual RealEigenVector computeQpJacobian()
Compute this Kernel's contribution to the diagonal Jacobian at the current quadrature point.
const ArrayVariablePhiValue & _phi
the current shape functions
Definition ArrayKernel.h:95
virtual void computeQpResidual(RealEigenVector &residual)=0
Compute this Kernel's contribution to the residual at the current quadrature point,...
virtual void computeOffDiagJacobian(unsigned int jvar) override
Computes full Jacobian of jvar and the array variable this kernel operates on.
void saveFullLocalArrayJacobian(DenseMatrix< Number > &ke, unsigned int i, unsigned int ntest, unsigned int j, unsigned int nphi, unsigned int ivar, unsigned int jvar, const RealEigenMatrix &v) const
Helper function for assembling full Jacobian contriubutions on local quadrature points for an array k...
Definition Assembly.h:1866
void saveLocalArrayResidual(DenseVector< Number > &re, unsigned int i, unsigned int ntest, const RealEigenVector &v) const
Helper function for assembling residual contriubutions on local quadrature points for an array kernel...
Definition Assembly.h:1817
DenseVector< Real > getJacobianDiagonal(const DenseMatrix< Number > &ke)
Definition Assembly.h:1892
void saveDiagLocalArrayJacobian(DenseMatrix< Number > &ke, unsigned int i, unsigned int ntest, unsigned int j, unsigned int nphi, unsigned int ivar, const RealEigenVector &v) const
Helper function for assembling diagonal Jacobian contriubutions on local quadrature points for an arr...
Definition Assembly.h:1841
NonlinearSystemBase & getNonlinearSystemBase(const unsigned int sys_num)
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void registerBase(const std::string &value)
This method must be called from every base "Moose System" to create linkage with the Action System.
This is the common base class for the three main kernel types implemented in MOOSE,...
Definition KernelBase.h:29
std::vector< MooseVariableFEBase * > _save_in
Definition KernelBase.h:65
bool _has_diag_save_in
The aux variables to save the diagonal Jacobian contributions to.
Definition KernelBase.h:69
std::vector< AuxVariableName > _save_in_strings
Definition KernelBase.h:66
static InputParameters validParams()
Definition KernelBase.C:21
const MooseArray< Real > & _coord
The scaling factor to convert from cartesian to another coordinate system (e.g rz,...
Definition KernelBase.h:55
unsigned int _qp
The current quadrature point index.
Definition KernelBase.h:43
bool _has_save_in
The aux variables to save the residual contributions to.
Definition KernelBase.h:64
const MooseArray< Real > & _JxW
The current quadrature point weight value.
Definition KernelBase.h:52
unsigned int _j
current index for the shape function
Definition KernelBase.h:61
std::vector< MooseVariableFEBase * > _diag_save_in
Definition KernelBase.h:70
std::vector< AuxVariableName > _diag_save_in_strings
Definition KernelBase.h:71
unsigned int _i
current index for the test function
Definition KernelBase.h:58
const QBase *const & _qrule
active quadrature rule
Definition KernelBase.h:49
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.
libMesh::Order order() const
Get the order of this variable Note: Order enum can be implicitly converted to unsigned int.
unsigned int number() const
Get variable number coming from libMesh.
unsigned int count() const
Get the number of components Note: For standard and vector variables, the number is one.
void addMooseVariableDependency(MooseVariableFieldBase *var)
Call this function to add the passed in MooseVariableFieldBase as a variable that this object depends...
void addSolution(const DenseVector< libMesh::Number > &v)
Add passed in local DOF values onto the current solution.
This class provides an interface for common operations on field variables of both FE and FV types wit...
Interface for objects that need to get values of MooseVariables.
MooseVariableFE< RealEigenVector > * mooseVariable() const
Return the MooseVariableFE object that this interface acts on.
Class for scalar variables (they are different).
THREAD_ID _tid
The thread ID for this kernel.
virtual void precalculateJacobian()
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 precalculateOffDiagJacobian(unsigned int)
virtual void precalculateResidual()
FEProblemBase & _fe_problem
Reference to this kernel's FEProblemBase.
virtual ArrayMooseVariable & getArrayVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the variable reference for requested ArrayMooseVariable which may be in any system.
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
unsigned int number() const
Gets the number of this system.
virtual MooseVariableScalar & getScalarVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a scalar variable with specified number.
Definition SystemBase.C:146
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 accumulateTaggedLocalMatrix()
Local Jacobian blocks will be appended by adding the current local kernel Jacobian.
void prepareMatrixTag(Assembly &assembly, unsigned int ivar, unsigned int jvar)
Prepare data for computing element jacobian according to the active tags.
void accumulateTaggedLocalResidual()
Local residual blocks will be appended by adding the current local kernel residual.
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.
virtual unsigned int size() const override final
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