32 auto &v1 = mesh.createVertex(Eigen::Vector3d(0, 2, 0));
33 auto &v2 = mesh.createVertex(Eigen::Vector3d(2, 1, 0));
34 auto &v3 = mesh.createVertex(Eigen::Vector3d(3, 0, 0));
35 auto &v4 = mesh.createVertex(Eigen::Vector3d(1, 0, 0));
37 auto &e1 = mesh.createEdge(v1, v2);
38 auto &e2 = mesh.createEdge(v2, v3);
39 auto &e3 = mesh.createEdge(v3, v4);
40 auto &e4 = mesh.createEdge(v4, v1);
42 auto &e5 = mesh.createEdge(v2, v4);
44 mesh.createTriangle(e1, e5, e4);
45 mesh.createTriangle(e2, e3, e5);
52 mesh->createVertex(Eigen::Vector3d(0, 0, 0));
53 mesh->createVertex(Eigen::Vector3d(0, 0, 1));
54 mesh->createVertex(Eigen::Vector3d(0, 1, 0));
55 mesh->createVertex(Eigen::Vector3d(0, 1, 1));
56 mesh->createVertex(Eigen::Vector3d(1, 0, 0));
57 mesh->createVertex(Eigen::Vector3d(1, 0, 1));
58 auto &v1 = mesh->createVertex(Eigen::Vector3d(1, 1, 0));
59 auto &v2 = mesh->createVertex(Eigen::Vector3d(1, 1, 1));
60 mesh->createEdge(v1, v2);
67 mesh->createVertex(Eigen::Vector2d(0, 0));
68 mesh->createVertex(Eigen::Vector2d(0, 1));
69 auto &v1 = mesh->createVertex(Eigen::Vector2d(1, 0));
70 auto &v2 = mesh->createVertex(Eigen::Vector2d(1, 1));
71 mesh->createEdge(v1, v2);
78 mesh->createVertex(Eigen::Vector3d(0, 0, 0));
79 mesh->createVertex(Eigen::Vector3d(0, 0, 1));
80 mesh->createVertex(Eigen::Vector3d(0, 1, 0));
81 mesh->createVertex(Eigen::Vector3d(0, 1, 1));
82 mesh->createVertex(Eigen::Vector3d(1, 0, 0));
83 mesh->createVertex(Eigen::Vector3d(1, 0, 1));
84 mesh->createVertex(Eigen::Vector3d(1, 1, 0));
85 mesh->createVertex(Eigen::Vector3d(1, 1, 1));
86 mesh->computeBoundingBox();
99 auto mesh = edgeMesh2D();
100 Index indexTree(mesh);
101 Eigen::Vector2d location(0.2, 0.8);
104 BOOST_TEST(mesh->vertex(result.index).getCoords() == Eigen::Vector2d(0, 1));
111 auto mesh = edgeMesh3D();
112 Index indexTree(mesh);
113 Eigen::Vector3d location(0.8, 0.0, 0.8);
116 BOOST_TEST(mesh->vertex(result.index).getCoords() == Eigen::Vector3d(1, 0, 1));
124 const double z1 = 0.1;
125 const double z2 = -0.1;
126 auto &v00 = mesh->
createVertex(Eigen::Vector3d(0, 0, 0));
127 auto &v01 = mesh->
createVertex(Eigen::Vector3d(0, 1, 0));
128 auto &v10 = mesh->
createVertex(Eigen::Vector3d(1, 0, z1));
129 auto &v11 = mesh->
createVertex(Eigen::Vector3d(1, 1, z1));
130 auto &v20 = mesh->
createVertex(Eigen::Vector3d(2, 0, z2));
131 auto &v21 = mesh->
createVertex(Eigen::Vector3d(2, 1, z2));
132 auto &v30 = mesh->
createVertex(Eigen::Vector3d(3, 0, z2));
133 auto &v31 = mesh->
createVertex(Eigen::Vector3d(3, 1, z2));
149 Index indexTree(mesh);
151 Eigen::Vector3d location(0.8, 0.0, 0.8);
154 BOOST_TEST(mesh->
vertex(result.index).
getID() == v10.getID());
157 Eigen::Vector3d location(0.8, 0.0, 0.8);
162 BOOST_TEST(result.
size() == nVertices);
166 Eigen::Vector3d location(3.5, 3.5, 0.0);
171 BOOST_TEST(result.
size() == nVertices);
181 auto mesh = vertexMesh3D();
182 Index indexTree(mesh);
183 mesh::Vertex searchVertex(Eigen::Vector3d(0.8, 1, 0), 0);
187 BOOST_TEST(results.empty());
195 auto mesh = vertexMesh3D();
196 Index indexTree(mesh);
198 mesh::Vertex searchVertex(Eigen::Vector3d(0.8, 1, 0), 0);
199 double radius = 0.81;
202 BOOST_TEST(results.size() == 2);
203 BOOST_TEST(mesh->vertex(results.at(0)).getCoords() == Eigen::Vector3d(0, 1, 0));
204 BOOST_TEST(mesh->vertex(results.at(1)).getCoords() == Eigen::Vector3d(1, 1, 0));
212 auto mesh = vertexMesh3D();
213 Index indexTree(mesh);
215 mesh::Vertex searchVertex(Eigen::Vector3d(0.8, 1, 0), 0);
219 BOOST_TEST(results.size() == 8);
226 auto mesh = edgeMesh2D();
227 auto result = mesh->index().getRtreeBounds();
228 mesh->computeBoundingBox();
229 auto comparison = mesh->getBoundingBox();
231 BOOST_TEST(result == comparison);
232 BOOST_TEST(result.minCorner() == Eigen::Vector2d(0, 0));
233 BOOST_TEST(result.maxCorner() == Eigen::Vector2d(1, 1));
240 auto mesh = vertexMesh3D();
241 auto result = mesh->index().getRtreeBounds();
242 mesh->computeBoundingBox();
243 auto comparison = mesh->getBoundingBox();
245 BOOST_TEST(result == comparison);
246 BOOST_TEST(result.minCorner() == Eigen::Vector3d(0, 0, 0));
247 BOOST_TEST(result.maxCorner() == Eigen::Vector3d(1, 1, 1));
257 mesh->
createVertex(Eigen::Vector3d(-23.4, 100000.2, 7));
258 mesh->
createVertex(Eigen::Vector3d(0.211, -21.37, 0.00003));
263 BOOST_TEST(result == comparison);
264 BOOST_TEST(result.minCorner() == Eigen::Vector3d(-23.4, -21.37, 0.00003));
265 BOOST_TEST(result.maxCorner() == Eigen::Vector3d(26.4777, 100000.2, 8));
276 auto mesh = edgeMesh2D();
277 Index indexTree(mesh);
278 Eigen::Vector2d location(0.2, 0.8);
281 BOOST_TEST(results.size() == 1);
282 auto &edge = mesh->edges().at(results.front().index);
284 BOOST_TEST(edge.vertex(0).getCoords() == Eigen::Vector2d(1, 0));
285 BOOST_TEST(edge.vertex(1).getCoords() == Eigen::Vector2d(1, 1));
292 auto mesh = edgeMesh3D();
293 Index indexTree(mesh);
294 Eigen::Vector3d location(1.8, 0.0, 0.8);
298 BOOST_TEST(results.size() == 1);
299 auto match = results.front().index;
301 BOOST_TEST(match < mesh->edges().size());
302 auto &edge = mesh->edges().at(match);
303 Eigen::Vector3d p1(1, 1, 0);
304 Eigen::Vector3d p2(1, 1, 1);
305 BOOST_TEST((edge.vertex(0).getCoords() == p1 || edge.vertex(0).getCoords() == p2));
306 if (edge.vertex(0).getCoords() == p1) {
307 BOOST_TEST(edge.vertex(1).getCoords() == p2);
309 BOOST_TEST(edge.vertex(1).getCoords() == p1);
318 const double z1 = 0.1;
319 const double z2 = -0.1;
320 auto &v00 = mesh->
createVertex(Eigen::Vector3d(0, 0, 0));
321 auto &v01 = mesh->
createVertex(Eigen::Vector3d(0, 1, 0));
322 auto &v10 = mesh->
createVertex(Eigen::Vector3d(1, 0, z1));
323 auto &v11 = mesh->
createVertex(Eigen::Vector3d(1, 1, z1));
324 auto &v20 = mesh->
createVertex(Eigen::Vector3d(2, 0, z2));
325 auto &v21 = mesh->
createVertex(Eigen::Vector3d(2, 1, z2));
341 Index indexTree(mesh);
342 Eigen::Vector3d location(0.8, 0.5, 0.0);
346 &mesh->
edges().
at(results.at(0).index),
347 &mesh->
edges().
at(results.at(1).index),
351 BOOST_TEST(matches.size() == 2);
352 BOOST_TEST(matches == expected, boost::test_tools::per_element());
365 const double z1 = 0.1;
366 const double z2 = -0.1;
367 auto &v00 = mesh->
createVertex(Eigen::Vector3d(0, 0, 0));
368 auto &v01 = mesh->
createVertex(Eigen::Vector3d(0, 1, 0));
369 auto &v10 = mesh->
createVertex(Eigen::Vector3d(1, 0, z1));
370 auto &v11 = mesh->
createVertex(Eigen::Vector3d(1, 1, z1));
371 auto &v20 = mesh->
createVertex(Eigen::Vector3d(2, 0, z2));
372 auto &v21 = mesh->
createVertex(Eigen::Vector3d(2, 1, z2));
388 Index indexTree(mesh);
390 Eigen::Vector3d location(0.7, 0.5, 0.0);
393 BOOST_TEST(results.size() == 3);
401 BOOST_TEST(matches.size() == 3);
402 BOOST_TEST(matches == expected, boost::test_tools::per_element());
413 auto meshPtr = fullMesh();
414 Index indexTree(meshPtr);
416 Eigen::Vector3d location(4.0, 0.0, 0.0);
422 BOOST_TEST(match.polation.getWeightedElements().size() == 1);
423 BOOST_TEST(match.polation.distance() == 1.0);
424 BOOST_TEST(match.polation.isInterpolation());
426 for (
int i = 0; i < static_cast<int>(match.polation.getWeightedElements().size()); ++i) {
427 BOOST_TEST(match.polation.getWeightedElements().at(i).vertexID == expectedIndices.
at(i));
428 BOOST_TEST(match.polation.getWeightedElements().at(i).weight == expectedWeights.
at(i));
436 auto meshPtr = fullMesh();
437 Index indexTree(meshPtr);
439 Eigen::Vector3d location(2.0, -1.0, 0.0);
445 BOOST_TEST(match.polation.getWeightedElements().size() == 2);
446 BOOST_TEST(match.polation.distance() == 1.0);
447 BOOST_TEST(match.polation.isInterpolation());
449 for (
int i = 0; i < static_cast<int>(match.polation.getWeightedElements().size()); ++i) {
450 BOOST_TEST(match.polation.getWeightedElements().at(i).vertexID == expectedIndices.
at(i));
451 BOOST_TEST(match.polation.getWeightedElements().at(i).weight == expectedWeights.
at(i));
459 auto meshPtr = fullMesh();
460 Index indexTree(meshPtr);
462 Eigen::Vector3d location(1.0, 1.0, 0.1);
468 BOOST_TEST(match.polation.getWeightedElements().size() == 3);
469 BOOST_TEST(match.polation.distance() == 0.1);
470 BOOST_TEST(match.polation.isInterpolation());
472 for (
int i = 0; i < static_cast<int>(match.polation.getWeightedElements().size()); ++i) {
473 BOOST_TEST(match.polation.getWeightedElements().at(i).vertexID == expectedIndices.
at(i));
474 BOOST_TEST(match.polation.getWeightedElements().at(i).weight == expectedWeights.
at(i));
490 Eigen::Vector3d location(0.5, 0.5, 0.5);
493 auto &v00 = mesh.createVertex(Eigen::Vector3d(0, 0, 0));
494 auto &v01 = mesh.createVertex(Eigen::Vector3d(1, 0, 0));
495 auto &v02 = mesh.createVertex(Eigen::Vector3d(0, 1, 0));
496 auto &v03 = mesh.createVertex(Eigen::Vector3d(1, 0, 1));
497 auto &v04 = mesh.createVertex(Eigen::Vector3d(1, 1, 1));
499 mesh.createTetrahedron(v00, v01, v02, v03);
500 mesh.createTetrahedron(v04, v01, v02, v03);
504 BOOST_TEST(match.size() == 2);
522 Eigen::Vector3d location(0.2, 0.2, 0.2);
526 auto &v00 = mesh.createVertex(Eigen::Vector3d(0, 0, 0));
527 auto &v01 = mesh.createVertex(Eigen::Vector3d(1, 0, 0));
528 auto &v02 = mesh.createVertex(Eigen::Vector3d(0, 1, 0));
529 auto &v03 = mesh.createVertex(Eigen::Vector3d(0, 0, 1));
530 mesh.createTetrahedron(v00, v01, v02, v03);
533 auto &v10 = mesh.createVertex(Eigen::Vector3d(1, 1, 1));
534 auto &v11 = mesh.createVertex(Eigen::Vector3d(1, 0, 0));
535 auto &v12 = mesh.createVertex(Eigen::Vector3d(0, 1, 0));
536 auto &v13 = mesh.createVertex(Eigen::Vector3d(0, 0, 1));
537 mesh.createTetrahedron(v10, v11, v12, v13);
540 auto &v20 = mesh.createVertex(Eigen::Vector3d(1, 1, 1));
541 auto &v21 = mesh.createVertex(Eigen::Vector3d(2, 1, 1));
542 auto &v22 = mesh.createVertex(Eigen::Vector3d(1, 2, 1));
543 auto &v23 = mesh.createVertex(Eigen::Vector3d(1, 1, 2));
544 mesh.createTetrahedron(v20, v21, v22, v23);
548 BOOST_TEST(match.size() == 2);
549 BOOST_TEST(((match[0] == 0 && match[1] == 1) || (match[0] == 1 && match[1] == 0)));
570 auto &v00 = mesh.createVertex(Eigen::Vector3d(0, 0, 0));
571 auto &v01 = mesh.createVertex(Eigen::Vector3d(1, 0, 0));
572 auto &v02 = mesh.createVertex(Eigen::Vector3d(0, 1, 0));
573 auto &v03 = mesh.createVertex(Eigen::Vector3d(0, 0, 1));
574 mesh.createTetrahedron(v00, v01, v02, v03);
576 for (
const auto &vertex : locations) {
578 BOOST_TEST(match.size() == 1);
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(Query2DVertex)
#define PRECICE_TEST_SETUP(...)
Creates and attaches a TestSetup to a Boost test case.
Linear edge of a mesh, defined by two Vertex objects.
Container and creator for meshes.
Triangle & createTriangle(Edge &edgeOne, Edge &edgeTwo, Edge &edgeThree)
Creates and initializes a Triangle object.
Vertex & vertex(VertexID id)
Mutable access to a vertex by VertexID.
const query::Index & index() const
Call preprocess() before index() to ensure correct projection handling.
void computeBoundingBox()
Computes the boundingBox for the vertices.
TriangleContainer & triangles()
Returns modifiable container holding all triangles.
const BoundingBox & getBoundingBox() const
Returns the bounding box of the mesh.
Edge & createEdge(Vertex &vertexOne, Vertex &vertexTwo)
Creates and initializes an Edge object.
Vertex & createVertex(const Eigen::Ref< const Eigen::VectorXd > &coords)
Creates and initializes a Vertex object.
EdgeContainer & edges()
Returns modifiable container holding all edges.
Triangle of a mesh, defined by three vertices.
VertexID getID() const
Returns the unique (among vertices of one mesh on one processor) ID of the vertex.
Class to query the index trees of the mesh.
mesh::BoundingBox getRtreeBounds()
std::vector< TetrahedronID > getEnclosingTetrahedra(const Eigen::VectorXd &location)
Return all the tetrahedra whose axis-aligned bounding box contains a vertex.
VertexMatch getClosestVertex(const Eigen::VectorXd &sourceCoord)
Get the closest vertex to the given vertex.
ProjectionMatch findNearestProjection(const Eigen::VectorXd &location, int n)
Find the closest interpolation element to the given location. If exists, triangle or edge projection ...
std::vector< TriangleMatch > getClosestTriangles(const Eigen::VectorXd &sourceCoord, int n)
Get n number of closest triangles to the given vertex.
std::vector< VertexID > getVerticesInsideBox(const mesh::Vertex ¢erVertex, double radius)
Return all the vertices inside the box formed by vertex and radius (boundary exclusive)
std::vector< VertexID > getClosestVertices(const Eigen::VectorXd &sourceCoord, int n)
Get n number of closest vertices to the given vertex.
std::vector< EdgeMatch > getClosestEdges(const Eigen::VectorXd &sourceCoord, int n)
Get n number of closest edges to the given vertex.
T emplace_back(T... args)
T is_permutation(T... args)
provides Mesh, Data and primitives.
contains geometrical queries.
Main namespace of the precice library.