https://mooseframework.inl.gov
Loading...
Searching...
No Matches
DGLowerDKernel.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 "DGLowerDKernel.h"
11
12#include "Assembly.h"
13#include "MooseVariable.h"
14#include "Problem.h"
15#include "SubProblem.h"
16#include "SystemBase.h"
17#include "MaterialData.h"
18#include "ParallelUniqueId.h"
19
20#include "libmesh/dof_map.h"
21#include "libmesh/dense_vector.h"
22#include "libmesh/numeric_vector.h"
23#include "libmesh/dense_subvector.h"
24#include "libmesh/libmesh_common.h"
25#include "libmesh/quadrature.h"
26
29{
31 params.addRequiredCoupledVar("lowerd_variable", "Lagrange multiplier");
32 return params;
33}
34
36 : DGKernel(parameters),
37 _lowerd_var(*getVar("lowerd_variable", 0)),
38 _lambda(_is_implicit ? _lowerd_var.slnLower() : _lowerd_var.slnLowerOld()),
39
40 _phi_lambda(_lowerd_var.phiLower()),
41 _test_lambda(_lowerd_var.phiLower())
42{
43 const auto & lower_domains = _lowerd_var.activeSubdomains();
44 for (const auto & id : _mesh.interiorLowerDBlocks())
45 if (lower_domains.count(id) == 0)
47 "moose",
48 29151,
49 "'lowerd_variable' must be defined on the interior lower-dimensional subdomain '" +
51 "' that is added by Mesh/build_all_side_lowerd_mesh=true.\nThe check could be overly "
52 "restrictive.");
53
54 for (const auto & id : _var.activeSubdomains())
55 if (_mesh.interiorLowerDBlocks().count(id) > 0)
56 paramError("variable",
57 "Must not be defined on the interior lower-dimensional subdomain'" +
58 _mesh.getSubdomainName(id) + "'");
59
60 // Note: the above two conditions also ensure that the variable and lower-d variable are
61 // different.
62}
63
64void
66{
67 if (!excludeBoundary())
68 {
70
71 // Compute the residual for this element
73
74 // Compute the residual for the neighbor
76
78 }
79}
80
81void
95
96void
98{
99 if (!excludeBoundary())
100 {
102
103 // Compute element-element Jacobian
105
106 // Compute element-neighbor Jacobian
108
109 // Compute neighbor-element Jacobian
111
112 // Compute neighbor-neighbor Jacobian
114
115 // Compute the other five pieces of Jacobian related with lower-d variable
117 }
118}
119
120void
122{
125 "Jacobian types without lower should be handled in computeElemNeighJacobian");
126
127 const auto & test_space =
131 const auto ivar =
134 : _var.number();
135
136 const auto & loc_phi =
140 const auto jvar =
143 : _var.number();
144
146
147 if (_local_ke.n() == 0 || _local_ke.m() == 0)
148 return;
149
150 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
151 {
153 for (_i = 0; _i < test_space.size(); _i++)
154 for (_j = 0; _j < loc_phi.size(); _j++)
156 }
157
159}
160
161void
162DGLowerDKernel::computeOffDiagJacobian(const unsigned int jvar_num)
163{
164 if (!excludeBoundary())
165 {
167
168 if (jvar_num == variable().number())
169 {
176 }
177 else if (jvar_num == _lowerd_var.number())
178 {
182 }
183 else
184 {
185 const auto & jvar = getVariable(jvar_num);
186
187 // Compute element-element Jacobian
189
190 // Compute element-neighbor Jacobian
192
193 // Compute neighbor-element Jacobian
195
196 // Compute neighbor-neighbor Jacobian
198
199 // Compute the other five pieces of Jacobian related with lower-d variable
205 }
206 }
207}
208
209void
211 const MooseVariableFEBase & jvar)
212{
215 "Jacobian types without lower should be handled in computeOffDiagElemNeighJacobian");
216
217 const auto & test_space =
221 const auto ivar =
224 : _var.number();
225
227 if (_local_ke.n() == 0 || _local_ke.m() == 0)
228 return;
229
231 {
232 const auto & jv0 = static_cast<const MooseVariable &>(jvar);
233 const VariableTestValue & loc_phi =
235 ? jv0.phiLower()
236 : (type == Moose::LowerPrimary ? jv0.phiFace() : jv0.phiFaceNeighbor());
237
238 for (_qp = 0; _qp < _qrule->n_points(); _qp++)
239 {
241 for (_i = 0; _i < test_space.size(); _i++)
242 for (_j = 0; _j < loc_phi.size(); _j++)
244 }
245 }
247 mooseError("Array variable cannot be coupled into DG kernel currently");
248 else
249 mooseError("Vector variable cannot be coupled into DG kernel currently");
250
252}
void mooseDocumentedError(const std::string &repo_name, const unsigned int issue_num, Args &&... args)
Emit a documented error message with the given stringified, concatenated args and terminate the appli...
Definition MooseError.h:332
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
const QBase *const & _qrule
Quadrature rule.
const MooseArray< Real > & _JxW
Jacobian det times quadrature weighting on quadrature points.
unsigned int _i
unsigned int _qp
bool excludeBoundary() const
Check current element if it contains broken boundary.
unsigned int _j
const MooseArray< Real > & _coord
Coordinate transform mainly for curvilinear coordinates.
The DGKernel class is responsible for calculating the residuals for various physics on internal sides...
Definition DGKernel.h:19
const VariableTestValue & _test_neighbor
Side test function.
Definition DGKernel.h:110
virtual void computeElemNeighResidual(Moose::DGResidualType type) override
Computes the residual for this element or the neighbor.
Definition DGKernel.C:111
static InputParameters validParams()
Factory constructor initializes all internal references needed for residual computation.
Definition DGKernel.C:27
const VariablePhiValue & _phi_neighbor
Side shape function.
Definition DGKernel.h:106
virtual void computeElemNeighJacobian(Moose::DGJacobianType type) override
Computes the element/neighbor-element/neighbor Jacobian.
Definition DGKernel.C:146
const VariableTestValue & _test
test functions
Definition DGKernel.h:102
virtual void computeOffDiagElemNeighJacobian(Moose::DGJacobianType type, const MooseVariableFEBase &jvar) override
Computes the element-element off-diagonal Jacobian.
Definition DGKernel.C:187
MooseVariable & _var
Variable this kernel operates on.
Definition DGKernel.h:92
const VariablePhiValue & _phi
Shape functions.
Definition DGKernel.h:98
const MooseVariable & _lowerd_var
Variable this kernel operates on.
virtual void computeOffDiagJacobian(unsigned int jvar) override
Computes d-residual / d-jvar...
const MooseVariableFEBase & variable() const override final
The variable that this kernel operates on.
virtual Real computeLowerDQpJacobian(Moose::ConstraintJacobianType jacobian_type)=0
Computes one of the five pieces of Jacobian involving lower-d at quadrature points.
virtual void computeLowerDResidual()
Computes the Lower part of residual for the variable on the lower-d element.
virtual void computeOffDiagLowerDJacobian(Moose::ConstraintJacobianType type, const MooseVariableFEBase &jvar)
Computes one of the five pieces of off-diagonal Jacobian involving lower-d.
virtual void initLowerDQpResidual()
Put necessary evaluations depending on qp but independent on test functions here.
virtual void computeJacobian() override
Computes the nine pieces of element/neighbor/lower-d - element/neighbor/lower-d Jacobian.
virtual Real computeLowerDQpOffDiagJacobian(Moose::ConstraintJacobianType, const MooseVariableFEBase &)
Computes one of the five pieces of off-diagonal Jacobian involving lower-d at quadrature points.
virtual void initLowerDQpJacobian(Moose::ConstraintJacobianType)
Put necessary evaluations depending on qp but independent on test and shape functions here.
DGLowerDKernel(const InputParameters &parameters)
virtual Real computeLowerDQpResidual()=0
Method for computing the Lower part of residual at quadrature points, to be filled in residual.
static InputParameters validParams()
Factory constructor initializes all internal references needed for residual computation.
virtual void computeLowerDJacobian(Moose::ConstraintJacobianType jacobian_type)
Computes one of the five pieces of Jacobian involving lower-d.
virtual void computeResidual() override
Computes the residual for this element, the neighbor and the lower-d element.
virtual void initLowerDQpOffDiagJacobian(Moose::ConstraintJacobianType, const MooseVariableFEBase &)
Put necessary evaluations depending on qp but independent on test and shape functions here for off-di...
const VariablePhiValue & _phi_lambda
Shape functions.
const VariableTestValue & _test_lambda
test functions
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
const std::string & type() const
Get the type of this class.
Definition MooseBase.h:93
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 std::set< SubdomainID > & interiorLowerDBlocks() const
Definition MooseMesh.h:1552
const std::string & getSubdomainName(SubdomainID subdomain_id) const
Return the name of a block given an id.
Definition MooseMesh.C:1751
unsigned int number() const
Get variable number coming from libMesh.
virtual const FieldVariablePhiValue & phiLower() const override
Return the variable's shape functions on a lower-dimensional element.
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.
const std::set< SubdomainID > & activeSubdomains() const
The subdomains the variable is active on.
virtual void precalculateJacobian()
MooseMesh & _mesh
Reference to this Kernel's mesh object.
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.
virtual void precalculateOffDiagJacobian(unsigned int)
virtual void precalculateResidual()
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 prepareVectorTagLower(Assembly &assembly, unsigned int ivar)
Prepare data for computing the residual according to active tags for mortar constraints.
void accumulateTaggedLocalResidual()
Local residual blocks will be appended by adding the current local kernel residual.
void prepareMatrixTagLower(Assembly &assembly, unsigned int ivar, unsigned int jvar, Moose::ConstraintJacobianType type)
Prepare data for computing the jacobian according to the active tags for mortar.
DenseVector< Number > _local_re
Holds local residual entries as they are accumulated by this Kernel.
unsigned int n() const
unsigned int m() const
@ VAR_FIELD_STANDARD
Definition MooseTypes.h:777
@ VAR_FIELD_ARRAY
Definition MooseTypes.h:780
@ Element
Definition MooseTypes.h:799
@ Neighbor
Definition MooseTypes.h:800
ConstraintJacobianType
Definition MooseTypes.h:851
@ LowerLower
Definition MooseTypes.h:856
@ SecondarySecondary
Definition MooseTypes.h:852
@ PrimaryLower
Definition MooseTypes.h:860
@ LowerSecondary
Definition MooseTypes.h:857
@ LowerPrimary
Definition MooseTypes.h:858
@ SecondaryPrimary
Definition MooseTypes.h:853
@ PrimarySecondary
Definition MooseTypes.h:854
@ PrimaryPrimary
Definition MooseTypes.h:855
@ SecondaryLower
Definition MooseTypes.h:859
@ NeighborNeighbor
Definition MooseTypes.h:808
@ ElementElement
Definition MooseTypes.h:805
@ NeighborElement
Definition MooseTypes.h:807
@ ElementNeighbor
Definition MooseTypes.h:806