10 #ifndef DUNE_GRIDGLUE_MERGING_CONTACTMERGE_HH
11 #define DUNE_GRIDGLUE_MERGING_CONTACTMERGE_HH
23 #include <dune/common/fvector.hh>
24 #include <dune/common/exceptions.hh>
25 #include <dune/common/bitsetvector.hh>
26 #include <dune/common/deprecated.hh>
28 #include <dune/grid/common/grid.hh>
41 template<
int dimworld,
typename T =
double>
45 static constexpr
int dim = dimworld-1;
47 static_assert( dim==1 || dim==2,
48 "ContactMerge yet only handles the cases dim==1 and dim==2!");
77 : domainDirections_(domainDirections), targetDirections_(targetDirections),
78 overlap_(allowedOverlap), type_(type)
87 : overlap_(allowedOverlap),
103 domainDirections_ = domainDirections;
104 targetDirections_ = targetDirections;
126 maxNormalProduct_ = cos(angle);
135 return acos(maxNormalProduct_);
146 std::vector<WorldCoords> nodalDomainDirections_;
157 std::vector<WorldCoords> nodalTargetDirections_;
168 T maxNormalProduct_ = T(-0.1);
174 void computeIntersections(
const Dune::GeometryType& grid1ElementType,
175 const std::vector<Dune::FieldVector<T,dimworld> >& grid1ElementCorners,
176 std::bitset<(1<<dim)>& neighborIntersects1,
177 unsigned int grid1Index,
178 const Dune::GeometryType& grid2ElementType,
179 const std::vector<Dune::FieldVector<T,dimworld> >& grid2ElementCorners,
180 std::bitset<(1<<dim)>& neighborIntersects2,
181 unsigned int grid2Index,
182 std::vector<SimplicialIntersection>& intersections)
override;
188 void build(
const std::vector<Dune::FieldVector<T,dimworld> >& grid1Coords,
189 const std::vector<unsigned int>& grid1Elements,
190 const std::vector<Dune::GeometryType>& grid1ElementTypes,
191 const std::vector<Dune::FieldVector<T,dimworld> >& grid2Coords,
192 const std::vector<unsigned int>& grid2Elements,
193 const std::vector<Dune::GeometryType>& grid2ElementTypes)
override
195 std::cout<<
"ContactMerge building grid!\n";
198 grid2Coords, grid2Elements, grid2ElementTypes);
200 Base::build(grid1Coords, grid1Elements, grid1ElementTypes,
201 grid2Coords, grid2Elements, grid2ElementTypes);
208 static LocalCoords localCornerCoords(
int i,
const Dune::GeometryType& gt)
210 const auto& ref = Dune::ReferenceElements<T,dim>::general(gt);
211 return ref.position(i,dim);
217 void computeCyclicOrder(
const std::vector<std::array<LocalCoords,2> >& polytopeCorners,
218 const LocalCoords& center, std::vector<int>& ordering)
const;
222 const std::vector<unsigned int>& elements1,
223 const std::vector<Dune::GeometryType>& elementTypes1,
224 const std::vector<WorldCoords>& coords2,
225 const std::vector<unsigned int>& elements2,
226 const std::vector<Dune::GeometryType>& elementTypes2);
230 const std::vector<unsigned int>& elements,
231 const std::vector<Dune::GeometryType>& elementTypes,
232 std::vector<WorldCoords>& normals);
235 void removeDoubles(std::vector<std::array<LocalCoords,2> >& polytopeCorners);
Central component of the module implementing the coupling of two grids.
Common base class for many merger implementations: produce pairs of entities that may intersect.
Definition: gridglue.hh:37
Merge two codimension-1 surfaces that may be a positive distance apart.
Definition: contactmerge.hh:44
void computeCyclicOrder(const std::vector< std::array< LocalCoords, 2 > > &polytopeCorners, const LocalCoords ¢er, std::vector< int > &ordering) const
Order the corners of the intersection polytope in cyclic order.
Definition: contactmerge.cc:214
StandardMerge< T, dimworld-1, dimworld-1, dimworld >::SimplicialIntersection SimplicialIntersection
Definition: contactmerge.hh:139
void removeDoubles(std::vector< std::array< LocalCoords, 2 > > &polytopeCorners)
Remove all multiples.
Definition: contactmerge.cc:335
void setOverlap(T overlap)
Set the allowed overlap of the surfaces.
Definition: contactmerge.hh:109
Dune::FieldVector< T, dimworld > WorldCoords
the coordinate type used in this interface
Definition: contactmerge.hh:59
void setupNodalDirections(const std::vector< WorldCoords > &coords1, const std::vector< unsigned int > &elements1, const std::vector< Dune::GeometryType > &elementTypes1, const std::vector< WorldCoords > &coords2, const std::vector< unsigned int > &elements2, const std::vector< Dune::GeometryType > &elementTypes2)
Setup the direction vectors containing the directions for each vertex.
Definition: contactmerge.cc:269
void minNormalAngle(T angle)
set minimum angle in radians between normals at x and Φ(x)
Definition: contactmerge.hh:123
T ctype
the numeric type used in this interface
Definition: contactmerge.hh:56
ProjectionType
Type of the projection, closest point or outer normal projection.
Definition: contactmerge.hh:65
@ CLOSEST_POINT
Definition: contactmerge.hh:65
@ OUTER_NORMAL
Definition: contactmerge.hh:65
void computeOuterNormalField(const std::vector< WorldCoords > &coords, const std::vector< unsigned int > &elements, const std::vector< Dune::GeometryType > &elementTypes, std::vector< WorldCoords > &normals)
If no direction field was specified compute the outer normal field.
Definition: contactmerge.cc:296
T getOverlap() const
Get the allowed overlap of the surfaces.
Definition: contactmerge.hh:115
ContactMerge(const T allowedOverlap=T(0), std::function< WorldCoords(WorldCoords)> domainDirections=nullptr, std::function< WorldCoords(WorldCoords)> targetDirections=nullptr, ProjectionType type=OUTER_NORMAL)
Construct merger given overlap and possible projection directions.
Definition: contactmerge.hh:73
void setSurfaceDirections(std::function< WorldCoords(WorldCoords)> domainDirections, std::function< WorldCoords(WorldCoords)> targetDirections)
Set surface direction functions.
Definition: contactmerge.hh:100
void build(const std::vector< Dune::FieldVector< T, dimworld > > &grid1Coords, const std::vector< unsigned int > &grid1Elements, const std::vector< Dune::GeometryType > &grid1ElementTypes, const std::vector< Dune::FieldVector< T, dimworld > > &grid2Coords, const std::vector< unsigned int > &grid2Elements, const std::vector< Dune::GeometryType > &grid2ElementTypes) override
builds the merged grid
Definition: contactmerge.hh:188
ContactMerge(const T allowedOverlap, ProjectionType type)
Construct merger given overlap and type of the projection.
Definition: contactmerge.hh:86
T minNormalAngle() const
get minimum angle in radians between normals at x and Φ(x)
Definition: contactmerge.hh:132
Dune::FieldVector< T, dim > LocalCoords
the coordinate type used in this interface
Definition: contactmerge.hh:62
Common base class for many merger implementations: produce pairs of entities that may intersect.
Definition: standardmerge.hh:58
void build(const std::vector< Dune::FieldVector< T, dimworld > > &grid1_Coords, const std::vector< unsigned int > &grid1_elements, const std::vector< Dune::GeometryType > &grid1_element_types, const std::vector< Dune::FieldVector< T, dimworld > > &grid2_coords, const std::vector< unsigned int > &grid2_elements, const std::vector< Dune::GeometryType > &grid2_element_types) override
builds the merged grid
Definition: standardmerge.hh:392
bool valid
Definition: standardmerge.hh:86