preCICE v3.2.0
Loading...
Searching...
No Matches
CommunicateMeshTest.cpp
Go to the documentation of this file.
1#ifndef PRECICE_NO_MPI
2
3#include <Eigen/Core>
4#include <algorithm>
5#include <memory>
6#include "com/Extra.hpp"
8#include "m2n/M2N.hpp"
9#include "mesh/Mesh.hpp"
11#include "testing/Testing.hpp"
12#include "utils/IntraComm.hpp"
13
14namespace precice::mesh {
15class Edge;
16class Triangle;
17class Vertex;
18} // namespace precice::mesh
19
20using namespace precice;
21using namespace precice::com;
22
23BOOST_AUTO_TEST_SUITE(CommunicationTests)
24
25BOOST_AUTO_TEST_SUITE(MeshTests)
26
27PRECICE_TEST_SETUP("A"_on(1_rank), "B"_on(1_rank), Require::Events)
28BOOST_AUTO_TEST_CASE(VertexEdgeMesh)
29{
31 auto m2n = context.connectPrimaryRanks("A", "B");
32
33 for (int dim = 2; dim <= 3; dim++) {
34 mesh::Mesh sendMesh("Sent Mesh", dim, testing::nextMeshID());
35 mesh::Vertex &v0 = sendMesh.createVertex(Eigen::VectorXd::Constant(dim, 0));
36 mesh::Vertex &v1 = sendMesh.createVertex(Eigen::VectorXd::Constant(dim, 1));
37 mesh::Vertex &v2 = sendMesh.createVertex(Eigen::VectorXd::Constant(dim, 2));
38 mesh::Edge &e0 = sendMesh.createEdge(v0, v1);
39 mesh::Edge &e1 = sendMesh.createEdge(v1, v2);
40 mesh::Edge &e2 = sendMesh.createEdge(v2, v0);
41
42 auto &comm = *m2n->getPrimaryRankCommunication();
43
44 if (context.isNamed("A")) {
45 com::sendMesh(comm, 0, sendMesh);
46 } else {
47 // receiveMesh can also deal with delta meshes
48 mesh::Mesh recvMesh("Received Mesh", dim, testing::nextMeshID());
49 recvMesh.createVertex(Eigen::VectorXd::Constant(dim, 9));
50 com::receiveMesh(comm, 0, recvMesh);
51 BOOST_TEST(recvMesh.nVertices() == 4);
52 BOOST_TEST(testing::equals(recvMesh.vertex(0).getCoords(), Eigen::VectorXd::Constant(dim, 9)));
53 BOOST_TEST(recvMesh.vertex(1) == v0);
54 BOOST_TEST(recvMesh.vertex(2) == v1);
55 BOOST_TEST(recvMesh.vertex(3) == v2);
56 BOOST_TEST(recvMesh.edges().at(0) == e0);
57 BOOST_TEST(recvMesh.edges().at(1) == e1);
58 BOOST_TEST(recvMesh.edges().at(2) == e2);
59 }
60 }
61}
62
63PRECICE_TEST_SETUP("A"_on(1_rank), "B"_on(1_rank), Require::Events)
64BOOST_AUTO_TEST_CASE(VertexEdgeTriangleMesh)
65{
67 auto m2n = context.connectPrimaryRanks("A", "B");
68
69 int dim = 3;
70 mesh::Mesh sendMesh("Sent Mesh", dim, testing::nextMeshID());
71 mesh::Vertex &v0 = sendMesh.createVertex(Eigen::VectorXd::Constant(dim, 0));
72 mesh::Vertex &v1 = sendMesh.createVertex(Eigen::VectorXd::Constant(dim, 1));
73 mesh::Vertex &v2 = sendMesh.createVertex(Eigen::VectorXd::Constant(dim, 2));
74 mesh::Edge &e0 = sendMesh.createEdge(v0, v1);
75 mesh::Edge &e1 = sendMesh.createEdge(v1, v2);
76 mesh::Edge &e2 = sendMesh.createEdge(v2, v0);
77 mesh::Triangle &t0 = sendMesh.createTriangle(e0, e1, e2);
78
79 // Create mesh communicator
80 auto &comm = *m2n->getPrimaryRankCommunication();
81
82 if (context.isNamed("A")) {
83 com::sendMesh(comm, 0, sendMesh);
84 } else {
85 mesh::Mesh recvMesh("Received Mesh", dim, testing::nextMeshID());
86 // receiveMesh can also deal with delta meshes
87 recvMesh.createVertex(Eigen::VectorXd::Constant(dim, 9));
88 com::receiveMesh(comm, 0, recvMesh);
89 BOOST_TEST(recvMesh.nVertices() == 4);
90 BOOST_TEST(testing::equals(recvMesh.vertex(0).getCoords(), Eigen::VectorXd::Constant(dim, 9)));
91 BOOST_TEST(recvMesh.vertex(1) == v0);
92 BOOST_TEST(recvMesh.vertex(2) == v1);
93 BOOST_TEST(recvMesh.vertex(3) == v2);
94 BOOST_TEST(recvMesh.edges().at(0) == e0);
95 BOOST_TEST(recvMesh.edges().at(1) == e1);
96 BOOST_TEST(recvMesh.edges().at(2) == e2);
97
98 BOOST_TEST(recvMesh.triangles().at(0) == t0);
99 }
100}
101
102PRECICE_TEST_SETUP(""_on(2_ranks).setupIntraComm(), Require::Events)
103BOOST_AUTO_TEST_CASE(BroadcastVertexEdgeTriangleMesh)
104{
105 PRECICE_TEST();
106
107 int dim = 3;
108 mesh::Mesh sendMesh("Sent Mesh", dim, testing::nextMeshID());
109 mesh::Vertex &v0 = sendMesh.createVertex(Eigen::VectorXd::Constant(dim, 0));
110 mesh::Vertex &v1 = sendMesh.createVertex(Eigen::VectorXd::Constant(dim, 1));
111 mesh::Vertex &v2 = sendMesh.createVertex(Eigen::VectorXd::Constant(dim, 2));
112 mesh::Edge &e0 = sendMesh.createEdge(v0, v1);
113 mesh::Edge &e1 = sendMesh.createEdge(v1, v2);
114 mesh::Edge &e2 = sendMesh.createEdge(v2, v0);
115 mesh::Triangle &t0 = sendMesh.createTriangle(e0, e1, e2);
116
117 // Create mesh communicator
119
120 if (context.isPrimary()) {
122 } else {
123 mesh::Mesh recvMesh("Received Mesh", dim, testing::nextMeshID());
124 // receiveMesh can also deal with delta meshes
125 recvMesh.createVertex(Eigen::VectorXd::Constant(dim, 9));
126 com::broadcastReceiveMesh(comm, recvMesh);
127 BOOST_TEST(recvMesh.nVertices() == 4);
128 BOOST_TEST(testing::equals(recvMesh.vertex(0).getCoords(), Eigen::VectorXd::Constant(dim, 9)));
129 BOOST_TEST(recvMesh.vertex(1) == v0);
130 BOOST_TEST(recvMesh.vertex(2) == v1);
131 BOOST_TEST(recvMesh.vertex(3) == v2);
132 BOOST_TEST(recvMesh.edges().at(0) == e0);
133 BOOST_TEST(recvMesh.edges().at(1) == e1);
134 BOOST_TEST(recvMesh.edges().at(2) == e2);
135 BOOST_TEST(recvMesh.triangles().at(0) == t0);
136 }
137}
138
139PRECICE_TEST_SETUP("A"_on(1_rank), "B"_on(1_rank), Require::Events)
140BOOST_AUTO_TEST_CASE(OneTetraCommunication)
141{
142 PRECICE_TEST();
143 auto m2n = context.connectPrimaryRanks("A", "B");
144
145 int dim = 3;
146 mesh::Mesh sendMesh("Sent Mesh", dim, testing::nextMeshID());
147 mesh::Vertex &v0 = sendMesh.createVertex(Eigen::Vector3d{0.0, 0.0, 0.0});
148 mesh::Vertex &v1 = sendMesh.createVertex(Eigen::Vector3d{1.0, 0.0, 0.0});
149 mesh::Vertex &v2 = sendMesh.createVertex(Eigen::Vector3d{0.0, 1.0, 0.0});
150 mesh::Vertex &v3 = sendMesh.createVertex(Eigen::Vector3d{0.0, 0.0, 1.0});
151
152 mesh::Tetrahedron &t0 = sendMesh.createTetrahedron(v0, v1, v2, v3);
153
154 // Create mesh communicator
155 auto &comm = *m2n->getPrimaryRankCommunication();
156
157 if (context.isNamed("A")) {
158 com::sendMesh(comm, 0, sendMesh);
159 } else {
160 mesh::Mesh recvMesh("Received Mesh", dim, testing::nextMeshID());
161 // receiveMesh can also deal with delta meshes
162 recvMesh.createVertex(Eigen::VectorXd::Constant(dim, 9));
163 com::receiveMesh(comm, 0, recvMesh);
164 BOOST_TEST(recvMesh.nVertices() == 5); // 4 + 1
165 BOOST_TEST(testing::equals(recvMesh.vertex(0).getCoords(), Eigen::VectorXd::Constant(dim, 9)));
166 BOOST_TEST(recvMesh.tetrahedra().size() == 1);
167 BOOST_TEST(testing::equals(recvMesh.tetrahedra()[0].vertex(0).getCoords(), Eigen::Vector3d{0.0, 0.0, 0.0}));
168 BOOST_TEST(recvMesh.tetrahedra()[0] == t0);
169 }
170}
171
172PRECICE_TEST_SETUP(""_on(2_ranks).setupIntraComm(), Require::Events)
173BOOST_AUTO_TEST_CASE(BroadcastTetra)
174{
175 PRECICE_TEST();
176
177 int dim = 3;
178 mesh::Mesh sendMesh("Sent Mesh", dim, testing::nextMeshID());
179 mesh::Vertex &v0 = sendMesh.createVertex(Eigen::Vector3d{0.0, 0.0, 0.0});
180 mesh::Vertex &v1 = sendMesh.createVertex(Eigen::Vector3d{1.0, 0.0, 0.0});
181 mesh::Vertex &v2 = sendMesh.createVertex(Eigen::Vector3d{0.0, 1.0, 0.0});
182 mesh::Vertex &v3 = sendMesh.createVertex(Eigen::Vector3d{0.0, 0.0, 1.0});
183
184 mesh::Tetrahedron &t0 = sendMesh.createTetrahedron(v0, v1, v2, v3);
185
186 // Create mesh communicator
188
189 if (context.isPrimary()) {
191 } else {
192 mesh::Mesh recvMesh("Received Mesh", dim, testing::nextMeshID());
193 // receiveMesh can also deal with delta meshes
194 recvMesh.createVertex(Eigen::VectorXd::Constant(dim, 9));
195 com::broadcastReceiveMesh(comm, recvMesh);
196 BOOST_TEST(recvMesh.nVertices() == 5); // 4 + 1
197 BOOST_TEST(testing::equals(recvMesh.vertex(0).getCoords(), Eigen::VectorXd::Constant(dim, 9)));
198 BOOST_TEST(recvMesh.tetrahedra().size() == 1);
199 BOOST_TEST(testing::equals(recvMesh.tetrahedra()[0].vertex(0).getCoords(), Eigen::Vector3d{0.0, 0.0, 0.0}));
200 BOOST_TEST(recvMesh.tetrahedra()[0] == t0);
201 }
202}
203
205BOOST_AUTO_TEST_SUITE_END() // Communication
206
207#endif // not PRECICE_NO_MPI
BOOST_AUTO_TEST_CASE(testIQNIMVJPPWithSubsteps)
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
#define PRECICE_TEST()
Definition Testing.hpp:39
#define PRECICE_TEST_SETUP(...)
Creates and attaches a TestSetup to a Boost test case.
Definition Testing.hpp:29
T at(T... args)
Linear edge of a mesh, defined by two Vertex objects.
Definition Edge.hpp:15
Container and creator for meshes.
Definition Mesh.hpp:38
std::size_t nVertices() const
Returns the number of vertices.
Definition Mesh.cpp:65
Vertex & vertex(VertexID id)
Mutable access to a vertex by VertexID.
Definition Mesh.cpp:43
TriangleContainer & triangles()
Returns modifiable container holding all triangles.
Definition Mesh.cpp:80
Vertex & createVertex(const Eigen::Ref< const Eigen::VectorXd > &coords)
Creates and initializes a Vertex object.
Definition Mesh.cpp:105
EdgeContainer & edges()
Returns modifiable container holding all edges.
Definition Mesh.cpp:70
Tetrahedron of a mesh, defined by 4 vertices.
Triangle of a mesh, defined by three vertices.
Definition Triangle.hpp:24
Vertex of a mesh.
Definition Vertex.hpp:16
Eigen::VectorXd getCoords() const
Returns the coordinates of the vertex.
Definition Vertex.hpp:114
static com::PtrCommunication & getCommunication()
Intra-participant communication.
Definition IntraComm.hpp:31
contains the data communication abstraction layer.
void sendMesh(Communication &communication, int rankReceiver, const mesh::Mesh &mesh)
Definition Extra.cpp:8
void broadcastSendMesh(Communication &communication, const mesh::Mesh &mesh)
Definition Extra.cpp:18
void broadcastReceiveMesh(Communication &communication, mesh::Mesh &mesh)
Definition Extra.cpp:23
void receiveMesh(Communication &communication, int rankSender, mesh::Mesh &mesh)
Definition Extra.cpp:13
contains the logic of the parallel communication between participants.
Definition BoundM2N.cpp:12
provides Mesh, Data and primitives.
@ Events
Require to initialize Event.
boost::test_tools::predicate_result equals(const std::vector< float > &VectorA, const std::vector< float > &VectorB, float tolerance)
equals to be used in tests. Compares two std::vectors using a given tolerance. Prints both operands o...
Definition Testing.cpp:93
Main namespace of the precice library.