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 std::vector<std::vector<libMesh::FEBase *>> & fes,
42 const std::map<
dof_id_type, std::vector<dof_id_type>> & node_to_elem_map,
43 const std::vector<std::tuple<dof_id_type, unsigned short int, boundary_id_type>> & bc_tuples);
75 std::vector<std::vector<libMesh::FEBase *>> &
_fes;
84 const std::vector<std::tuple<dof_id_type, unsigned short int, boundary_id_type>> &
_bc_tuples;
128 Real & tangential_distance,
129 const Node *& closest_node,
130 unsigned int & index,
132 std::vector<PenetrationInfo *> & p_info,
133 const unsigned int index1,
134 const unsigned int index2);
139 const Node *& closest_node,
141 const std::vector<const Node *> & edge_nodes);
148 const Real tangential_tolerance);
154 std::vector<PenetrationInfo *> & edge_face_info,
155 std::vector<Real> & edge_face_weights,
156 std::vector<PenetrationInfo *> & p_info,
157 const Node & secondary_node);
160 std::vector<std::vector<const Node *>> & edge_nodes,
161 std::vector<Real> & edge_face_weights);
164 const std::set<dof_id_type> & elems_to_exclude,
165 const std::vector<const Node *> edge_nodes,
166 std::vector<PenetrationInfo *> & face_info_comm_edge,
167 std::vector<PenetrationInfo *> & p_info);
169 void getInfoForElem(std::vector<PenetrationInfo *> & thisElemInfo,
170 std::vector<PenetrationInfo *> & p_info,
174 std::vector<PenetrationInfo *> & p_info,
175 const Node * secondary_node,
177 const std::vector<const Node *> & nodes_that_must_be_on_side,
178 const bool check_whether_reasonable =
false);
void getSidesOnPrimaryBoundary(std::vector< unsigned int > &sides, const Elem *const elem)
MooseVariable * _nodal_normal_z
void getSmoothingEdgeNodesAndWeights(const libMesh::Point &p, const Elem *side, std::vector< std::vector< const Node *>> &edge_nodes, std::vector< Real > &edge_face_weights)
Class for stuff related to variables.
MooseVariableFE< libMesh::VectorValue< Real > > VectorMooseVariable
libMesh::Point _closest_coor
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)
Data structure used to hold penetration information.
NearestNodeLocator & _nearest_node
Finds the nearest node to each node in boundary1 to each node in boundary2 and the other way around...
Real _normal_smoothing_distance
bool _check_whether_reasonable
const std::vector< std::tuple< dof_id_type, unsigned short int, boundary_id_type > > & _bc_tuples
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)
void getSideCornerNodes(const Elem *side, std::vector< const Node *> &corner_nodes)
void smoothNormal(PenetrationInfo *info, std::vector< PenetrationInfo *> &p_info, const Node &node)
libMesh::FEType & _fe_type
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 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
Real _tangential_distance
boundary_id_type BoundaryID
BoundaryID _secondary_boundary
CompeteInteractionResult competeInteractions(PenetrationInfo *pi1, PenetrationInfo *pi2)
When interactions are identified between a node and two faces, compete between the faces to determine...
void operator()(const NodeIdRange &range)
const Node * _closest_node
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
void computeSlip(libMesh::FEBase &fe, PenetrationInfo &info)
const Node * _closest_node
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...
libMesh::Point _closest_coor
bool restrictPointToSpecifiedEdgeOfFace(libMesh::Point &p, const Node *&closest_node, const Elem *side, const std::vector< const Node *> &edge_nodes)
void join(const PenetrationThread &other)
Real _tangential_tolerance
bool restrictPointToFace(libMesh::Point &p, const Node *&closest_node, const Elem *side)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Generic class for solving transient nonlinear problems.
std::map< dof_id_type, PenetrationInfo * > & _penetration_info
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, std::vector< std::vector< libMesh::FEBase *>> &fes, libMesh::FEType &fe_type, NearestNodeLocator &nearest_node, const std::map< dof_id_type, std::vector< dof_id_type >> &node_to_elem_map, const std::vector< std::tuple< dof_id_type, unsigned short int, boundary_id_type >> &bc_tuples)
MooseVariable * _nodal_normal_y
libMesh::ElemSideBuilder _elem_side_builder
Helper for building element sides without extraneous allocation.
void getInfoForElem(std::vector< PenetrationInfo *> &thisElemInfo, std::vector< PenetrationInfo *> &p_info, const Elem *elem)
bool _do_normal_smoothing
libMesh::Point _closest_coor_ref
const std::map< dof_id_type, std::vector< dof_id_type > > & _node_to_elem_map
void switchInfo(PenetrationInfo *&info, PenetrationInfo *&infoNew)
MooseVariable * _nodal_normal_x
std::vector< std::vector< libMesh::FEBase * > > & _fes
CompeteInteractionResult competeInteractionsBothOnFace(PenetrationInfo *pi1, PenetrationInfo *pi2)
Determine whether first (pi1) or second (pi2) interaction is stronger when it is known that the node ...
CommonEdgeResult interactionsOffCommonEdge(PenetrationInfo *pi1, PenetrationInfo *pi2)
bool isFaceReasonableCandidate(const Elem *primary_elem, const Elem *side, libMesh::FEBase *fe, const libMesh::Point *secondary_point, const Real tangential_tolerance)
PenetrationLocator::NORMAL_SMOOTHING_METHOD _normal_smoothing_method
std::vector< RidgeData > _ridge_data_vec
MooseVariableFE< Real > MooseVariable