preCICE v3.2.0
Loading...
Searching...
No Matches
SerializedStamplesTest.cpp
Go to the documentation of this file.
5#include "mesh/Mesh.hpp"
8#include "testing/Testing.hpp"
10
11using namespace precice;
12using namespace precice::com;
14
15BOOST_AUTO_TEST_SUITE(CommunicationTests)
16
17BOOST_AUTO_TEST_SUITE(SerializedStamples)
18
20BOOST_AUTO_TEST_CASE(SerializeValues)
21{
23 std::vector<int> vertexOffsets{4, 8, 8, 10};
24
25 const int dataDimensions = 1;
26 const int nValues = 4;
27 const int nTimeSteps = 3;
28
29 mesh::PtrMesh dummyMesh(new mesh::Mesh("DummyMesh", 3, testing::nextMeshID()));
30 dummyMesh->setVertexOffsets(vertexOffsets);
31 dummyMesh->createVertex(Eigen::Vector3d{0, 0, 0});
32 dummyMesh->createVertex(Eigen::Vector3d{1, 0, 0});
33 dummyMesh->createVertex(Eigen::Vector3d{2, 0, 0});
34 dummyMesh->createVertex(Eigen::Vector3d{3, 0, 0});
35
36 mesh::PtrData fromData(new mesh::Data("from", -1, dataDimensions));
37 mesh::PtrData toData(new mesh::Data("to", -1, dataDimensions));
38
39 Eigen::VectorXd insert0(nValues);
40 insert0 << 1.0, 2.0, 3.0, 4.0;
41 Eigen::VectorXd insert05(nValues);
42 insert05 << 10.0, 20.0, 30.0, 40.0;
43 Eigen::VectorXd insert1(nValues);
44 insert1 << 100.0, 200.0, 300.0, 400.0;
45
46 cplscheme::PtrCouplingData fromDataPtr = makeCouplingData(fromData, dummyMesh);
47 cplscheme::PtrCouplingData toDataPtr = makeCouplingData(toData, dummyMesh);
48
49 fromDataPtr->setSampleAtTime(0, time::Sample{dataDimensions, insert0});
50 fromDataPtr->setSampleAtTime(0.5, time::Sample{dataDimensions, insert05});
51 fromDataPtr->setSampleAtTime(1, time::Sample{dataDimensions, insert1});
52
53 const auto serialized = serialize::SerializedStamples::serialize(*fromDataPtr);
54
55 Eigen::VectorXd expectedSerialized(nTimeSteps * nValues);
56 expectedSerialized << 1.0, 10.0, 100.0, 2.0, 20.0, 200.0, 3.0, 30.0, 300.0, 4.0, 40.0, 400.0;
57
58 for (int i = 0; i < nTimeSteps * nValues; i++) {
59 BOOST_TEST(testing::equals(serialized.values()(i), expectedSerialized(i)));
60 }
61}
62
64BOOST_AUTO_TEST_CASE(DeserializeValues)
65{
67 std::vector<int> vertexOffsets{4, 8, 8, 10};
68
69 const int nValues = 4;
70 const int dataDimensions = 1;
71 const int nTimeSteps = 3;
72
73 Eigen::VectorXd serializedValues(nTimeSteps * nValues);
74 serializedValues << 1.0, 10.0, 100.0, 2.0, 20.0, 200.0, 3.0, 30.0, 300.0, 4.0, 40.0, 400.0;
75
76 mesh::PtrMesh dummyMesh(new mesh::Mesh("DummyMesh", 3, testing::nextMeshID()));
77 dummyMesh->setVertexOffsets(vertexOffsets);
78 dummyMesh->createVertex(Eigen::Vector3d{0, 0, 0});
79 dummyMesh->createVertex(Eigen::Vector3d{1, 0, 0});
80 dummyMesh->createVertex(Eigen::Vector3d{2, 0, 0});
81 dummyMesh->createVertex(Eigen::Vector3d{3, 0, 0});
82
83 mesh::PtrData toData(new mesh::Data("to", -1, dataDimensions));
84 cplscheme::PtrCouplingData toDataPtr = makeCouplingData(toData, dummyMesh);
85
86 Eigen::VectorXd initValues(nValues);
87 initValues.setZero();
88
89 toDataPtr->setSampleAtTime(0, time::Sample(toDataPtr->getDimensions(), initValues));
90
91 Eigen::VectorXd timeStamps(nTimeSteps);
92 timeStamps << 0, 0.5, 1;
93
94 auto serialized = serialize::SerializedStamples::empty(timeStamps.size(), *toDataPtr);
95
96 serialized.values() = serializedValues;
97
98 serialized.deserializeInto(timeStamps, *toDataPtr);
99
100 std::vector<Eigen::VectorXd> expectedValues;
101
102 Eigen::VectorXd insert0(nValues);
103 insert0 << 1.0, 2.0, 3.0, 4.0;
104 Eigen::VectorXd insert05(nValues);
105 insert05 << 10.0, 20.0, 30.0, 40.0;
106 Eigen::VectorXd insert1(nValues);
107 insert1 << 100.0, 200.0, 300.0, 400.0;
108
109 expectedValues.push_back(insert0);
110 expectedValues.push_back(insert05);
111 expectedValues.push_back(insert1);
112
113 BOOST_TEST(toDataPtr->timeStepsStorage().stamples().size() == nTimeSteps);
114 for (int t = 0; t < nTimeSteps; t++) {
115 BOOST_TEST(testing::equals(toDataPtr->timeStepsStorage().stamples()[t].timestamp, timeStamps[t]));
116 for (int i = 0; i < nValues; i++) {
117 BOOST_TEST(testing::equals(toDataPtr->timeStepsStorage().stamples()[t].sample.values(i), expectedValues[t](i)));
118 }
119 }
120}
121
122PRECICE_TEST_SETUP(1_rank)
123BOOST_AUTO_TEST_CASE(SerializeValuesAndGradients)
124{
125 PRECICE_TEST();
126 std::vector<int> vertexOffsets{4, 8, 8, 10};
127
128 const int meshDimensions = 3;
129 const int dataDimensions = 1;
130 const int nValues = 4;
131 const int nTimeSteps = 3;
132
133 mesh::PtrMesh dummyMesh(new mesh::Mesh("DummyMesh", meshDimensions, testing::nextMeshID()));
134 dummyMesh->setVertexOffsets(vertexOffsets);
135 dummyMesh->createVertex(Eigen::Vector3d{0, 0, 0});
136 dummyMesh->createVertex(Eigen::Vector3d{1, 0, 0});
137 dummyMesh->createVertex(Eigen::Vector3d{2, 0, 0});
138 dummyMesh->createVertex(Eigen::Vector3d{3, 0, 0});
139
140 mesh::PtrData fromData(new mesh::Data("from", -1, dataDimensions));
141 fromData->requireDataGradient();
142
143 Eigen::VectorXd insert0(nValues);
144 insert0 << 1.0, 2.0, 3.0, 4.0;
145 Eigen::VectorXd insert05(nValues);
146 insert05 << 10.0, 20.0, 30.0, 40.0;
147 Eigen::VectorXd insert1(nValues);
148 insert1 << 100.0, 200.0, 300.0, 400.0;
149 Eigen::MatrixXd insertGradients0(meshDimensions, nValues * dataDimensions);
150 insertGradients0 << 10.0, 20.0, 30.0, 40.0,
151 11.0, 21.0, 31.0, 41.0,
152 12.0, 22.0, 32.0, 42.0;
153 Eigen::MatrixXd insertGradients05(meshDimensions, nValues * dataDimensions);
154 insertGradients05 << 100.0, 200.0, 300.0, 400.0,
155 101.0, 201.0, 301.0, 401.0,
156 102.0, 202.0, 302.0, 402.0;
157 Eigen::MatrixXd insertGradients1(meshDimensions, nValues * dataDimensions);
158 insertGradients1 << 1000.0, 2000.0, 3000.0, 4000.0,
159 1001.0, 2001.0, 3001.0, 4001.0,
160 1002.0, 2002.0, 3002.0, 4002.0;
161
162 cplscheme::PtrCouplingData fromDataPtr = makeCouplingData(fromData, dummyMesh);
163
164 fromDataPtr->setSampleAtTime(0, time::Sample{dataDimensions, insert0, insertGradients0});
165 fromDataPtr->setSampleAtTime(0.5, time::Sample{dataDimensions, insert05, insertGradients05});
166 fromDataPtr->setSampleAtTime(1, time::Sample{dataDimensions, insert1, insertGradients1});
167
168 const auto serialized = serialize::SerializedStamples::serialize(*fromDataPtr);
169
170 Eigen::VectorXd expectedSerializedValues(nTimeSteps * nValues);
171 expectedSerializedValues << 1.0, 10.0, 100.0, 2.0, 20.0, 200.0, 3.0, 30.0, 300.0, 4.0, 40.0, 400.0;
172
173 Eigen::VectorXd expectedSerializedGradients(nTimeSteps * nValues * meshDimensions);
174 expectedSerializedGradients << 10.0, 100.0, 1000.0, 11.0, 101.0, 1001.0, 12.0, 102.0, 1002.0,
175 20.0, 200.0, 2000.0, 21.0, 201.0, 2001.0, 22.0, 202.0, 2002.0,
176 30.0, 300.0, 3000.0, 31.0, 301.0, 3001.0, 32.0, 302.0, 3002.0,
177 40.0, 400.0, 4000.0, 41.0, 401.0, 4001.0, 42.0, 402.0, 4002.0;
178
179 for (int i = 0; i < nTimeSteps * nValues; i++) {
180 BOOST_TEST(testing::equals(serialized.values()(i), expectedSerializedValues(i)));
181 }
182
183 for (int i = 0; i < nTimeSteps * meshDimensions * nValues; i++) {
184 BOOST_TEST(testing::equals(serialized.gradients()(i), expectedSerializedGradients(i)));
185 }
186}
187
188PRECICE_TEST_SETUP(1_rank)
189BOOST_AUTO_TEST_CASE(DeserializeValuesAndGradients)
190{
191 PRECICE_TEST();
192 std::vector<int> vertexOffsets{4, 8, 8, 10};
193
194 const int meshDimensions = 3;
195 const int nValues = 4;
196 const int dataDimensions = 1;
197 const int nTimeSteps = 3;
198
199 Eigen::VectorXd serializedValues(nTimeSteps * nValues);
200 serializedValues << 1.0, 10.0, 100.0, 2.0, 20.0, 200.0, 3.0, 30.0, 300.0, 4.0, 40.0, 400.0;
201
202 Eigen::VectorXd serializedGradients(nTimeSteps * nValues * meshDimensions);
203 serializedGradients << 10.0, 100.0, 1000.0, 11.0, 101.0, 1001.0, 12.0, 102.0, 1002.0,
204 20.0, 200.0, 2000.0, 21.0, 201.0, 2001.0, 22.0, 202.0, 2002.0,
205 30.0, 300.0, 3000.0, 31.0, 301.0, 3001.0, 32.0, 302.0, 3002.0,
206 40.0, 400.0, 4000.0, 41.0, 401.0, 4001.0, 42.0, 402.0, 4002.0;
207
208 mesh::PtrMesh dummyMesh(new mesh::Mesh("DummyMesh", 3, testing::nextMeshID()));
209 dummyMesh->setVertexOffsets(vertexOffsets);
210 dummyMesh->createVertex(Eigen::Vector3d{0, 0, 0});
211 dummyMesh->createVertex(Eigen::Vector3d{1, 0, 0});
212 dummyMesh->createVertex(Eigen::Vector3d{2, 0, 0});
213 dummyMesh->createVertex(Eigen::Vector3d{3, 0, 0});
214
215 mesh::PtrData toData(new mesh::Data("to", -1, dataDimensions));
216 toData->requireDataGradient();
217
218 cplscheme::PtrCouplingData toDataPtr = makeCouplingData(toData, dummyMesh);
219
220 Eigen::VectorXd initValues(nValues);
221 initValues.setZero();
222
223 Eigen::MatrixXd initGradients(meshDimensions, nValues * dataDimensions);
224 initGradients.setZero();
225
226 toDataPtr->setSampleAtTime(0, time::Sample(toDataPtr->getDimensions(), initValues, initGradients));
227
228 Eigen::VectorXd timeStamps(nTimeSteps);
229 timeStamps << 0, 0.5, 1;
230
231 auto serialized = serialize::SerializedStamples::empty(timeStamps.size(), *toDataPtr);
232
233 serialized.values() = serializedValues;
234 serialized.gradients() = serializedGradients;
235
236 serialized.deserializeInto(timeStamps, *toDataPtr);
237
238 std::vector<Eigen::VectorXd> expectedValues;
239
240 Eigen::VectorXd insert0(nValues);
241 insert0 << 1.0, 2.0, 3.0, 4.0;
242 Eigen::VectorXd insert05(nValues);
243 insert05 << 10.0, 20.0, 30.0, 40.0;
244 Eigen::VectorXd insert1(nValues);
245 insert1 << 100.0, 200.0, 300.0, 400.0;
246
247 expectedValues.push_back(insert0);
248 expectedValues.push_back(insert05);
249 expectedValues.push_back(insert1);
250
251 std::vector<Eigen::MatrixXd> expectedGradients;
252
253 Eigen::MatrixXd insertGradients0(meshDimensions, dataDimensions * nValues);
254 insertGradients0 << 10.0, 20.0, 30.0, 40.0,
255 11.0, 21.0, 31.0, 41.0,
256 12.0, 22.0, 32.0, 42.0;
257 Eigen::MatrixXd insertGradients05(meshDimensions, nValues * dataDimensions);
258 insertGradients05 << 100.0, 200.0, 300.0, 400.0,
259 101.0, 201.0, 301.0, 401.0,
260 102.0, 202.0, 302.0, 402.0;
261 Eigen::MatrixXd insertGradients1(meshDimensions, nValues * dataDimensions);
262 insertGradients1 << 1000.0, 2000.0, 3000.0, 4000.0,
263 1001.0, 2001.0, 3001.0, 4001.0,
264 1002.0, 2002.0, 3002.0, 4002.0;
265
266 expectedGradients.push_back(insertGradients0);
267 expectedGradients.push_back(insertGradients05);
268 expectedGradients.push_back(insertGradients1);
269
270 BOOST_TEST(toDataPtr->timeStepsStorage().stamples().size() == nTimeSteps);
271 for (int t = 0; t < nTimeSteps; t++) {
272 BOOST_TEST(testing::equals(toDataPtr->timeStepsStorage().stamples()[t].timestamp, timeStamps[t]));
273 for (int i = 0; i < nValues; i++) {
274 BOOST_TEST(testing::equals(toDataPtr->timeStepsStorage().stamples()[t].sample.values(i), expectedValues[t](i)));
275 }
276 for (int i = 0; i < meshDimensions * nValues; i++) {
277 BOOST_TEST(testing::equals(toDataPtr->timeStepsStorage().stamples()[t].sample.gradients(i), expectedGradients[t](i)));
278 }
279 }
280}
281
282BOOST_AUTO_TEST_SUITE_END() // SerializedStamples
283BOOST_AUTO_TEST_SUITE_END() // CommunicationTests
BOOST_AUTO_TEST_CASE(testIQNIMVJPPWithSubsteps)
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
cplscheme::PtrCouplingData makeCouplingData(mesh::PtrData data, mesh::PtrMesh mesh, bool exchangeSubsteps)
Definition helper.hpp:10
#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
static SerializedStamples serialize(const cplscheme::CouplingData &data)
Serializes a given CouplingData into SerializedStamples.
static SerializedStamples empty(int nTimeSteps, const cplscheme::CouplingData &data)
Create SerializedStamples with allocated buffers according to size of CouplingData.
Describes a set of data values belonging to the vertices of a mesh.
Definition Data.hpp:27
Container and creator for meshes.
Definition Mesh.hpp:38
contains the data communication abstraction layer.
std::shared_ptr< CouplingData > PtrCouplingData
std::shared_ptr< Data > PtrData
std::shared_ptr< Mesh > PtrMesh
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
cplscheme::PtrCouplingData makeCouplingData(mesh::PtrData data, mesh::PtrMesh mesh, bool exchangeSubsteps)
Definition helper.hpp:10
Main namespace of the precice library.
T push_back(T... args)