https://mooseframework.inl.gov
Loading...
Searching...
No Matches
WeightedGapUserObject.h
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#pragma once
11
12#include "MortarUserObject.h"
13
18{
19public:
21
27 static void addNodalNormalCoupling(InputParameters & params);
28
30
31 virtual void initialize() override;
32 virtual void execute() override;
33 virtual void finalize() override;
34 virtual void initialSetup() override;
35
39 const std::unordered_map<const DofObject *, std::pair<ADReal, Real>> & dofToWeightedGap() const;
40
44 virtual const ADVariableValue & contactPressure() const = 0;
45
56 virtual ADReal nodalContactPressure(const Node & node) const;
57
63 virtual const VariableTestValue & tractionBasis() const;
64
69 virtual Real getNormalContactPressure(const Node * const /*node*/) const = 0;
70
75 virtual Real getNormalGap(const Node * const /*node*/) const;
76
78 virtual bool usesNodalNormalDerivatives() const = 0;
79
82
86 const MooseVariable * dispVar(unsigned int component) const;
87
93 const ADRealVectorValue & contactNormal(const Elem & lower_secondary_elem,
94 unsigned int nodal_index) const;
95
99 Real physicalGap(const std::pair<ADReal, Real> & gap) const
100 {
101 return MetaPhysicL::raw_value(gap.first) / gap.second;
102 }
103
108 virtual Real nodalScale(const DofObject * const /*dof*/) const { return 1; }
109
111 virtual bool usesNodalScaling() const { return false; }
112
122 virtual Real normalizeCDivisor(const DofObject * const /*dof*/,
123 const Real covered_normalization) const
124 {
125 return covered_normalization;
126 }
127
128 ADReal adPhysicalGap(const std::pair<ADReal, Real> & gap) const { return gap.first / gap.second; }
129
135 virtual Real getFrictionalContactPressure(const Node * const /*node*/,
136 const unsigned int /*component*/) const
137 {
138 mooseError("Not available in base class.");
139 }
140
146 virtual Real getAccumulatedSlip(const Node * const /*node*/,
147 const unsigned int /*component*/) const
148 {
149 mooseError("Not available in base class.");
150 }
151
157 virtual Real getTangentialVelocity(const Node * const /*node*/,
158 const unsigned int /*component*/) const
159 {
160 mooseError("Not available in base class.");
161 }
162
163protected:
168 virtual void computeQpProperties();
169
173 virtual void computeQpIProperties();
174
178 virtual const VariableTestValue & test() const = 0;
179
184 virtual bool constrainedByOwner() const = 0;
185
189 template <typename K, typename V>
190 V
191 findValue(const std::unordered_map<K, V> & map, const K & key, const V & default_value = 0) const
192 {
193 const auto it = map.find(key);
194 if (it == map.end())
195 return default_value;
196 return it->second;
197 }
198
202 ADPoint nodalCoordinate(const Node & node) const;
203
206
209
212
214 const bool _nodal;
215
221 const bool _has_disp_z;
224
237
240
243
246
248 std::unordered_map<const DofObject *, std::pair<ADReal, Real>> _dof_to_weighted_gap;
249
251 std::unordered_map<const DofObject *, ADRealVectorValue> _dof_to_weighted_displacements;
252
254 const ADReal * _weighted_gap_ptr = nullptr;
255 const Real * _normalization_ptr = nullptr;
256
259 const VariableTestValue * _test = nullptr;
260
262 mutable std::unordered_map<const Node *, ADRealVectorValue> _ad_nodal_normals;
263
268
270 unsigned int _qp = 0;
271
273 unsigned int _i = 0;
274};
275
276inline const std::unordered_map<const DofObject *, std::pair<ADReal, Real>> &
DualNumber< Real, DNDerivativeType, true > ADReal
const InputParameters & parameters() const
void mooseError(Args &&... args) const
Creates dof object to weighted gap map.
static InputParameters validParams()
virtual bool usesNodalScaling() const
const ADVariableValue *const _primary_disp_z
z-displacement on the primary face
virtual bool usesNodalNormalDerivatives() const =0
Whether this formulation includes displacement derivatives of the secondary nodal normals.
virtual Real getAccumulatedSlip(const Node *const, const unsigned int) const
const std::unordered_map< const DofObject *, std::pair< ADReal, Real > > & dofToWeightedGap() const
Get the degree of freedom to weighted gap information.
virtual Real getFrictionalContactPressure(const Node *const, const unsigned int) const
bool shouldRecordNodalNormalDerivatives() const
Whether the current assembly records nodal-normal derivatives for this object's system.
unsigned int _i
Test function index.
V findValue(const std::unordered_map< K, V > &map, const K &key, const V &default_value=0) const
Find a value in a map or return a default if the key doesn't exist.
const ADVariableValue & _secondary_disp_x
x-displacement on the secondary face
const MooseVariable *const _disp_x_var
The x displacement variable.
virtual Real getTangentialVelocity(const Node *const, const unsigned int) const
virtual void computeQpProperties()
Computes properties that are functions only of the current quadrature point (_qp),...
virtual const VariableTestValue & tractionBasis() const
const bool _has_disp_z
For 2D mortar contact no displacement will be specified, so const pointers used.
virtual void finalize() override
virtual void execute() override
ADRealVectorValue _qp_gap_nodal
Vector for computation of weighted gap with nodal normals.
virtual void initialSetup() override
unsigned int _qp
Quadrature point index for the mortar segments.
Real _qp_factor
The value of the LM at the current quadrature point.
virtual Real getNormalGap(const Node *const) const
FEProblemBase & _fe_problem
The base finite element problem.
virtual const ADVariableValue & contactPressure() const =0
ADPoint nodalCoordinate(const Node &node) const
Add displacement derivatives to the node's current coordinate.
virtual Real getNormalContactPressure(const Node *const) const =0
static void addNodalNormalCoupling(InputParameters &params)
Request the secondary face point-neighbor matrix coupling that nodal-normal derivatives need.
ADReal adPhysicalGap(const std::pair< ADReal, Real > &gap) const
virtual Real nodalScale(const DofObject *const) const
Node-based Lagrange-multiplier scaling factor kappa_j of Popp et al.
const ADVariableValue & _primary_disp_y
y-displacement on the primary face
const MooseArray< Real > & _coord
Member for handling change of coordinate systems (xyz, rz, spherical)
const ADVariableValue & _secondary_disp_y
y-displacement on the secondary face
const MooseVariable * dispVar(unsigned int component) const
const ADVariableValue & _primary_disp_x
x-displacement on the primary face
ADReal _qp_gap
The value of the gap at the current quadrature point.
const MooseVariable *const _disp_y_var
The y displacement variable.
virtual ADReal nodalContactPressure(const Node &node) const
const ADRealVectorValue & contactNormal(const Elem &lower_secondary_elem, unsigned int nodal_index) const
Return the cached contact normal for the supplied lower-dimensional secondary element node.
std::unordered_map< const DofObject *, std::pair< ADReal, Real > > _dof_to_weighted_gap
A map from node to weighted gap and normalization (if requested)
virtual const VariableTestValue & test() const =0
std::unordered_map< const Node *, ADRealVectorValue > _ad_nodal_normals
AD nodal normals, each averaged over the secondary faces containing that node.
const MooseVariable *const _disp_z_var
The z displacement variable.
ADRealVectorValue _qp_displacement_nodal
Vector for computation of relative displacement (determines mixity ratio in interface problems)
virtual Real normalizeCDivisor(const DofObject *const, const Real covered_normalization) const
const ADVariableValue *const _secondary_disp_z
z-displacement on the secondary face
virtual void computeQpIProperties()
Computes properties that are functions both of _qp and _i, for example the weighted gap.
virtual void initialize() override
bool _is_weighted_gap_nodal
Whether the weighted gap is associated with nodes or elements (like for a CONSTANT MONOMIAL Lagrange ...
const ADReal * _weighted_gap_ptr
A pointer members that can be used to help avoid copying ADReals.
std::unordered_map< const DofObject *, ADRealVectorValue > _dof_to_weighted_displacements
A map from node to weighted displacements.
virtual bool constrainedByOwner() const =0
Real physicalGap(const std::pair< ADReal, Real > &gap) const
Compute physical gap from integration gap quantity.
const VariableTestValue * _test
A pointer to the test function associated with the weighted gap.
const bool _nodal
Whether the dof objects are nodal; if they're not, then they're elemental.
auto raw_value(const Eigen::Map< T > &in)
VariableShapeValue< true > VariableTestValue
VariableValueTempl< true > ADVariableValue