https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MortarSegmentHelper.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 "MortarSegmentInfo.h"
13
14#include "libmesh/point.h"
15#include "libmesh/int_range.h"
16
17#include <array>
18#include <optional>
19#include <string>
20#include <vector>
21
22#ifdef MOOSE_UNIT_TEST
23class MortarSegmentHelperTest;
24#endif
25
33{
34public:
38 MortarSegmentHelper(std::vector<Point> secondary_nodes,
39 const Point & center,
40 const Point & normal,
41 const MortarSegmentTriangulationMode triangulation_mode,
42 const bool triangulate_triangles);
43
47 MortarSegmentHelper(std::vector<Point> secondary_nodes,
48 std::vector<Point> secondary_reference_points,
49 const Point & center,
50 const Point & normal,
51 const MortarSegmentTriangulationMode triangulation_mode,
52 const bool triangulate_triangles);
53
59 Point getIntersection(
60 const Point & p1, const Point & p2, const Point & q1, const Point & q2, Real & s) const;
61
65 bool isInsideSecondary(const Point & pt) const;
66
70 bool isDisjoint(const std::vector<Point> & poly) const;
71
75 std::vector<Point> projectPrimaryPoly(const std::vector<Point> & primary_nodes) const;
76
81 std::vector<Point> clipPoly(const std::vector<Point> & primary_nodes) const;
82
93 void triangulatePoly(std::vector<Point> & poly_nodes,
94 std::vector<std::vector<unsigned int>> & tri_map) const;
95
102 void getMortarSegments(const std::vector<Point> & primary_nodes,
103 std::vector<Point> & nodes,
104 std::vector<std::vector<unsigned int>> & elem_to_nodes);
105
111 void getMortarSegments(const std::vector<Point> & primary_nodes,
112 const std::vector<Point> & primary_reference_points,
113 std::vector<Point> & nodes,
114 std::vector<std::vector<unsigned int>> & elem_to_nodes,
115 std::vector<std::array<Point, 3>> & elem_to_secondary_reference_points,
116 std::vector<std::array<Point, 3>> & elem_to_primary_reference_points,
117 Real minimum_segment_area = 0.);
118
122 Real area(const std::vector<Point> & nodes) const;
123
127 const Point & center() const { return _center; }
128
132 const Point & normal() const { return _normal; }
133
137 Real remainder() const { return _remaining_area_fraction; }
138
142 Point point(unsigned int i) const
143 {
144 return (_secondary_poly[i](0) * _u) + (_secondary_poly[i](1) * _v) + _center;
145 }
146
147private:
152 {
153 const std::vector<Point> & primary_reference_points;
154 std::vector<std::array<Point, 3>> & elem_to_secondary_reference_points;
155 std::vector<std::array<Point, 3>> & elem_to_primary_reference_points;
157 };
158
159 void getMortarSegmentsImpl(const std::vector<Point> & primary_nodes,
160 std::vector<Point> & nodes,
161 std::vector<std::vector<unsigned int>> & elem_to_nodes,
162 ReferenceMappingData * reference_mapping);
163
168 std::vector<Point> clipProjectedPoly(const std::vector<Point> & primary_poly) const;
169
174 std::optional<Point> referencePoint(const Point & point,
175 const std::vector<Point> & poly,
176 const std::vector<Point> & reference_points,
177 std::string * failure_reason = nullptr) const;
178
179#ifdef MOOSE_UNIT_TEST
181#endif
182
186 Point _center;
187
191 Point _normal;
192
198 Point _u, _v;
199
204
209
210 bool _debug;
211
215 Real _tolerance = 1e-8;
216
221
226
231
236
240 std::vector<Point> _secondary_poly;
241
243 std::vector<Point> _secondary_reference_points;
244};
MortarSegmentTriangulationMode
This class supports defining mortar segment mesh elements in 3D by projecting secondary and primary e...
std::vector< Point > clipPoly(const std::vector< Point > &primary_nodes) const
Clip secondary element (defined in instantiation) against given primary polygon result is a set of 2D...
Point point(unsigned int i) const
Get 3D position of node of linearized secondary element.
Real _area_tol
Tolerance times secondary area for dimensional consistency.
Point _u
Vectors orthogonal to normal that span the plane projection will be performed on.
Point _center
Geometric center of secondary element.
Real _secondary_area
Area of projected secondary element.
std::vector< Point > _secondary_poly
List of projected points on the linearized secondary element.
Point getIntersection(const Point &p1, const Point &p2, const Point &q1, const Point &q2, Real &s) const
Computes the intersection between line segments defined by point pairs (p1,p2) and (q1,...
std::vector< Point > projectPrimaryPoly(const std::vector< Point > &primary_nodes) const
Project a primary polygon into the helper plane while preserving the clipping orientation.
std::vector< Point > clipProjectedPoly(const std::vector< Point > &primary_poly) const
Clip an already projected primary polygon against the secondary polygon.
const MortarSegmentTriangulationMode _triangulation_mode
Triangulation mode used for clipped polygons.
const bool _triangulate_triangles
Whether already-triangular polygons should still be centroid-subdivided.
bool isInsideSecondary(const Point &pt) const
Check that a point is inside the secondary polygon (for verification only)
const Point & normal() const
Get the unit normal of the projection plane.
void triangulatePoly(std::vector< Point > &poly_nodes, std::vector< std::vector< unsigned int > > &tri_map) const
Triangulate a polygon according to the configured mortar-segment triangulation mode.
Point _normal
Unit normal of the plane used to project and clip the linearized secondary subpatch.
Real _remaining_area_fraction
Fraction of area remaining after overlapping primary polygons clipped.
std::optional< Point > referencePoint(const Point &point, const std::vector< Point > &poly, const std::vector< Point > &reference_points, std::string *failure_reason=nullptr) const
Recover a parent-reference point from a projected sub-element map.
Real _length_tol
Tolerance times secondary area for dimensional consistency.
const Point & center() const
Get center point of secondary element.
Real area(const std::vector< Point > &nodes) const
Compute area of polygon.
bool isDisjoint(const std::vector< Point > &poly) const
Checks whether polygons are disjoint for an easy out.
Real remainder() const
Get area fraction remaining after clipping against primary elements.
void getMortarSegments(const std::vector< Point > &primary_nodes, std::vector< Point > &nodes, std::vector< std::vector< unsigned int > > &elem_to_nodes)
Get mortar segments generated by a secondary and primary element pair.
void getMortarSegmentsImpl(const std::vector< Point > &primary_nodes, std::vector< Point > &nodes, std::vector< std::vector< unsigned int > > &elem_to_nodes, ReferenceMappingData *reference_mapping)
Real _tolerance
Tolerance for intersection and clipping.
friend class MortarSegmentHelperTest
std::vector< Point > _secondary_reference_points
Parent reference points corresponding to _secondary_poly.
Output containers and filtering data used while generating reference-coordinate mappings.
const std::vector< Point > & primary_reference_points
std::vector< std::array< Point, 3 > > & elem_to_secondary_reference_points
std::vector< std::array< Point, 3 > > & elem_to_primary_reference_points