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
23
24 virtual void initialize() override;
25 virtual void execute() override;
26 virtual void finalize() override;
27 virtual void initialSetup() override;
28
32 const std::unordered_map<const DofObject *, std::pair<ADReal, Real>> & dofToWeightedGap() const;
33
37 virtual const ADVariableValue & contactPressure() const = 0;
38
43 virtual Real getNormalContactPressure(const Node * const /*node*/) const = 0;
44
49 virtual Real getNormalGap(const Node * const /*node*/) const;
50
54 Real physicalGap(const std::pair<ADReal, Real> & gap) const
55 {
56 return MetaPhysicL::raw_value(gap.first) / gap.second;
57 }
58
63 virtual Real nodalScale(const DofObject * const /*dof*/) const { return 1; }
64
66 virtual bool usesNodalScaling() const { return false; }
67
77 virtual Real normalizeCDivisor(const DofObject * const /*dof*/,
78 const Real covered_normalization) const
79 {
80 return covered_normalization;
81 }
82
83 ADReal adPhysicalGap(const std::pair<ADReal, Real> & gap) const { return gap.first / gap.second; }
84
90 virtual Real getFrictionalContactPressure(const Node * const /*node*/,
91 const unsigned int /*component*/) const
92 {
93 mooseError("Not available in base class.");
94 }
95
101 virtual Real getAccumulatedSlip(const Node * const /*node*/,
102 const unsigned int /*component*/) const
103 {
104 mooseError("Not available in base class.");
105 }
106
112 virtual Real getTangentialVelocity(const Node * const /*node*/,
113 const unsigned int /*component*/) const
114 {
115 mooseError("Not available in base class.");
116 }
117
118protected:
123 virtual void computeQpProperties();
124
128 virtual void computeQpIProperties();
129
133 virtual const VariableTestValue & test() const = 0;
134
139 virtual bool constrainedByOwner() const = 0;
140
144 template <typename K, typename V>
145 V
146 findValue(const std::unordered_map<K, V> & map, const K & key, const V & default_value = 0) const
147 {
148 const auto it = map.find(key);
149 if (it == map.end())
150 return default_value;
151 return it->second;
152 }
153
156
159
162
164 const bool _nodal;
165
171 const bool _has_disp_z;
174
187
190
193
196
198 std::unordered_map<const DofObject *, std::pair<ADReal, Real>> _dof_to_weighted_gap;
199
201 std::unordered_map<const DofObject *, ADRealVectorValue> _dof_to_weighted_displacements;
202
204 const ADReal * _weighted_gap_ptr = nullptr;
205 const Real * _normalization_ptr = nullptr;
206
209 const VariableTestValue * _test = nullptr;
210
215
217 unsigned int _qp = 0;
218
220 unsigned int _i = 0;
221};
222
223inline 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 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
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),...
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
virtual Real getNormalContactPressure(const Node *const) const =0
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 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.
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
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