https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ArrayDGKernel.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 "ArrayDGKernel.h"
11#include "Assembly.h"
12#include "MooseVariable.h"
13#include "Problem.h"
14#include "SubProblem.h"
15#include "SystemBase.h"
16#include "MaterialData.h"
17#include "ParallelUniqueId.h"
18
19#include "libmesh/dof_map.h"
20#include "libmesh/dense_vector.h"
21#include "libmesh/numeric_vector.h"
22#include "libmesh/dense_subvector.h"
23#include "libmesh/libmesh_common.h"
24#include "libmesh/quadrature.h"
25
28{
30 return params;
31}
32
34 : DGKernelBase(parameters),
36 this, false, Moose::VarKindType::VAR_SOLVER, Moose::VarFieldType::VAR_FIELD_ARRAY),
37 _var(*mooseVariable()),
38 _u(_is_implicit ? _var.sln() : _var.slnOld()),
39 _grad_u(_is_implicit ? _var.gradSln() : _var.gradSlnOld()),
40
41 _phi(_var.phiFace()),
42 _grad_phi(_var.gradPhiFace()),
43 _array_grad_phi(_var.arrayGradPhiFace()),
44
45 _test(_var.phiFace()),
46 _grad_test(_var.gradPhiFace()),
47 _array_grad_test(_var.arrayGradPhiFace()),
48
49 _phi_neighbor(_var.phiFaceNeighbor()),
50 _grad_phi_neighbor(_var.gradPhiFaceNeighbor()),
51 _array_grad_phi_neighbor(_var.arrayGradPhiFaceNeighbor()),
52
53 _test_neighbor(_var.phiFaceNeighbor()),
54 _grad_test_neighbor(_var.gradPhiFaceNeighbor()),
55 _array_grad_test_neighbor(_var.arrayGradPhiFaceNeighbor()),
56
57 _u_neighbor(_is_implicit ? _var.slnNeighbor() : _var.slnOldNeighbor()),
58 _grad_u_neighbor(_is_implicit ? _var.gradSlnNeighbor() : _var.gradSlnOldNeighbor()),
59
60 _array_normals(_assembly.mappedNormals()),
61 _count(_var.count()),
62
63 _work_vector(_count)
64{
66
67 _save_in.resize(_save_in_strings.size());
69
70 for (unsigned int i = 0; i < _save_in_strings.size(); i++)
71 {
76
78 mooseError("Trying to use solution variable " + _save_in_strings[i] +
79 " as a save_in variable in " + name());
80
81 if (var->feType() != _var.feType())
83 "save_in",
84 "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
86
87 _save_in[i] = var;
90 }
91
92 _has_save_in = _save_in.size() > 0;
93
94 for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
95 {
100
102 mooseError("Trying to use solution variable " + _diag_save_in_strings[i] +
103 " as a diag_save_in variable in " + name());
104
105 if (var->feType() != _var.feType())
107 "diag_save_in",
108 "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
110
111 _diag_save_in[i] = var;
114 }
115
116 _has_diag_save_in = _diag_save_in.size() > 0;
117}
118
119void
121{
122 bool is_elem;
123 if (type == Moose::Element)
124 is_elem = true;
125 else
126 is_elem = false;
127
128 const ArrayVariableTestValue & test_space = is_elem ? _test : _test_neighbor;
129
130 if (is_elem)
132 else
134
135 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
136 {
138 for (_i = 0; _i < test_space.size(); _i++)
139 {
140 _work_vector.setZero();
142 mooseAssert(_work_vector.size() == _count,
143 "Size of local residual is not equal to the number of array variable compoments");
146 }
147 }
148
150
151 if (_has_save_in)
152 for (const auto & var : _save_in)
153 {
154 auto * avar = dynamic_cast<ArrayMooseVariable *>(var);
155 if (!avar)
156 mooseError("Save-in variable for an array kernel must be an array variable");
157
158 if (is_elem)
159 avar->addSolution(_local_re);
160 else
161 avar->addSolutionNeighbor(_local_re);
162 }
163}
164
165void
167{
168 const ArrayVariableTestValue & test_space =
170 const ArrayVariableTestValue & loc_phi =
172
175 else
177
178 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
179 {
181 for (_i = 0; _i < test_space.size(); _i++)
182 for (_j = 0; _j < loc_phi.size(); _j++)
183 {
184 RealEigenVector v = _JxW[_qp] * _coord[_qp] * computeQpJacobian(type);
186 _local_ke, _i, test_space.size(), _j, loc_phi.size(), _var.number(), v);
187 }
188 }
189
191
193 {
194 DenseVector<Number> diag = _assembly.getJacobianDiagonal(_local_ke);
195 for (const auto & var : _diag_save_in)
196 {
197 auto * avar = dynamic_cast<ArrayMooseVariable *>(var);
198 if (!avar)
199 mooseError("Save-in variable for an array kernel must be an array variable");
200
202 avar->addSolution(diag);
203 else
204 avar->addSolutionNeighbor(diag);
205 }
206 }
207}
208
209RealEigenVector
211{
212 return RealEigenVector::Zero(_count);
213}
214
215void
216ArrayDGKernel::computeOffDiagJacobian(const unsigned int jvar_num)
217{
218 if (!excludeBoundary())
219 {
220 const auto & jvar = getVariable(jvar_num);
221
223
224 // Compute element-element Jacobian
226
227 // Compute element-neighbor Jacobian
229
230 // Compute neighbor-element Jacobian
232
233 // Compute neighbor-neighbor Jacobian
235 }
236}
237
238void
240 const MooseVariableFEBase & jvar)
241{
242 const ArrayVariableTestValue & test_space =
244
247 else
249
250 if (_local_ke.n() == 0 || _local_ke.m() == 0)
251 return;
252
254 {
255 const auto & jv0 = static_cast<const MooseVariable &>(jvar);
256 const VariableTestValue & loc_phi =
258 : jv0.phiFaceNeighbor();
259
260 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
261 {
263 for (_i = 0; _i < test_space.size(); _i++)
264 for (_j = 0; _j < loc_phi.size(); _j++)
265 {
266 RealEigenMatrix v = _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(type, jvar);
268 _i,
269 test_space.size(),
270 _j,
271 loc_phi.size(),
272 _var.number(),
273 jvar.number(),
274 v);
275 }
276 }
277 }
279 {
280 const auto & jv1 = static_cast<const ArrayMooseVariable &>(jvar);
281 const ArrayVariableTestValue & loc_phi =
283 : jv1.phiFaceNeighbor();
284
285 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
286 {
288 for (_i = 0; _i < test_space.size(); _i++)
289 for (_j = 0; _j < loc_phi.size(); _j++)
290 {
291 RealEigenMatrix v = _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(type, jvar);
293 _i,
294 test_space.size(),
295 _j,
296 loc_phi.size(),
297 _var.number(),
298 jvar.number(),
299 v);
300 }
301 }
302 }
303 else
304 mooseError("Vector variable cannot be coupled into array DG kernel currently");
305
307
309 _var.number() == jvar.number())
310 {
311 DenseVector<Number> diag = _assembly.getJacobianDiagonal(_local_ke);
312 for (const auto & var : _diag_save_in)
313 {
314 auto * avar = dynamic_cast<ArrayMooseVariable *>(var);
315 if (!avar)
316 mooseError("Save-in variable for an array kernel must be an array variable");
317
319 avar->addSolution(diag);
320 else
321 avar->addSolutionNeighbor(diag);
322 }
323 }
324}
325
326RealEigenMatrix
328 const MooseVariableFEBase & jvar)
329{
330 if (jvar.number() == _var.number())
331 return computeQpJacobian(type).asDiagonal();
332 else
333 return RealEigenMatrix::Zero(_var.count(), jvar.count());
334}
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
OutputTools< RealEigenVector >::VariableTestValue ArrayVariableTestValue
Definition MooseTypes.h:395
unsigned int count
Definition MortarUtils.C:53
virtual void computeQpResidual(Moose::DGResidualType type, RealEigenVector &residual)=0
This is the virtual that derived classes should override for computing the residual on neighboring el...
const ArrayVariablePhiValue & _phi_neighbor
Side shape function.
virtual void initQpResidual(Moose::DGResidualType)
Put necessary evaluations depending on qp but independent on test functions here.
ArrayMooseVariable & _var
Variable this kernel operates on.
const ArrayVariableTestValue & _test
test functions
virtual void computeElemNeighResidual(Moose::DGResidualType type) override
Computes the residual for this element or the neighbor.
const ArrayVariableTestValue & _test_neighbor
Side test function.
virtual void computeElemNeighJacobian(Moose::DGJacobianType type) override
Computes the element/neighbor-element/neighbor Jacobian.
const ArrayVariablePhiValue & _phi
Shape functions.
virtual RealEigenVector computeQpJacobian(Moose::DGJacobianType)
This is the virtual that derived classes should override for computing the Jacobian on neighboring el...
RealEigenVector _work_vector
Work vector for residual computation.
ArrayDGKernel(const InputParameters &parameters)
const unsigned int _count
Number of components of the array variable.
virtual void initQpJacobian(Moose::DGJacobianType)
Put necessary evaluations depending on qp but independent on test and shape functions here.
virtual void computeOffDiagJacobian(unsigned int jvar) override
Override this function to consider couplings of components of the array variable.
virtual void computeOffDiagElemNeighJacobian(Moose::DGJacobianType type, const MooseVariableFEBase &jvar) override
Computes the element-element off-diagonal Jacobian.
static InputParameters validParams()
Factory constructor initializes all internal references needed for residual computation.
virtual RealEigenMatrix computeQpOffDiagJacobian(Moose::DGJacobianType type, const MooseVariableFEBase &jvar)
This is the virtual that derived classes should override for computing the off-diag Jacobian.
virtual void initQpOffDiagJacobian(Moose::DGJacobianType, const MooseVariableFEBase &)
Put necessary evaluations depending on qp but independent on test and shape functions here for off-di...
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
Serves as a base class for DGKernel and ADDGKernel.
const QBase *const & _qrule
Quadrature rule.
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.
unsigned int _j
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.
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.
SystemBase & sys()
Get the system this variable is part of.
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...
const FieldVariablePhiValue & phiFace() const override final
Return the variable's shape functions on an element face.
This class provides an interface for common operations on field variables of both FE and FV types wit...
virtual Moose::VarFieldType fieldType() const =0
Field type of this variable.
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 precalculateOffDiagJacobian(unsigned int)
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 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 prepareMatrixTagNeighbor(Assembly &assembly, unsigned int ivar, unsigned int jvar, Moose::DGJacobianType type)
Prepare data for computing element jacobian according to the active tags for DG and interface kernels...
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 n() const
unsigned int m() const
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...
@ VAR_FIELD_STANDARD
Definition MooseTypes.h:777
@ VAR_FIELD_ARRAY
Definition MooseTypes.h:780
DGResidualType
Definition MooseTypes.h:798
@ Element
Definition MooseTypes.h:799
@ VAR_AUXILIARY
Definition MooseTypes.h:771
DGJacobianType
Definition MooseTypes.h:804
@ NeighborNeighbor
Definition MooseTypes.h:808
@ ElementElement
Definition MooseTypes.h:805
@ NeighborElement
Definition MooseTypes.h:807
@ ElementNeighbor
Definition MooseTypes.h:806
std::string incompatVarMsg(MooseVariableFieldBase &var1, MooseVariableFieldBase &var2)
Builds and returns a string of the form:
Definition MooseError.C:26