18#include "libmesh/quadrature.h"
30 params.
addCoupledVar(
"disp_z",
"The z displacement variable");
31 params.
set<
bool>(
"use_displaced_mesh") =
true;
32 params.
set<
bool>(
"interpolate_normals") =
false;
40 _fe_problem(*getCheckedPointerParam<
FEProblemBase *>(
"_fe_problem_base")),
41 _nodal(getVar(
"disp_x", 0)->feType().family == LAGRANGE),
42 _disp_x_var(getVar(
"disp_x", 0)),
43 _disp_y_var(getVar(
"disp_y", 0)),
44 _has_disp_z(isCoupled(
"disp_z")),
45 _disp_z_var(_has_disp_z ? getVar(
"disp_z", 0) : nullptr),
46 _secondary_disp_x(_disp_x_var->adSln()),
47 _primary_disp_x(_disp_x_var->adSlnNeighbor()),
48 _secondary_disp_y(_disp_y_var->adSln()),
49 _primary_disp_y(_disp_y_var->adSlnNeighbor()),
50 _secondary_disp_z(_has_disp_z ? &_disp_z_var->adSln() : nullptr),
51 _primary_disp_z(_has_disp_z ? &_disp_z_var->adSlnNeighbor() : nullptr),
52 _coord(_assembly.mortarCoordTransformation())
54 if (!getParam<bool>(
"use_displaced_mesh"))
56 "'use_displaced_mesh' must be true for the WeightedGapUserObject object");
72 const auto & secondary_ip_lowerd_map =
76 std::array<ADReal, 3> primary_disp{
85 const ADReal & prim_x = primary_disp[0];
86 const ADReal & prim_y = primary_disp[1];
87 const ADReal * prim_z =
nullptr;
89 prim_z = &primary_disp[2];
91 const ADReal & sec_x = secondary_disp[0];
92 const ADReal & sec_y = secondary_disp[1];
93 const ADReal * sec_z =
nullptr;
95 sec_z = &secondary_disp[2];
108 gap_vec(0).derivatives() = prim_x.derivatives() - sec_x.derivatives();
109 gap_vec(1).derivatives() = prim_y.derivatives() - sec_y.derivatives();
111 gap_vec(2).derivatives() = prim_z->derivatives() - sec_z->derivatives();
125 "Making sure that _normals is the expected size");
DualNumber< Real, DNDerivativeType, true > ADReal
const ExecFlagType EXEC_LINEAR
const ExecFlagType EXEC_NONLINEAR
std::map< unsigned int, unsigned int > getSecondaryIpToLowerElementMap(const Elem &lower_secondary_elem) const
std::map< unsigned int, unsigned int > getPrimaryIpToLowerElementMap(const Elem &primary_elem, const Elem &primary_elem_ip, const Elem &lower_secondary_elem) const
void paramError(const std::string ¶m, Args... args) const
virtual const Node * nodePtr(const dof_id_type i) const
static InputParameters validParams()
Elem const *const & _lower_secondary_elem
const libMesh::QBase *const & _qrule_msm
const AutomaticMortarGeneration & amg() const
Elem const *const & _lower_primary_elem
const MooseArray< Point > & _phys_points_secondary
const MooseArray< Point > & _phys_points_primary
std::vector< Point > _normals
static void trimInteriorNodeDerivatives(const std::map< unsigned int, unsigned int > &primary_ip_lowerd_map, const Variables &moose_var, DualNumbers &ad_vars, const bool is_secondary)
const std::vector< Real > & _JxW_msm
static InputParameters validParams()
virtual void initialSetup()
virtual MooseMesh & mesh()=0
static InputParameters validParams()
static InputParameters validParams()
unsigned int _i
Test function index.
const ADVariableValue & _secondary_disp_x
x-displacement on the secondary face
const MooseVariable *const _disp_x_var
The x displacement variable.
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
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
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
WeightedGapUserObject(const InputParameters ¶meters)
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 void computeQpIProperties()
Computes properties that are functions both of _qp and _i, for example the weighted gap.
virtual void initialize() override
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.
const Parallel::Communicator & _communicator
unsigned int n_points() const