17 #include "libmesh/quadrature.h" 29 params.
addCoupledVar(
"disp_z",
"The z displacement variable");
30 params.
set<
bool>(
"use_displaced_mesh") =
true;
31 params.
set<
bool>(
"interpolate_normals") =
false;
39 _fe_problem(*getCheckedPointerParam<
FEProblemBase *>(
"_fe_problem_base")),
40 _nodal(getVar(
"disp_x", 0)->feType().family ==
LAGRANGE),
41 _disp_x_var(getVar(
"disp_x", 0)),
42 _disp_y_var(getVar(
"disp_y", 0)),
43 _has_disp_z(isCoupled(
"disp_z")),
44 _disp_z_var(_has_disp_z ? getVar(
"disp_z", 0) : nullptr),
45 _secondary_disp_x(_disp_x_var->adSln()),
46 _primary_disp_x(_disp_x_var->adSlnNeighbor()),
47 _secondary_disp_y(_disp_y_var->adSln()),
48 _primary_disp_y(_disp_y_var->adSlnNeighbor()),
49 _secondary_disp_z(_has_disp_z ? &_disp_z_var->adSln() : nullptr),
50 _primary_disp_z(_has_disp_z ? &_disp_z_var->adSlnNeighbor() : nullptr),
51 _coord(_assembly.mortarCoordTransformation())
53 if (!getParam<bool>(
"use_displaced_mesh"))
55 "'use_displaced_mesh' must be true for the WeightedGapUserObject object");
71 const auto & secondary_ip_lowerd_map =
75 std::array<ADReal, 3> primary_disp{
84 const ADReal & prim_x = primary_disp[0];
85 const ADReal & prim_y = primary_disp[1];
86 const ADReal * prim_z =
nullptr;
88 prim_z = &primary_disp[2];
90 const ADReal & sec_x = secondary_disp[0];
91 const ADReal & sec_y = secondary_disp[1];
92 const ADReal * sec_z =
nullptr;
94 sec_z = &secondary_disp[2];
107 gap_vec(0).derivatives() = prim_x.derivatives() - sec_x.derivatives();
108 gap_vec(1).derivatives() = prim_y.derivatives() - sec_y.derivatives();
110 gap_vec(2).derivatives() = prim_z->derivatives() - sec_z->derivatives();
124 "Making sure that _normals is the expected size");
virtual MooseMesh & mesh()=0
static InputParameters validParams()
unsigned int _qp
Quadrature point index for the mortar segments.
const ADVariableValue & _secondary_disp_y
y-displacement on the secondary face
std::map< unsigned int, unsigned int > getPrimaryIpToLowerElementMap(const Elem &primary_elem, const Elem &primary_elem_ip, const Elem &lower_secondary_elem) const
Real _qp_factor
The value of the LM at the current quadrature point.
virtual const VariableTestValue & test() const =0
virtual void initialSetup() override
WeightedGapUserObject(const InputParameters ¶meters)
virtual void initialize() override
const MooseVariable *const _disp_z_var
The z displacement variable.
static InputParameters validParams()
ADRealVectorValue _qp_displacement_nodal
Vector for computation of relative displacement (determines mixity ratio in interface problems) ...
std::unordered_map< const DofObject *, ADRealVectorValue > _dof_to_weighted_displacements
A map from node to weighted displacements.
const MooseArray< Point > & _phys_points_primary
Elem const *const & _lower_primary_elem
const ADVariableValue & _secondary_disp_x
x-displacement on the secondary face
const bool _nodal
Whether the dof objects are nodal; if they're not, then they're elemental.
const bool _has_disp_z
For 2D mortar contact no displacement will be specified, so const pointers used.
const ADVariableValue & _primary_disp_x
x-displacement on the primary face
const std::vector< Real > & _JxW_msm
const Parallel::Communicator & _communicator
ADRealVectorValue _qp_gap_nodal
Vector for computation of weighted gap with nodal normals.
DualNumber< Real, DNDerivativeType, true > ADReal
const libMesh::QBase *const & _qrule_msm
virtual Real getNormalGap(const Node *const) const
Elem const *const & _lower_secondary_elem
const AutomaticMortarGeneration & amg() const
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 ADVariableValue & _primary_disp_y
y-displacement on the primary face
std::vector< Point > _normals
const VariableTestValue * _test
A pointer to the test function associated with the weighted gap.
virtual const Node * nodePtr(const dof_id_type i) const
virtual void computeQpProperties()
Computes properties that are functions only of the current quadrature point (_qp), e.g.
unsigned int n_points() const
std::map< unsigned int, unsigned int > getSecondaryIpToLowerElementMap(const Elem &lower_secondary_elem) const
void paramError(const std::string ¶m, Args... args) const
const MooseArray< Point > & _phys_points_secondary
const ExecFlagType EXEC_LINEAR
virtual void execute() override
const MooseArray< Real > & _coord
Member for handling change of coordinate systems (xyz, rz, spherical)
const ExecFlagType EXEC_NONLINEAR
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const MooseVariable *const _disp_y_var
The y displacement variable.
static InputParameters validParams()
static InputParameters validParams()
virtual bool constrainedByOwner() const =0
unsigned int _i
Test function index.
Real physicalGap(const std::pair< ADReal, Real > &gap) const
Compute physical gap from integration gap quantity.
const MooseVariable *const _disp_x_var
The x displacement variable.
virtual void initialSetup()
virtual void computeQpIProperties()
Computes properties that are functions both of _qp and _i, for example the weighted gap...
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 void finalize() override