16#include "libmesh/elem_side_builder.h"
32 std::map<dof_id_type, PenetrationInfo *> & penetration_info,
33 bool check_whether_reasonable,
35 Real tangential_tolerance,
36 bool do_normal_smoothing,
37 Real normal_smoothing_distance,
39 bool use_point_locator,
40 std::vector<std::vector<libMesh::FEBase *>> & fes,
43 const std::unordered_map<dof_id_type, std::vector<dof_id_type>> & node_to_elem_map);
76 std::vector<std::vector<libMesh::FEBase *>> &
_fes;
126 Real & tangential_distance,
127 const Node *& closest_node,
128 unsigned int & index,
130 std::vector<PenetrationInfo *> & p_info,
131 const unsigned int index1,
132 const unsigned int index2);
137 const Node *& closest_node,
139 const std::vector<const Node *> & edge_nodes);
146 const Real tangential_tolerance);
152 std::vector<PenetrationInfo *> & edge_face_info,
153 std::vector<Real> & edge_face_weights,
154 std::vector<PenetrationInfo *> & p_info,
155 const Node & secondary_node);
158 std::vector<std::vector<const Node *>> & edge_nodes,
159 std::vector<Real> & edge_face_weights);
162 const std::set<dof_id_type> & elems_to_exclude,
163 const std::vector<const Node *> edge_nodes,
164 std::vector<PenetrationInfo *> & face_info_comm_edge,
165 std::vector<PenetrationInfo *> & p_info);
167 void getInfoForElem(std::vector<PenetrationInfo *> & thisElemInfo,
168 std::vector<PenetrationInfo *> & p_info,
172 std::vector<PenetrationInfo *> & p_info,
173 const Node * secondary_node,
175 const std::vector<const Node *> & nodes_that_must_be_on_side,
176 const bool check_whether_reasonable =
false);
boundary_id_type BoundaryID
MooseVariableFE< Real > MooseVariable
MooseVariableFE< libMesh::VectorValue< Real > > VectorMooseVariable
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Class for stuff related to variables.
Finds the nearest node to each node in boundary1 to each node in boundary2 and the other way around.
Data structure used to hold penetration information.
void computeSlip(libMesh::FEBase &fe, PenetrationInfo &info)
void createInfoForElem(std::vector< PenetrationInfo * > &thisElemInfo, std::vector< PenetrationInfo * > &p_info, const Node *secondary_node, const Elem *elem, const std::vector< const Node * > &nodes_that_must_be_on_side, const bool check_whether_reasonable=false)
std::map< dof_id_type, PenetrationInfo * > & _penetration_info
MooseVariable * _nodal_normal_x
libMesh::ElemSideBuilder _elem_side_builder
Helper for building element sides without extraneous allocation.
bool _check_whether_reasonable
void operator()(const NodeIdRange &range)
bool isFaceReasonableCandidate(const Elem *primary_elem, const Elem *side, libMesh::FEBase *fe, const libMesh::Point *secondary_point, const Real tangential_tolerance)
void getInfoForElem(std::vector< PenetrationInfo * > &thisElemInfo, std::vector< PenetrationInfo * > &p_info, const Elem *elem)
bool restrictPointToSpecifiedEdgeOfFace(libMesh::Point &p, const Node *&closest_node, const Elem *side, const std::vector< const Node * > &edge_nodes)
MooseVariable * _nodal_normal_z
const std::unordered_map< dof_id_type, std::vector< dof_id_type > > & _node_to_elem_map
std::vector< dof_id_type > _recheck_secondary_nodes
List of secondary nodes for which penetration was not detected in the current patch and for which pat...
MooseVariable * _nodal_normal_y
void getSideCornerNodes(const Elem *side, std::vector< const Node * > &corner_nodes)
bool findRidgeContactPoint(libMesh::Point &contact_point, Real &tangential_distance, const Node *&closest_node, unsigned int &index, libMesh::Point &contact_point_ref, std::vector< PenetrationInfo * > &p_info, const unsigned int index1, const unsigned int index2)
Real _tangential_tolerance
std::vector< std::vector< libMesh::FEBase * > > & _fes
BoundaryID _secondary_boundary
void switchInfo(PenetrationInfo *&info, PenetrationInfo *&infoNew)
void getSmoothingEdgeNodesAndWeights(const libMesh::Point &p, const Elem *side, std::vector< std::vector< const Node * > > &edge_nodes, std::vector< Real > &edge_face_weights)
bool _do_normal_smoothing
CommonEdgeResult interactionsOffCommonEdge(PenetrationInfo *pi1, PenetrationInfo *pi2)
bool restrictPointToFace(libMesh::Point &p, const Node *&closest_node, const Elem *side)
void getSidesOnPrimaryBoundary(std::vector< unsigned int > &sides, const Elem *const elem)
libMesh::FEType & _fe_type
Real _normal_smoothing_distance
void getInfoForFacesWithCommonNodes(const Node *secondary_node, const std::set< dof_id_type > &elems_to_exclude, const std::vector< const Node * > edge_nodes, std::vector< PenetrationInfo * > &face_info_comm_edge, std::vector< PenetrationInfo * > &p_info)
void join(const PenetrationThread &other)
NearestNodeLocator & _nearest_node
PenetrationLocator::NORMAL_SMOOTHING_METHOD _normal_smoothing_method
PenetrationThread(SubProblem &subproblem, const MooseMesh &mesh, BoundaryID primary_boundary, BoundaryID secondary_boundary, std::map< dof_id_type, PenetrationInfo * > &penetration_info, bool check_whether_reasonable, bool update_location, Real tangential_tolerance, bool do_normal_smoothing, Real normal_smoothing_distance, PenetrationLocator::NORMAL_SMOOTHING_METHOD normal_smoothing_method, bool use_point_locator, std::vector< std::vector< libMesh::FEBase * > > &fes, libMesh::FEType &fe_type, NearestNodeLocator &nearest_node, const std::unordered_map< dof_id_type, std::vector< dof_id_type > > &node_to_elem_map)
void smoothNormal(PenetrationInfo *info, std::vector< PenetrationInfo * > &p_info, const Node &node)
void getSmoothingFacesAndWeights(PenetrationInfo *info, std::vector< PenetrationInfo * > &edge_face_info, std::vector< Real > &edge_face_weights, std::vector< PenetrationInfo * > &p_info, const Node &secondary_node)
BoundaryID _primary_boundary
CompeteInteractionResult competeInteractionsBothOnFace(PenetrationInfo *pi1, PenetrationInfo *pi2)
Determine whether first (pi1) or second (pi2) interaction is stronger when it is known that the node ...
CompeteInteractionResult competeInteractions(PenetrationInfo *pi1, PenetrationInfo *pi2)
When interactions are identified between a node and two faces, compete between the faces to determine...
Generic class for solving transient nonlinear problems.
libMesh::Point _closest_coor
Real _tangential_distance
libMesh::Point _closest_coor_ref
const Node * _closest_node
std::vector< RidgeData > _ridge_data_vec
const Node * _closest_node
libMesh::Point _closest_coor