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();
101 Eigen::Vector2d location(0.2, 0.8);
104 BOOST_TEST(
mesh->vertex(result.index).getCoords() == Eigen::Vector2d(0, 1));
111 auto mesh = edgeMesh3D();
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));
134 auto &ell =
mesh->createEdge(v00, v01);
135 auto &elt =
mesh->createEdge(v01, v11);
136 auto &elr =
mesh->createEdge(v11, v10);
137 auto &elb =
mesh->createEdge(v10, v00);
138 auto &eld =
mesh->createEdge(v00, v11);
140 auto &ert =
mesh->createEdge(v11, v21);
141 auto &err =
mesh->createEdge(v21, v20);
142 auto &erb =
mesh->createEdge(v20, v10);
143 auto &erd =
mesh->createEdge(v10, v21);
144 mesh->createTriangle(ell, elt, eld);
145 mesh->createTriangle(eld, elb, elr);
146 mesh->createTriangle(erl, ert, erd);
147 mesh->createTriangle(erd, erb, err);
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();
183 mesh::Vertex searchVertex(Eigen::Vector3d(0.8, 1, 0), 0);
187 BOOST_TEST(results.empty());
195 auto mesh = vertexMesh3D();
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();
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));
255 mesh->createVertex(Eigen::Vector3d(7, 4, 3.3));
256 mesh->createVertex(Eigen::Vector3d(26.4777, 5, 8));
257 mesh->createVertex(Eigen::Vector3d(-23.4, 100000.2, 7));
258 mesh->createVertex(Eigen::Vector3d(0.211, -21.37, 0.00003));
259 auto result =
mesh->index().getRtreeBounds();
260 mesh->computeBoundingBox();
261 auto comparison =
mesh->getBoundingBox();
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();
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();
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));
326 auto &ell =
mesh->createEdge(v00, v01);
327 auto &elt =
mesh->createEdge(v01, v11);
328 auto &elr =
mesh->createEdge(v11, v10);
329 auto &elb =
mesh->createEdge(v10, v00);
330 auto &eld =
mesh->createEdge(v00, v11);
332 auto &ert =
mesh->createEdge(v11, v21);
333 auto &err =
mesh->createEdge(v21, v20);
334 auto &erb =
mesh->createEdge(v20, v10);
335 auto &erd =
mesh->createEdge(v10, v21);
336 mesh->createTriangle(ell, elt, eld);
337 mesh->createTriangle(eld, elb, elr);
338 mesh->createTriangle(erl, ert, erd);
339 mesh->createTriangle(erd, erb, err);
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));
373 auto &ell =
mesh->createEdge(v00, v01);
374 auto &elt =
mesh->createEdge(v01, v11);
375 auto &elr =
mesh->createEdge(v11, v10);
376 auto &elb =
mesh->createEdge(v10, v00);
377 auto &eld =
mesh->createEdge(v00, v11);
379 auto &ert =
mesh->createEdge(v11, v21);
380 auto &err =
mesh->createEdge(v21, v20);
381 auto &erb =
mesh->createEdge(v20, v10);
382 auto &erd =
mesh->createEdge(v10, v21);
383 auto &tlt =
mesh->createTriangle(ell, elt, eld);
384 auto &tlb =
mesh->createTriangle(eld, elb, elr);
385 auto &trt =
mesh->createTriangle(erl, ert, erd);
386 mesh->createTriangle(erd, erb, err);
390 Eigen::Vector3d location(0.7, 0.5, 0.0);
393 BOOST_TEST(results.size() == 3);
396 &
mesh->triangles().at(results.at(0).index),
397 &
mesh->triangles().at(results.at(1).index),
398 &
mesh->triangles().at(results.at(2).index)};
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));
488 Index indexTree(ptr);
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);
520 Index indexTree(ptr);
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)));
561 Index indexTree(ptr);
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_CASE(testIQNIMVJPPWithSubsteps)
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
#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 of a mesh, defined by three vertices.
Class to query the index trees of the mesh.
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.
std::shared_ptr< Mesh > PtrMesh
contains geometrical queries.
Main namespace of the precice library.