preCICE v3.3.0
Loading...
Searching...
No Matches
AccelerationSerialTest.cpp
Go to the documentation of this file.
1#include <Eigen/Core>
2#include <algorithm>
17#include "testing/Meshes.hpp"
19#include "testing/Testing.hpp"
21
22using namespace precice;
23using namespace precice::acceleration;
24using namespace precice::acceleration::impl;
25
27
28BOOST_AUTO_TEST_SUITE(AccelerationTests)
29
32
33 // AccelerationSerialTestsFixture() {}
34};
35
36BOOST_FIXTURE_TEST_SUITE(AccelerationSerialTests, AccelerationSerialTestsFixture)
37
38#ifndef PRECICE_NO_MPI
39
40void testIQNIMVJPP(bool exchangeSubsteps)
41{
43 // use two vectors and see if underrelaxation works
44 double initialRelaxation = 0.01;
45 int maxIterationsUsed = 50;
46 int timeWindowsReused = 6;
47 int reusedTimeWindowsAtRestart = 0;
48 int chunkSize = 0;
49 int filter = Acceleration::QR1FILTER;
50 int restartType = IQNIMVJAcceleration::NO_RESTART;
51 double singularityLimit = 1e-10;
52 double svdTruncationEps = 0.0;
53 bool enforceInitialRelaxation = false;
54 bool alwaysBuildJacobian = false;
55 const double windowStart = 0;
56 const double windowEnd = 1;
57
58 std::vector<int> dataIDs;
59 dataIDs.push_back(0);
60 dataIDs.push_back(1);
61 std::vector<double> factors;
62 factors.resize(2, 1.0);
64 auto dummyMesh = testing::makeDummy2DMesh(4);
65
66 IQNIMVJAcceleration pp(initialRelaxation, enforceInitialRelaxation, maxIterationsUsed,
67 timeWindowsReused, filter, singularityLimit, dataIDs, prec, alwaysBuildJacobian,
68 restartType, chunkSize, reusedTimeWindowsAtRestart, svdTruncationEps, !exchangeSubsteps);
69
70 Eigen::VectorXd fcol1;
71
72 mesh::PtrData displacements(new mesh::Data("dvalues", -1, 1));
73 mesh::PtrData forces(new mesh::Data("fvalues", -1, 1));
74
75 // init displacements & forces
76 displacements->emplaceSampleAtTime(windowStart, {1.0, 1.0, 1.0, 1.0});
77 displacements->emplaceSampleAtTime(windowEnd, {1.0, 1.0, 1.0, 1.0});
78 forces->emplaceSampleAtTime(windowStart, {0.2, 0.2, 0.2, 0.2});
79 forces->emplaceSampleAtTime(windowEnd, {0.2, 0.2, 0.2, 0.2});
80
81 cplscheme::PtrCouplingData dpcd = makeCouplingData(displacements, dummyMesh, exchangeSubsteps);
82 cplscheme::PtrCouplingData fpcd = makeCouplingData(forces, dummyMesh, exchangeSubsteps);
83
84 DataMap data;
87 dpcd->storeIteration();
88 fpcd->storeIteration();
89
90 pp.initialize(data);
91
92 displacements->emplaceSampleAtTime(windowEnd, {1.0, 2.0, 3.0, 4.0});
93 forces->emplaceSampleAtTime(windowEnd, {0.1, 0.1, 0.1, 0.1});
94
95 pp.performAcceleration(data, windowStart, windowEnd);
96
97 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(0), 1.00000000000000000000));
98 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(1), 1.01000000000000000888));
99 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(2), 1.02000000000000001776));
100 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(3), 1.03000000000000002665));
101 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(0), 0.199000000000000010214));
102 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(1), 0.199000000000000010214));
103 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(2), 0.199000000000000010214));
104 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(3), 0.199000000000000010214));
105
106 // Update the waveform as well
107 displacements->emplaceSampleAtTime(windowEnd, {10, 10, 10, 10});
108 forces->setSampleAtTime(windowEnd, forces->sample());
109
110 pp.performAcceleration(data, windowStart, windowEnd);
111
112 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(0), -5.63401340929695848558e-01));
113 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(1), 6.10309919173602111186e-01));
114 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(2), 1.78402117927690184729e+00));
115 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(3), 2.95773243938020247157e+00));
116 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(0), 8.28025852497733250157e-02));
117 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(1), 8.28025852497733250157e-02));
118 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(2), 8.28025852497733250157e-02));
119 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(3), 8.28025852497733250157e-02));
120}
121
122PRECICE_TEST_SETUP(1_rank)
123BOOST_AUTO_TEST_CASE(testIQNIMVJPPWithSubsteps)
124{
125 PRECICE_TEST();
126 testIQNIMVJPP(true);
127}
128
129PRECICE_TEST_SETUP(1_rank)
130BOOST_AUTO_TEST_CASE(testIQNIMVJPPWithoutSubsteps)
131{
132 PRECICE_TEST();
133 testIQNIMVJPP(false);
134}
135
136void testVIQNPP(bool exchangeSubsteps)
137{
139 // use two vectors and see if underrelaxation works
140
141 double initialRelaxation = 0.01;
142 int maxIterationsUsed = 50;
143 int timeWindowsReused = 6;
145 double singularityLimit = 1e-10;
146 bool enforceInitialRelaxation = false;
147 std::vector<int> dataIDs;
148 const double windowStart = 0;
149 const double windowEnd = 1;
150
151 dataIDs.push_back(0);
152 dataIDs.push_back(1);
153 std::vector<double> factors;
154 factors.resize(2, 1.0);
155 PtrPreconditioner prec(new ConstantPreconditioner(factors));
156
157 std::map<int, double> scalings;
158 scalings.insert(std::make_pair(0, 1.0));
159 scalings.insert(std::make_pair(1, 1.0));
160 auto dummyMesh = testing::makeDummy2DMesh(4);
161
162 IQNILSAcceleration pp(initialRelaxation, enforceInitialRelaxation, maxIterationsUsed,
163 timeWindowsReused, filter, singularityLimit, dataIDs, prec, !exchangeSubsteps);
164
165 mesh::PtrData displacements(new mesh::Data("dvalues", -1, 1));
166 mesh::PtrData forces(new mesh::Data("fvalues", -1, 1));
167
168 // init displacements & forces
169 displacements->emplaceSampleAtTime(windowStart, {1.0, 1.0, 1.0, 1.0});
170 displacements->emplaceSampleAtTime(windowEnd, {1.0, 1.0, 1.0, 1.0});
171 forces->emplaceSampleAtTime(windowStart, {0.2, 0.2, 0.2, 0.2});
172 forces->emplaceSampleAtTime(windowEnd, {0.2, 0.2, 0.2, 0.2});
173
174 cplscheme::PtrCouplingData dpcd = makeCouplingData(displacements, dummyMesh, exchangeSubsteps);
175 cplscheme::PtrCouplingData fpcd = makeCouplingData(forces, dummyMesh, exchangeSubsteps);
176
177 dpcd->storeIteration();
178 fpcd->storeIteration();
179
180 DataMap data;
181 data.insert(std::pair<int, cplscheme::PtrCouplingData>(0, dpcd));
182 data.insert(std::pair<int, cplscheme::PtrCouplingData>(1, fpcd));
183
184 pp.initialize(data);
185
186 displacements->emplaceSampleAtTime(windowEnd, {1.0, 2.0, 3.0, 4.0});
187 forces->emplaceSampleAtTime(windowEnd, {0.1, 0.1, 0.1, 0.1});
188
189 pp.performAcceleration(data, windowStart, windowEnd);
190
191 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(0), 1.00));
192 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(1), 1.01));
193 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(2), 1.02));
194 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(3), 1.03));
195 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(0), 0.199));
196 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(1), 0.199));
197 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(2), 0.199));
198 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(3), 0.199));
199
200 Eigen::VectorXd newdvalues;
201 utils::append(newdvalues, 10.0);
202 utils::append(newdvalues, 10.0);
203 utils::append(newdvalues, 10.0);
204 utils::append(newdvalues, 10.0);
205
206 displacements->setSampleAtTime(windowEnd, time::Sample(displacements->getDimensions(), newdvalues));
207 forces->setSampleAtTime(windowEnd, forces->sample());
208
209 pp.performAcceleration(data, windowStart, windowEnd);
210
211 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(0), -5.63401340929692295845e-01));
212 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(1), 6.10309919173607440257e-01));
213 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(2), 1.78402117927690717636e+00));
214 BOOST_TEST(testing::equals(data.at(0)->timeStepsStorage().sample(windowEnd)(3), 2.95773243938020513610e+00));
215 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(0), 8.28025852497733944046e-02));
216 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(1), 8.28025852497733944046e-02));
217 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(2), 8.28025852497733944046e-02));
218 BOOST_TEST(testing::equals(data.at(1)->timeStepsStorage().sample(windowEnd)(3), 8.28025852497733944046e-02));
219}
220
221PRECICE_TEST_SETUP(1_rank)
222BOOST_AUTO_TEST_CASE(testVIQNPPWithSubsteps)
223{
224 PRECICE_TEST();
225 testVIQNPP(true);
226}
227
228PRECICE_TEST_SETUP(1_rank)
229BOOST_AUTO_TEST_CASE(testVIQNPPWithoutSubsteps)
230{
231 PRECICE_TEST();
232 testVIQNPP(false);
233}
234
235PRECICE_TEST_SETUP(1_rank)
236BOOST_AUTO_TEST_CASE(testConstantUnderrelaxationWithSubsteps)
237{
238 PRECICE_TEST();
239 // use two vectors and see if underrelaxation works
240 double relaxation = 0.4;
241 std::vector<int> dataIDs{0, 1};
242 auto dummyMesh = testing::makeDummy3DMesh(4);
243 const double windowStart = 0;
244 const double windowEnd = 1;
245
246 ConstantRelaxationAcceleration acc(relaxation, dataIDs);
247
248 mesh::PtrData displacements = std::make_shared<mesh::Data>("dvalues", -1, 1);
249 mesh::PtrData forces = std::make_shared<mesh::Data>("fvalues", -1, 1);
250
251 // init displacements & forces
252 displacements->emplaceSampleAtTime(windowStart, {1.0, 2.0, 3.0, 4.0});
253 forces->emplaceSampleAtTime(windowStart, {0.2, 0.2, 0.2, 0.2});
254
255 bool exchangeSubsteps = false;
256
257 cplscheme::PtrCouplingData dpcd = makeCouplingData(displacements, dummyMesh, exchangeSubsteps);
258 cplscheme::PtrCouplingData fpcd = makeCouplingData(forces, dummyMesh, exchangeSubsteps);
259
260 DataMap data;
261 data.insert(std::pair<int, cplscheme::PtrCouplingData>(0, dpcd));
262 data.insert(std::pair<int, cplscheme::PtrCouplingData>(1, fpcd));
263 dpcd->storeIteration();
264 fpcd->storeIteration();
265
266 acc.initialize(data);
267
268 displacements->emplaceSampleAtTime(windowEnd, {3.5, 2.0, 2.0, 1.0});
269 forces->emplaceSampleAtTime(windowEnd, {0.1, 0.1, 0.1, 0.1});
270
271 acc.performAcceleration(data, windowStart, windowEnd);
272
273 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 2);
274 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 2);
275 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 2.6);
276 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 2.8);
277 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.16);
278 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.16);
279 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.16);
280 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.16);
281
282 displacements->emplaceSampleAtTime(windowEnd, {10, 10, 10, 10});
283 forces->setSampleAtTime(windowEnd, forces->sample());
284
285 acc.performAcceleration(data, windowStart, windowEnd);
286
287 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 4.6);
288 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 5.2);
289 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 5.8);
290 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 6.4);
291 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.184);
292 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.184);
293 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.184);
294 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.184);
295}
296
297PRECICE_TEST_SETUP(1_rank)
298BOOST_AUTO_TEST_CASE(testAitkenUnderrelaxationWithoutSubsteps)
299{
300 PRECICE_TEST();
301
302 double relaxation = 0.4;
303 std::vector<int> dataIDs{0, 1};
304 std::vector<double> factors{1, 1};
305 auto dummyMesh = testing::makeDummy3DMesh(4);
306 const double windowStart = 0;
307 const double windowEnd = 1;
308
309 PtrPreconditioner prec(new ConstantPreconditioner(factors));
310 AitkenAcceleration acc(relaxation, dataIDs, prec);
311
312 mesh::PtrData displacements = std::make_shared<mesh::Data>("dvalues", -1, 1);
313 mesh::PtrData forces = std::make_shared<mesh::Data>("fvalues", -1, 1);
314
315 // //init displacements & forces
316 displacements->emplaceSampleAtTime(windowStart, {1.0, 2.0, 3.0, 4.0});
317 forces->emplaceSampleAtTime(windowStart, {0.2, 0.2, 0.2, 0.2});
318
319 cplscheme::PtrCouplingData dpcd = makeCouplingData(displacements, dummyMesh, false);
320 cplscheme::PtrCouplingData fpcd = makeCouplingData(forces, dummyMesh, false);
321
322 DataMap data;
323 data.insert(std::pair<int, cplscheme::PtrCouplingData>(0, dpcd));
324 data.insert(std::pair<int, cplscheme::PtrCouplingData>(1, fpcd));
325 dpcd->storeIteration();
326 fpcd->storeIteration();
327
328 acc.initialize(data);
329
330 displacements->emplaceSampleAtTime(windowEnd, {3.5, 2.0, 2.0, 1.0});
331 forces->emplaceSampleAtTime(windowEnd, {0.1, 0.1, 0.1, 0.1});
332
333 acc.performAcceleration(data, windowStart, windowEnd);
334
335 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 2);
336 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 2);
337 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 2.6);
338 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 2.8);
339 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.16);
340 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.16);
341 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.16);
342 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.16);
343
344 displacements->emplaceSampleAtTime(windowEnd, {10, 10, 10, 10});
345 forces->setSampleAtTime(windowEnd, forces->sample());
346
347 acc.performAcceleration(data, windowStart, windowEnd);
348
349 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 1.2689851805508461);
350 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 2.2390979382674185);
351 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 3.2092106959839914);
352 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 4.1793234537005644);
353 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.19880451030866292);
354 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.19880451030866292);
355 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.19880451030866292);
356 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.19880451030866292);
357}
358
359PRECICE_TEST_SETUP(1_rank)
360BOOST_AUTO_TEST_CASE(testAitkenUnderrelaxationWithPreconditioner)
361{
362 PRECICE_TEST();
363
364 double relaxation = 0.8;
365 std::vector<int> dataIDs{0, 1, 2, 3};
366 auto dummyMesh = testing::makeDummy2DMesh(2);
367
368 double windowStart = 0;
369 double windowEnd = 1;
370 const double dt = 1;
371
373 AitkenAcceleration acc(relaxation, dataIDs, prec);
374
375 mesh::PtrData data1 = std::make_shared<mesh::Data>("dvalues", -1, 1);
376 mesh::PtrData data2 = std::make_shared<mesh::Data>("fvalues", -1, 1);
377 mesh::PtrData data3 = std::make_shared<mesh::Data>("gvalues", -1, 2);
378 mesh::PtrData data4 = std::make_shared<mesh::Data>("hvalues", -1, 2);
379
380 // init data
381 data1->emplaceSampleAtTime(windowStart, {40, 80});
382 data2->emplaceSampleAtTime(windowStart, {5, 5});
383 data3->emplaceSampleAtTime(windowStart, {1, 2, 3, 4});
384 data4->emplaceSampleAtTime(windowStart, {20, 40, 60, 80});
385
386 cplscheme::PtrCouplingData dpcd = makeCouplingData(data1, dummyMesh, false);
387 cplscheme::PtrCouplingData fpcd = makeCouplingData(data2, dummyMesh, false);
388 cplscheme::PtrCouplingData gpcd = makeCouplingData(data3, dummyMesh, false);
389 cplscheme::PtrCouplingData hpcd = makeCouplingData(data4, dummyMesh, false);
390
391 DataMap data;
392 data.insert(std::pair<int, cplscheme::PtrCouplingData>(0, dpcd));
393 data.insert(std::pair<int, cplscheme::PtrCouplingData>(1, fpcd));
394 data.insert(std::pair<int, cplscheme::PtrCouplingData>(2, gpcd));
395 data.insert(std::pair<int, cplscheme::PtrCouplingData>(3, hpcd));
396 dpcd->storeIteration();
397 fpcd->storeIteration();
398 gpcd->storeIteration();
399 hpcd->storeIteration();
400
401 acc.initialize(data);
402
403 data1->emplaceSampleAtTime(windowEnd, {1, 7});
404 data2->emplaceSampleAtTime(windowEnd, {10, 10});
405 data3->emplaceSampleAtTime(windowEnd, {10, 11, 12, 13});
406 data4->emplaceSampleAtTime(windowEnd, {40, 60, 80, 100});
407
408 acc.performAcceleration(data, windowStart, windowEnd);
409
410 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 8.8);
411 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 21.6);
412 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 9);
413 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 9);
414 BOOST_TEST(data.at(2)->timeStepsStorage().sample(windowEnd)(0) == 8.2);
415 BOOST_TEST(data.at(2)->timeStepsStorage().sample(windowEnd)(1) == 9.2);
416 BOOST_TEST(data.at(2)->timeStepsStorage().sample(windowEnd)(2) == 10.2);
417 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(0) == 36);
418 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(1) == 56);
419 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(2) == 76);
420 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(3) == 96);
421
422 data1->emplaceSampleAtTime(windowEnd, {2, 14});
423 data2->emplaceSampleAtTime(windowEnd, {8, 8});
424 data3->emplaceSampleAtTime(windowEnd, {13, 14, 15, 16});
425 data4->emplaceSampleAtTime(windowEnd, {41, 61, 81, 90});
426
427 acc.performAcceleration(data, windowStart, windowEnd);
428
429 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == -17.745640722103754);
430 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == -20.295060201548626);
431 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 9.5588663727976648);
432 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 9.5588663727976648);
433 BOOST_TEST(data.at(2)->timeStepsStorage().sample(windowEnd)(0) == 19.235465491190659);
434 BOOST_TEST(data.at(2)->timeStepsStorage().sample(windowEnd)(1) == 20.235465491190659);
435 BOOST_TEST(data.at(2)->timeStepsStorage().sample(windowEnd)(2) == 21.235465491190659);
436 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(0) == 51.912064609583652);
437 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(1) == 71.912064609583652);
438 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(2) == 91.912064609583652);
439 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(3) == 95.196221242658879);
440
441 data1->emplaceSampleAtTime(windowEnd, {2.1, 14.1});
442 data2->emplaceSampleAtTime(windowEnd, {8, 8});
443 data3->emplaceSampleAtTime(windowEnd, {13.05, 14.07, 15.1, 16.1});
444 data4->emplaceSampleAtTime(windowEnd, {42, 60, 81.3, 91});
445
446 acc.iterationsConverged(data, windowStart);
447
448 // move to next window
449 windowStart += dt;
450 windowEnd += dt;
451
452 // move to next window
453 windowStart += dt;
454 windowEnd += dt;
455
456 data1->emplaceSampleAtTime(windowEnd, {3, 16});
457 data2->emplaceSampleAtTime(windowEnd, {7, 7});
458 data3->emplaceSampleAtTime(windowEnd, {18, 19, 20, 21});
459 data4->emplaceSampleAtTime(windowEnd, {50, 70, 90, 110});
460
461 acc.performAcceleration(data, windowStart, windowEnd);
462
463 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 10.4);
464 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 28.8);
465 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 6.6);
466 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 6.6);
467 BOOST_TEST(data.at(2)->timeStepsStorage().sample(windowEnd)(0) == 14.6);
468 BOOST_TEST(data.at(2)->timeStepsStorage().sample(windowEnd)(1) == 15.6);
469 BOOST_TEST(data.at(2)->timeStepsStorage().sample(windowEnd)(2) == 16.6);
470 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(0) == 44);
471 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(1) == 64);
472 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(2) == 84);
473 BOOST_TEST(data.at(3)->timeStepsStorage().sample(windowEnd)(3) == 104);
474}
475
476PRECICE_TEST_SETUP(1_rank)
477BOOST_AUTO_TEST_CASE(testConstantUnderrelaxationWithGradientWithSubsteps)
478{
479 PRECICE_TEST();
480 // use two vectors and see if underrelaxation works
481 double relaxation = 0.4;
482 std::vector<int> dataIDs{0, 1};
483 const int dim = 3;
484 auto dummyMesh = testing::makeDummy3DMesh(4);
485 const double windowStart = 0;
486 const double windowEnd = 1;
487
488 ConstantRelaxationAcceleration acc(relaxation, dataIDs);
489
490 mesh::PtrData displacements = std::make_shared<mesh::Data>("dvalues", -1, 1);
491 mesh::PtrData forces = std::make_shared<mesh::Data>("fvalues", -1, 1);
492
493 // init displacements
494 displacements->requireDataGradient();
495 Eigen::MatrixXd displacementGradient(displacements->gradients());
496 displacementGradient.resize(dim, 4);
497 for (unsigned int r = 0; r < dim; ++r) {
498 for (unsigned int c = 0; c < 4; ++c)
499 displacementGradient(r, c) = r + r * c;
500 }
501 displacements->setSampleAtTime(windowStart, time::Sample(displacements->getDimensions(), Eigen::Vector4d{1.0, 2.0, 3.0, 4.0}, displacementGradient));
502 // init forces
503 forces->requireDataGradient();
504 Eigen::MatrixXd forcesGradient(forces->gradients());
505 forcesGradient.resize(dim, 4);
506 forcesGradient.setConstant(-2);
507 forces->setSampleAtTime(windowStart, time::Sample(forces->getDimensions(), Eigen::Vector4d{0.2, 0.2, 0.2, 0.2}, forcesGradient));
508
509 bool exchangeSubsteps = true;
510
511 cplscheme::PtrCouplingData dpcd = makeCouplingData(displacements, dummyMesh, exchangeSubsteps);
512 cplscheme::PtrCouplingData fpcd = makeCouplingData(forces, dummyMesh, exchangeSubsteps);
513
514 DataMap data;
515 data.insert(std::pair<int, cplscheme::PtrCouplingData>(0, dpcd));
516 data.insert(std::pair<int, cplscheme::PtrCouplingData>(1, fpcd));
517 dpcd->storeIteration();
518 fpcd->storeIteration();
519
520 acc.initialize(data);
521
522 displacements->setSampleAtTime(windowEnd, time::Sample(displacements->getDimensions(), Eigen::Vector4d{3.5, 2.0, 2.0, 1.0}, Eigen::MatrixXd(displacements->gradients()).setConstant(2.5)));
523 forces->setSampleAtTime(windowEnd, time::Sample(forces->getDimensions(), Eigen::Vector4d{0.1, 0.1, 0.1, 0.1}, Eigen::MatrixXd(forces->gradients()).setConstant(3)));
524
525 acc.performAcceleration(data, windowStart, windowEnd);
526
527 // Test value data
528 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 2);
529 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 2);
530 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 2.6);
531 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 2.8);
532 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.16);
533 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.16);
534 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.16);
535 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.16);
536
537 // Test gradient data
538 BOOST_TEST(data.at(0)->gradients()(0, 0) == 1);
539 BOOST_TEST(data.at(0)->gradients()(0, 1) == 1);
540 BOOST_TEST(data.at(0)->gradients()(0, 2) == 1);
541 BOOST_TEST(data.at(0)->gradients()(1, 0) == 1.6);
542 BOOST_TEST(data.at(0)->gradients()(1, 1) == 2.2);
543 BOOST_TEST(data.at(0)->gradients()(1, 2) == 2.8);
544 BOOST_TEST(data.at(1)->gradients()(0, 0) == 0);
545 BOOST_TEST(data.at(1)->gradients()(0, 1) == 0);
546 BOOST_TEST(data.at(1)->gradients()(0, 2) == 0);
547 BOOST_TEST(data.at(1)->gradients()(1, 0) == 0);
548 BOOST_TEST(data.at(1)->gradients()(1, 1) == 0);
549 BOOST_TEST(data.at(1)->gradients()(1, 2) == 0);
550
551 displacements->setSampleAtTime(windowEnd, time::Sample(displacements->getDimensions(), Eigen::Vector4d{10, 10, 10, 10}, Eigen::MatrixXd(displacements->gradients()).setConstant(4)));
552 forces->setSampleAtTime(windowEnd, forces->sample());
553
554 acc.performAcceleration(data, windowStart, windowEnd);
555
556 // Check that store iteration works properly
557 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 4.6);
558 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 5.2);
559 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 5.8);
560 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 6.4);
561 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.184);
562 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.184);
563 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.184);
564 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.184);
565
566 BOOST_TEST(data.at(0)->gradients()(0, 0) == 1.6);
567 BOOST_TEST(data.at(0)->gradients()(0, 1) == 1.6);
568 BOOST_TEST(data.at(0)->gradients()(0, 2) == 1.6);
569 BOOST_TEST(data.at(0)->gradients()(1, 0) == 2.2);
570 BOOST_TEST(data.at(0)->gradients()(1, 1) == 2.8);
571 BOOST_TEST(data.at(0)->gradients()(1, 2) == 3.4);
572}
573
574PRECICE_TEST_SETUP(1_rank)
575BOOST_AUTO_TEST_CASE(testConstantUnderrelaxationWithoutSubsteps)
576{
577 PRECICE_TEST();
578 // use two vectors and see if underrelaxation works
579 double relaxation = 0.4;
580 std::vector<int> dataIDs{0, 1};
581 auto dummyMesh = testing::makeDummy3DMesh(4);
582 const double windowStart = 0;
583 const double windowEnd = 1;
584
585 ConstantRelaxationAcceleration acc(relaxation, dataIDs);
586
587 mesh::PtrData displacements = std::make_shared<mesh::Data>("dvalues", -1, 1);
588 mesh::PtrData forces = std::make_shared<mesh::Data>("fvalues", -1, 1);
589
590 displacements->emplaceSampleAtTime(windowStart, {1.0, 2.0, 3.0, 4.0});
591 forces->emplaceSampleAtTime(windowStart, {0.2, 0.2, 0.2, 0.2});
592
593 bool exchangeSubsteps = false;
594
595 cplscheme::PtrCouplingData dpcd = makeCouplingData(displacements, dummyMesh, exchangeSubsteps);
596 cplscheme::PtrCouplingData fpcd = makeCouplingData(forces, dummyMesh, exchangeSubsteps);
597
598 DataMap data;
599 data.insert(std::pair<int, cplscheme::PtrCouplingData>(0, dpcd));
600 data.insert(std::pair<int, cplscheme::PtrCouplingData>(1, fpcd));
601 dpcd->storeIteration();
602 fpcd->storeIteration();
603
604 acc.initialize(data);
605
606 displacements->emplaceSampleAtTime(windowEnd, {3.5, 2.0, 2.0, 1.0});
607 forces->emplaceSampleAtTime(windowEnd, {0.1, 0.1, 0.1, 0.1});
608
609 acc.performAcceleration(data, windowStart, windowEnd);
610
611 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 2);
612 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 2);
613 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 2.6);
614 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 2.8);
615 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.16);
616 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.16);
617 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.16);
618 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.16);
619
620 displacements->emplaceSampleAtTime(windowEnd, {10, 10, 10, 10});
621
622 forces->setSampleAtTime(windowEnd, forces->sample());
623
624 acc.performAcceleration(data, windowStart, windowEnd);
625
626 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 4.6);
627 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 5.2);
628 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 5.8);
629 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 6.4);
630 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.184);
631 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.184);
632 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.184);
633 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.184);
634}
635
636PRECICE_TEST_SETUP(1_rank)
637BOOST_AUTO_TEST_CASE(testConstantUnderrelaxationWithGradientWithoutSubsteps)
638{
639 PRECICE_TEST();
640 // use two vectors and see if underrelaxation works
641 double relaxation = 0.4;
642 std::vector<int> dataIDs{0, 1};
643 const int dim = 3;
644 auto dummyMesh = testing::makeDummy3DMesh(4);
645 const double windowStart = 0;
646 const double windowEnd = 1;
647
648 ConstantRelaxationAcceleration acc(relaxation, dataIDs);
649
650 mesh::PtrData displacements = std::make_shared<mesh::Data>("dvalues", -1, 1);
651 mesh::PtrData forces = std::make_shared<mesh::Data>("fvalues", -1, 1);
652
653 // init displacements
654 displacements->requireDataGradient();
655 Eigen::MatrixXd displacementGradient(displacements->gradients());
656 displacementGradient.resize(dim, 4);
657 for (unsigned int r = 0; r < dim; ++r) {
658 for (unsigned int c = 0; c < 4; ++c)
659 displacementGradient(r, c) = r + r * c;
660 }
661 displacements->setSampleAtTime(windowStart, time::Sample(displacements->getDimensions(), Eigen::Vector4d{1.0, 2.0, 3.0, 4.0}, displacementGradient));
662 // init forces
663 forces->requireDataGradient();
664 Eigen::MatrixXd forcesGradient(forces->gradients());
665 forcesGradient.resize(dim, 4);
666 forcesGradient.setConstant(-2);
667 forces->setSampleAtTime(windowStart, time::Sample(forces->getDimensions(), Eigen::Vector4d{0.2, 0.2, 0.2, 0.2}, forcesGradient));
668
669 bool exchangeSubsteps = false;
670
671 cplscheme::PtrCouplingData dpcd = makeCouplingData(displacements, dummyMesh, exchangeSubsteps);
672 cplscheme::PtrCouplingData fpcd = makeCouplingData(forces, dummyMesh, exchangeSubsteps);
673
674 DataMap data;
675 data.insert(std::pair<int, cplscheme::PtrCouplingData>(0, dpcd));
676 data.insert(std::pair<int, cplscheme::PtrCouplingData>(1, fpcd));
677 dpcd->storeIteration();
678 fpcd->storeIteration();
679
680 acc.initialize(data);
681
682 displacements->setSampleAtTime(windowEnd, time::Sample(displacements->getDimensions(), Eigen::Vector4d{3.5, 2.0, 2.0, 1.0}, Eigen::MatrixXd(displacements->gradients()).setConstant(2.5)));
683 forces->setSampleAtTime(windowEnd, time::Sample(displacements->getDimensions(), Eigen::Vector4d{0.1, 0.1, 0.1, 0.1}, Eigen::MatrixXd(displacements->gradients()).setConstant(3)));
684
685 acc.performAcceleration(data, windowStart, windowEnd);
686
687 // Test value data
688 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 2);
689 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 2);
690 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 2.6);
691 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 2.8);
692 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.16);
693 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.16);
694 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.16);
695 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.16);
696
697 // Test gradient data
698 BOOST_TEST(data.at(0)->gradients()(0, 0) == 1);
699 BOOST_TEST(data.at(0)->gradients()(0, 1) == 1);
700 BOOST_TEST(data.at(0)->gradients()(0, 2) == 1);
701 BOOST_TEST(data.at(0)->gradients()(1, 0) == 1.6);
702 BOOST_TEST(data.at(0)->gradients()(1, 1) == 2.2);
703 BOOST_TEST(data.at(0)->gradients()(1, 2) == 2.8);
704 BOOST_TEST(data.at(1)->gradients()(0, 0) == 0);
705 BOOST_TEST(data.at(1)->gradients()(0, 1) == 0);
706 BOOST_TEST(data.at(1)->gradients()(0, 2) == 0);
707 BOOST_TEST(data.at(1)->gradients()(1, 0) == 0);
708 BOOST_TEST(data.at(1)->gradients()(1, 1) == 0);
709 BOOST_TEST(data.at(1)->gradients()(1, 2) == 0);
710
711 displacements->setSampleAtTime(windowEnd, time::Sample(displacements->getDimensions(), Eigen::Vector4d{10, 10, 10, 10}, Eigen::MatrixXd(displacements->gradients()).setConstant(4)));
712 forces->setSampleAtTime(windowEnd, forces->sample());
713
714 acc.performAcceleration(data, windowStart, windowEnd);
715
716 // Check that store iteration works properly
717 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(0) == 4.6);
718 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(1) == 5.2);
719 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(2) == 5.8);
720 BOOST_TEST(data.at(0)->timeStepsStorage().sample(windowEnd)(3) == 6.4);
721 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(0) == 0.184);
722 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(1) == 0.184);
723 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(2) == 0.184);
724 BOOST_TEST(data.at(1)->timeStepsStorage().sample(windowEnd)(3) == 0.184);
725
726 BOOST_TEST(data.at(0)->gradients()(0, 0) == 1.6);
727 BOOST_TEST(data.at(0)->gradients()(0, 1) == 1.6);
728 BOOST_TEST(data.at(0)->gradients()(0, 2) == 1.6);
729 BOOST_TEST(data.at(0)->gradients()(1, 0) == 2.2);
730 BOOST_TEST(data.at(0)->gradients()(1, 1) == 2.8);
731 BOOST_TEST(data.at(0)->gradients()(1, 2) == 3.4);
732}
733
734#endif // not PRECICE_NO_MPI
735
std::map< int, PtrCouplingData > DataMap
BOOST_AUTO_TEST_CASE(testIQNIMVJPPWithSubsteps)
cplscheme::PtrCouplingData makeCouplingData(mesh::PtrData data, mesh::PtrMesh mesh, bool exchangeSubsteps)
Definition helper.hpp:10
void testIQNIMVJPP(bool exchangeSubsteps)
void testVIQNPP(bool exchangeSubsteps)
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
void performAcceleration(DataMap &cpldata, double windowStart, double windowEnd) final override
void initialize(const DataMap &cpldata) final override
void iterationsConverged(const DataMap &cpldata, double windowStart) final override
void initialize(const DataMap &cplData) final override
Initializes the acceleration.
void performAcceleration(DataMap &cplData, double windowStart, double windowEnd) final override
Performs one acceleration step.
void performAcceleration(DataMap &cplData, double windowStart, double windowEnd) override
Interface quasi-Newton with interface least-squares approximation.
Multi vector quasi-Newton update scheme.
Preconditioner that uses the constant user-defined factors to scale the quasi-Newton system.
Preconditioner that uses the recent residual to scale the quasi-Newton system.
Describes a set of data values belonging to the vertices of a mesh.
Definition Data.hpp:27
T insert(T... args)
T make_pair(T... args)
T make_shared(T... args)
std::shared_ptr< Preconditioner > PtrPreconditioner
contains implementations of acceleration schemes.
std::shared_ptr< CouplingData > PtrCouplingData
std::shared_ptr< Data > PtrData
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
auto makeDummy3DMesh(size_t nVertices)
Definition Meshes.hpp:28
auto makeDummy2DMesh(size_t nVertices)
Definition Meshes.hpp:21
void append(Eigen::VectorXd &v, double value)
Main namespace of the precice library.
T push_back(T... args)
T resize(T... args)
std::map< int, cplscheme::PtrCouplingData > DataMap