preCICE v3.2.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SummationActionTest.cpp
Go to the documentation of this file.
1#include <Eigen/Core>
2#include <algorithm>
3#include <list>
4#include <memory>
5#include <string>
6#include <vector>
7#include "action/Action.hpp"
11#include "logging/Logger.hpp"
12#include "mesh/Data.hpp"
13#include "mesh/Mesh.hpp"
18#include "testing/Testing.hpp"
19#include "xml/XMLTag.hpp"
20
21using namespace precice;
22
23BOOST_AUTO_TEST_SUITE(ActionTests)
24BOOST_AUTO_TEST_SUITE(Summation)
25
27BOOST_AUTO_TEST_CASE(SummationOneDimensional)
28{
30 using namespace mesh;
31 PtrMesh mesh(new Mesh("Mesh", 3, testing::nextMeshID()));
32 int dimensions = 1;
33 PtrData sourceData1 = mesh->createData("SourceData1", dimensions, 0_dataID);
34 PtrData sourceData2 = mesh->createData("SourceData2", dimensions, 1_dataID);
35 PtrData sourceData3 = mesh->createData("SourceData3", dimensions, 2_dataID);
36 PtrData targetData = mesh->createData("TargetData", dimensions, 3_dataID);
37 std::vector<int> sourceDataIDs{sourceData1->getID(), sourceData2->getID(), sourceData3->getID()};
38 int targetDataID = targetData->getID();
39 mesh->createVertex(Eigen::Vector3d::Constant(0.0));
40 mesh->createVertex(Eigen::Vector3d::Constant(1.0));
41 mesh->createVertex(Eigen::Vector3d::Constant(2.0));
42
43 mesh->allocateDataValues();
44
45 Eigen::VectorXd v1(3), v2(3), v3(3);
46 v1 << 2.0, 3.0, 4.0;
47 v2 << 1.0, 2.0, 3.0;
48 v3 << 2.0, 3.0, 4.0;
49 sourceData1->setSampleAtTime(0, time::Sample{dimensions, v1});
50 sourceData2->setSampleAtTime(0, time::Sample{dimensions, v2});
51 sourceData3->setSampleAtTime(0, time::Sample{dimensions, v3});
52 // targetData->setSampleAtTime(0, time::Sample{dimensions,Eigen::VectorXd::Zero(targetValues.size())});
53
55 action::SummationAction::WRITE_MAPPING_POST, sourceDataIDs, targetDataID, mesh);
56
57 sum.performAction();
58
59 const auto &sourceValues1 = sourceData1->values();
60 const auto &sourceValues2 = sourceData2->values();
61 const auto &sourceValues3 = sourceData3->values();
62 const auto &targetValues = targetData->values();
63 BOOST_TEST(sourceValues1(0) == 2.0);
64 BOOST_TEST(sourceValues1(1) == 3.0);
65 BOOST_TEST(sourceValues1(2) == 4.0);
66 BOOST_TEST(sourceValues2(0) == 1.0);
67 BOOST_TEST(sourceValues2(1) == 2.0);
68 BOOST_TEST(sourceValues2(2) == 3.0);
69 BOOST_TEST(sourceValues3(0) == 2.0);
70 BOOST_TEST(sourceValues3(1) == 3.0);
71 BOOST_TEST(sourceValues3(2) == 4.0);
72 BOOST_TEST(targetValues(0) == 5.0);
73 BOOST_TEST(targetValues(1) == 8.0);
74 BOOST_TEST(targetValues(2) == 11.0);
75}
76
78BOOST_AUTO_TEST_CASE(SummationThreeDimensional)
79{
81 using namespace mesh;
82 int dimensions = 3;
83 PtrMesh mesh(new Mesh("Mesh", dimensions, testing::nextMeshID()));
84 PtrData sourceData1 = mesh->createData("SourceData1", dimensions, 0_dataID);
85 PtrData sourceData2 = mesh->createData("SourceData2", dimensions, 1_dataID);
86 PtrData targetData = mesh->createData("TargetData", dimensions, 2_dataID);
87 std::vector<int> sourceDataIDs{sourceData1->getID(), sourceData2->getID()};
88 int targetDataID = targetData->getID();
89 mesh->createVertex(Eigen::Vector3d::Constant(0.0));
90 mesh->createVertex(Eigen::Vector3d::Constant(1.0));
91 mesh->createVertex(Eigen::Vector3d::Constant(2.0));
92 mesh->allocateDataValues();
93
94 Eigen::VectorXd v1(9), v2(9);
95 v1 << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0;
96 v2 << 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0;
97
98 sourceData1->setSampleAtTime(0, time::Sample{dimensions, v1});
99 sourceData2->setSampleAtTime(0, time::Sample{dimensions, v2});
100 // targetData->setSampleAtTime(0, time::Sample{dimensions,Eigen::VectorXd::Zero(targetValues.size())})
101
103 action::SummationAction::WRITE_MAPPING_POST, sourceDataIDs, targetDataID, mesh);
104
105 sum.performAction();
106
107 const auto &sourceValues1 = sourceData1->values();
108 const auto &sourceValues2 = sourceData2->values();
109 const auto &targetValues = targetData->values();
110 BOOST_TEST(sourceValues1(0) == 1.0);
111 BOOST_TEST(sourceValues2(0) == 2.0);
112 BOOST_TEST(targetValues(0) == 3.0);
113
114 BOOST_TEST(sourceValues1(1) == 2.0);
115 BOOST_TEST(sourceValues2(1) == 3.0);
116 BOOST_TEST(targetValues(1) == 5.0);
117
118 BOOST_TEST(sourceValues1(2) == 3.0);
119 BOOST_TEST(sourceValues2(2) == 4.0);
120 BOOST_TEST(targetValues(2) == 7.0);
121
122 BOOST_TEST(sourceValues1(3) == 4.0);
123 BOOST_TEST(sourceValues2(3) == 5.0);
124 BOOST_TEST(targetValues(3) == 9.0);
125
126 BOOST_TEST(sourceValues1(4) == 5.0);
127 BOOST_TEST(sourceValues2(4) == 6.0);
128 BOOST_TEST(targetValues(4) == 11.0);
129
130 BOOST_TEST(sourceValues1(5) == 6.0);
131 BOOST_TEST(sourceValues2(5) == 7.0);
132 BOOST_TEST(targetValues(5) == 13.0);
133
134 BOOST_TEST(sourceValues1(6) == 7.0);
135 BOOST_TEST(sourceValues2(6) == 8.0);
136 BOOST_TEST(targetValues(6) == 15.0);
137
138 BOOST_TEST(sourceValues1(7) == 8.0);
139 BOOST_TEST(sourceValues2(7) == 9.0);
140 BOOST_TEST(targetValues(7) == 17.0);
141
142 BOOST_TEST(sourceValues1(8) == 9.0);
143 BOOST_TEST(sourceValues2(8) == 10.0);
144 BOOST_TEST(targetValues(8) == 19.0);
145}
146
147PRECICE_TEST_SETUP(1_rank)
148BOOST_AUTO_TEST_CASE(SummationThreeDimensionalSubcycling)
149{
150 PRECICE_TEST();
151 using namespace mesh;
152 int dimensions = 3;
153 PtrMesh mesh(new Mesh("Mesh", dimensions, testing::nextMeshID()));
154 PtrData sourceData1 = mesh->createData("SourceData1", dimensions, 0_dataID);
155 PtrData sourceData2 = mesh->createData("SourceData2", dimensions, 1_dataID);
156 PtrData targetData = mesh->createData("TargetData", dimensions, 2_dataID);
157 std::vector<int> sourceDataIDs{sourceData1->getID(), sourceData2->getID()};
158 int targetDataID = targetData->getID();
159 mesh->createVertex(Eigen::Vector3d::Constant(0.0));
160 mesh->createVertex(Eigen::Vector3d::Constant(1.0));
161 mesh->createVertex(Eigen::Vector3d::Constant(2.0));
162 mesh->allocateDataValues();
163
164 Eigen::VectorXd v1_05(9), v2_05(9), v1_1(9), v2_1(9);
165 v1_05 << 11.0, 22.0, 33.0, 44.0, 55.0, 66.0, 77.0, 88.0, 99.0;
166 v2_05 << 12.0, 23.0, 34.0, 45.0, 56.0, 67.0, 78.0, 89.0, 910.0;
167 v1_1 << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0;
168 v2_1 << 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0;
169
170 sourceData1->setSampleAtTime(0.5, time::Sample{dimensions, v1_05});
171 sourceData2->setSampleAtTime(0.5, time::Sample{dimensions, v2_05});
172 sourceData1->setSampleAtTime(1.0, time::Sample{dimensions, v1_1});
173 sourceData2->setSampleAtTime(1.0, time::Sample{dimensions, v2_1});
174
176 action::SummationAction::WRITE_MAPPING_POST, sourceDataIDs, targetDataID, mesh);
177
178 sum.performAction();
179
180 const auto &sourceValues1 = sourceData1->values();
181 const auto &sourceValues2 = sourceData2->values();
182 const auto &targetValues = targetData->values();
183 BOOST_TEST(sourceValues1(0) == 1.0);
184 BOOST_TEST(sourceValues2(0) == 2.0);
185 BOOST_TEST(targetValues(0) == 3.0);
186
187 BOOST_TEST(sourceValues1(1) == 2.0);
188 BOOST_TEST(sourceValues2(1) == 3.0);
189 BOOST_TEST(targetValues(1) == 5.0);
190
191 BOOST_TEST(sourceValues1(2) == 3.0);
192 BOOST_TEST(sourceValues2(2) == 4.0);
193 BOOST_TEST(targetValues(2) == 7.0);
194
195 BOOST_TEST(sourceValues1(3) == 4.0);
196 BOOST_TEST(sourceValues2(3) == 5.0);
197 BOOST_TEST(targetValues(3) == 9.0);
198
199 BOOST_TEST(sourceValues1(4) == 5.0);
200 BOOST_TEST(sourceValues2(4) == 6.0);
201 BOOST_TEST(targetValues(4) == 11.0);
202
203 BOOST_TEST(sourceValues1(5) == 6.0);
204 BOOST_TEST(sourceValues2(5) == 7.0);
205 BOOST_TEST(targetValues(5) == 13.0);
206
207 BOOST_TEST(sourceValues1(6) == 7.0);
208 BOOST_TEST(sourceValues2(6) == 8.0);
209 BOOST_TEST(targetValues(6) == 15.0);
210
211 BOOST_TEST(sourceValues1(7) == 8.0);
212 BOOST_TEST(sourceValues2(7) == 9.0);
213 BOOST_TEST(targetValues(7) == 17.0);
214
215 BOOST_TEST(sourceValues1(8) == 9.0);
216 BOOST_TEST(sourceValues2(8) == 10.0);
217 BOOST_TEST(targetValues(8) == 19.0);
218
219 // Load and check data from 0.5
220
221 auto loadedStample1 = sourceData1->stamples().front();
222 BOOST_TEST(loadedStample1.timestamp == 0.5);
223 sourceData1->values() = loadedStample1.sample.values;
224
225 auto loadedStample2 = sourceData2->stamples().front();
226 BOOST_TEST(loadedStample2.timestamp == 0.5);
227 sourceData2->values() = loadedStample2.sample.values;
228
229 auto loadedStample3 = targetData->stamples().front();
230 BOOST_TEST(loadedStample3.timestamp == 0.5);
231 targetData->values() = loadedStample3.sample.values;
232
233 BOOST_TEST(sourceValues1(0) == 11.0);
234 BOOST_TEST(sourceValues2(0) == 12.0);
235 BOOST_TEST(targetValues(0) == 23.0);
236
237 BOOST_TEST(sourceValues1(1) == 22.0);
238 BOOST_TEST(sourceValues2(1) == 23.0);
239 BOOST_TEST(targetValues(1) == 45.0);
240
241 BOOST_TEST(sourceValues1(2) == 33.0);
242 BOOST_TEST(sourceValues2(2) == 34.0);
243 BOOST_TEST(targetValues(2) == 67.0);
244
245 BOOST_TEST(sourceValues1(3) == 44.0);
246 BOOST_TEST(sourceValues2(3) == 45.0);
247 BOOST_TEST(targetValues(3) == 89.0);
248
249 BOOST_TEST(sourceValues1(4) == 55.0);
250 BOOST_TEST(sourceValues2(4) == 56.0);
251 BOOST_TEST(targetValues(4) == 111.0);
252
253 BOOST_TEST(sourceValues1(5) == 66.0);
254 BOOST_TEST(sourceValues2(5) == 67.0);
255 BOOST_TEST(targetValues(5) == 133.0);
256
257 BOOST_TEST(sourceValues1(6) == 77.0);
258 BOOST_TEST(sourceValues2(6) == 78.0);
259 BOOST_TEST(targetValues(6) == 155.0);
260
261 BOOST_TEST(sourceValues1(7) == 88.0);
262 BOOST_TEST(sourceValues2(7) == 89.0);
263 BOOST_TEST(targetValues(7) == 177.0);
264
265 BOOST_TEST(sourceValues1(8) == 99.0);
266 BOOST_TEST(sourceValues2(8) == 910.0);
267 BOOST_TEST(targetValues(8) == 1009.0);
268}
269
270PRECICE_TEST_SETUP(1_rank)
272{
273 PRECICE_TEST();
274 std::string filename = testing::getPathToSources() + "/action/tests/SummationActionTest-testConfiguration-1.xml";
277 mesh::PtrMeshConfiguration meshConfig(new mesh::MeshConfiguration(tag, dataConfig));
278 action::ActionConfiguration config(tag, meshConfig);
280 BOOST_TEST(config.actions().size() == 1);
281 auto &action = config.actions().front();
282 BOOST_TEST(static_cast<bool>(action));
283}
284
285BOOST_AUTO_TEST_SUITE_END() // Summation
286BOOST_AUTO_TEST_SUITE_END() // ActionTest
BOOST_AUTO_TEST_SUITE(PreProcess)
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(SummationOneDimensional)
#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
Configures an Action subclass object.
const std::list< PtrAction > & actions() const
Returns the configured action.
Action that adds multiple source data into target data.
void performAction() final override
Adding data and applying them to target.
Performs and provides configuration for Data objects from XML files.
Represents an XML tag to be configured automatically.
Definition XMLTag.hpp:28
std::string getPathToSources()
Returns the base path to the sources.
Definition Testing.cpp:33
XMLTag getRootTag()
Returns an empty root tag with name "configuration".
Definition XMLTag.cpp:278
std::string configure(XMLTag &tag, const precice::xml::ConfigurationContext &context, std::string_view configurationFilename)
Configures the given configuration from file configurationFilename.
Definition XMLTag.cpp:284
Main namespace of the precice library.
Tightly coupled to the parameters of Participant()
Definition XMLTag.hpp:21