preCICE
Loading...
Searching...
No Matches
WaveformTest.cpp
Go to the documentation of this file.
1#include <Eigen/Core>
3#include "testing/Testing.hpp"
4#include "time/Waveform.hpp"
5
6using namespace precice;
7using namespace precice::time;
8
10BOOST_AUTO_TEST_SUITE(WaveformTests)
11
12// create waveform and test for correct initial values.
15{
17 auto waveform = Waveform(1);
18 int nValues = 3;
19 BOOST_TEST(waveform.nTimes() == 0);
20 waveform.setSampleAtTime(0, time::Sample{1, Eigen::VectorXd::Ones(nValues)});
21 BOOST_TEST(waveform.nDofs() == nValues);
22 BOOST_TEST(waveform.nTimes() == 1);
23 for (int i = 0; i < nValues; i++) {
24 BOOST_TEST(waveform.getSampleAtOrAfter(0).values(i) == 1);
25 BOOST_TEST(waveform.getSampleAtOrAfter(0.5).values(i) == 1);
26 BOOST_TEST(waveform.getSampleAtOrAfter(1).values(i) == 1);
27 }
28}
29
31BOOST_AUTO_TEST_CASE(Initialization)
32{
34 const int interpolationDegree = 0;
35 const int valuesSize = 1;
36 Eigen::VectorXd value(valuesSize);
37 Waveform waveform(interpolationDegree);
38 BOOST_TEST(waveform.nTimes() == 0);
39 value(0) = 0.0;
40 waveform.setSampleAtTime(0, time::Sample{1, value});
41
42 BOOST_TEST(waveform.nDofs() == valuesSize);
43
44 BOOST_TEST(testing::equals(waveform.sample(0.0)(0), 0.0));
45 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 0.0));
46}
47
49BOOST_AUTO_TEST_CASE(InitializationVector)
50{
52
53 const int interpolationDegree = 0;
54 const int valuesSize = 3;
55 Eigen::VectorXd value(valuesSize);
56 Waveform waveform(interpolationDegree);
57 value << 0, 0, 0;
58 waveform.setSampleAtTime(0, time::Sample{1, value});
59
60 BOOST_TEST(waveform.nDofs() == valuesSize);
61
62 for (int i = 0; i < valuesSize; i++) {
63 BOOST_TEST(testing::equals(waveform.sample(0.0)(i), 0.0));
64 BOOST_TEST(testing::equals(waveform.sample(1.0)(i), 0.0));
65 }
66}
67
68// create waveform and trim it.
71{
73 auto waveform = Waveform();
74 int nValues = 3;
75 BOOST_TEST(waveform.nTimes() == 0);
76 waveform.setSampleAtTime(0, time::Sample{1, Eigen::VectorXd::Ones(nValues)});
77 BOOST_TEST(waveform.nDofs() == nValues);
78 BOOST_TEST(waveform.nTimes() == 1);
79 BOOST_TEST(waveform.maxStoredTime() == 0.0);
80 waveform.setSampleAtTime(1, time::Sample{1, Eigen::VectorXd::Ones(nValues)});
81 BOOST_TEST(waveform.nDofs() == nValues);
82 BOOST_TEST(waveform.nTimes() == 2);
83 BOOST_TEST(waveform.maxStoredTime() == 1.0);
84 waveform.trim();
85 BOOST_TEST(waveform.nDofs() == nValues);
86 BOOST_TEST(waveform.nTimes() == 1);
87 BOOST_TEST(waveform.maxStoredTime() == 0.0);
88}
89
90// create waveform, add some values and then move to next window.
93{
95 auto waveform = Waveform();
96 int nValues = 3;
97 BOOST_TEST(waveform.nTimes() == 0);
98 waveform.setSampleAtTime(0, time::Sample{1, Eigen::VectorXd::Ones(nValues)});
99 BOOST_TEST(waveform.nDofs() == nValues);
100 BOOST_TEST(waveform.nTimes() == 1);
101 BOOST_TEST(waveform.maxStoredTime() == 0.0);
102 waveform.setSampleAtTime(0.5, time::Sample{1, Eigen::VectorXd::Ones(nValues)});
103 BOOST_TEST(waveform.nTimes() == 2);
104 BOOST_TEST(waveform.maxStoredTime() == 0.5);
105 waveform.setSampleAtTime(1.0, time::Sample{1, Eigen::VectorXd::Zero(nValues)});
106 BOOST_TEST(waveform.nTimes() == 3);
107 BOOST_TEST(waveform.maxStoredTime() == 1.0);
108 for (int i = 0; i < nValues; i++) {
109 BOOST_TEST(waveform.getSampleAtOrAfter(0).values(i) == 1);
110 BOOST_TEST(waveform.getSampleAtOrAfter(0.5).values(i) == 1);
111 BOOST_TEST(waveform.getSampleAtOrAfter(1).values(i) == 0);
112 }
113 waveform.move();
114 BOOST_TEST(waveform.nDofs() == nValues);
115 BOOST_TEST(waveform.nTimes() == 1);
116 BOOST_TEST(waveform.maxStoredTime() == 1.0);
117 for (int i = 0; i < nValues; i++) {
118 BOOST_TEST(waveform.getSampleAtOrAfter(0).values(i) == 0);
119 BOOST_TEST(waveform.getSampleAtOrAfter(1).values(i) == 0);
120 }
121}
122
123// get times and values
124PRECICE_TEST_SETUP(1_rank)
125BOOST_AUTO_TEST_CASE(GetTimesAndValues)
126{
127 PRECICE_TEST();
128 auto waveform = Waveform();
129 int nValues = 3;
130 waveform.setSampleAtTime(0, time::Sample{1, Eigen::VectorXd::Ones(nValues)});
131 waveform.setSampleAtTime(0.5, time::Sample{1, Eigen::VectorXd::Ones(nValues)});
132 waveform.setSampleAtTime(1.0, time::Sample{1, Eigen::VectorXd::Zero(nValues)});
133 auto times = waveform.getTimes();
134 BOOST_TEST(times[0] == 0.0);
135 BOOST_TEST(times[1] == 0.5);
136 BOOST_TEST(times[2] == 1.00);
137 auto timesAndValues = waveform.getTimesAndValues();
138 BOOST_TEST(timesAndValues.first[0] == 0.0);
139 BOOST_TEST(timesAndValues.first[1] == 0.5);
140 BOOST_TEST(timesAndValues.first[2] == 1.00);
141 for (int i = 0; i < nValues; i++) {
142 BOOST_TEST(timesAndValues.second.col(0)(i) == 1);
143 BOOST_TEST(timesAndValues.second.col(1)(i) == 1);
144 BOOST_TEST(timesAndValues.second.col(2)(i) == 0);
145 }
146}
147
148BOOST_AUTO_TEST_SUITE(ExtrapolationTests)
149
150PRECICE_TEST_SETUP(1_rank)
151BOOST_AUTO_TEST_CASE(ExtrapolateDataZerothOrder)
152{
153 PRECICE_TEST();
154
155 auto waveform = Waveform();
156 const int nValues = 1;
157
158 waveform.setSampleAtTime(0.0, time::Sample{1, Eigen::VectorXd::Zero(nValues)});
159 auto times = waveform.getTimes();
160 BOOST_TEST(times[0] == 0.0);
161 auto timesAndValues = waveform.getTimesAndValues();
162 BOOST_TEST(timesAndValues.second.col(0)(0) == 0.0);
163
164 waveform.setSampleAtTime(1.0, time::Sample{1, Eigen::VectorXd::Ones(nValues)});
165 times = waveform.getTimes();
166 BOOST_TEST(times[0] == 0.0);
167 BOOST_TEST(times[1] == 1.0);
168 timesAndValues = waveform.getTimesAndValues();
169 BOOST_TEST(timesAndValues.second.col(0)(0) == 0.0);
170 BOOST_TEST(timesAndValues.second.col(1)(0) == 1.0);
171
172 waveform.move();
173
174 times = waveform.getTimes();
175 BOOST_TEST(times[0] == 1.0);
176 timesAndValues = waveform.getTimesAndValues();
177 BOOST_TEST(timesAndValues.second.col(0)(0) == 1.0);
178
179 // make sure that subcycling is ignored for extrapolation
180 waveform.trim();
181 waveform.setSampleAtTime(1.5, time::Sample{1, 2 * Eigen::VectorXd::Ones(nValues)});
182 waveform.setSampleAtTime(2.0, time::Sample{1, 3 * Eigen::VectorXd::Ones(nValues)});
183
184 times = waveform.getTimes();
185 BOOST_TEST(times[0] == 1.0);
186 BOOST_TEST(times[1] == 1.5);
187 BOOST_TEST(times[2] == 2.0);
188
189 waveform.move();
190
191 times = waveform.getTimes();
192 BOOST_TEST(times[0] == 2.0);
193 timesAndValues = waveform.getTimesAndValues();
194 BOOST_TEST(timesAndValues.second.col(0)(0) == 3.0);
195}
196
198
199BOOST_AUTO_TEST_SUITE(InterpolationTests)
200
201PRECICE_TEST_SETUP(1_rank)
202BOOST_AUTO_TEST_CASE(InterpolateDataZerothDegree)
203{
204 PRECICE_TEST();
205
206 // Test zeroth degree interpolation
207 const int interpolationDegree = 0;
208 const int valuesSize = 1;
209 Eigen::VectorXd value(valuesSize);
210 Waveform waveform(interpolationDegree);
211 value(0) = 0.0;
212 waveform.setSampleAtTime(0, time::Sample{1, value});
213 value(0) = 1.0;
214 waveform.setSampleAtTime(1, time::Sample{1, value});
215
216 BOOST_TEST(waveform.nDofs() == valuesSize);
217 BOOST_TEST(waveform.nTimes() == 2);
218
219 BOOST_TEST(testing::equals(waveform.sample(0.0)(0), 0.0));
220 BOOST_TEST(testing::equals(waveform.sample(0.5)(0), 1.0));
221 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 1.0));
222
223 value(0) = 2.0;
224 waveform.setSampleAtTime(1, time::Sample{1, value});
225
226 BOOST_TEST(testing::equals(waveform.sample(0.0)(0), 0.0));
227 BOOST_TEST(testing::equals(waveform.sample(0.5)(0), 2.0));
228 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
229
230 waveform.move();
231 BOOST_TEST(waveform.nTimes() == 1);
232
233 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
234 BOOST_TEST(testing::equals(waveform.sample(1.5)(0), 2.0));
235 BOOST_TEST(testing::equals(waveform.sample(2.0)(0), 2.0));
236
237 value(0) = 3.0;
238 waveform.setSampleAtTime(2, time::Sample{1, value});
239
240 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
241 BOOST_TEST(testing::equals(waveform.sample(1.5)(0), 3.0));
242 BOOST_TEST(testing::equals(waveform.sample(2.0)(0), 3.0));
243}
244
245PRECICE_TEST_SETUP(1_rank)
246BOOST_AUTO_TEST_CASE(InterpolateDataFirstDegree)
247{
248 PRECICE_TEST();
249
250 // Test first degree interpolation
251 const int interpolationDegree = 1;
252 const int valuesSize = 1;
253 Eigen::VectorXd value(valuesSize);
254 Waveform waveform(interpolationDegree);
255 value(0) = 0.0;
256 waveform.setSampleAtTime(0, time::Sample{1, value});
257 value(0) = 1.0;
258 waveform.setSampleAtTime(1, time::Sample{1, value});
259
260 BOOST_TEST(waveform.nDofs() == valuesSize);
261 BOOST_TEST(waveform.nTimes() == 2);
262
263 BOOST_TEST(testing::equals(waveform.sample(0.0)(0), 0.0));
264 BOOST_TEST(testing::equals(waveform.sample(0.5)(0), 0.5));
265 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 1.0));
266
267 value(0) = 2.0;
268 waveform.setSampleAtTime(1, time::Sample{1, value});
269
270 BOOST_TEST(testing::equals(waveform.sample(0.0)(0), 0.0));
271 BOOST_TEST(testing::equals(waveform.sample(0.5)(0), 1.0));
272 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
273
274 waveform.move();
275 BOOST_TEST(waveform.nTimes() == 1);
276
277 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
278 BOOST_TEST(testing::equals(waveform.sample(1.5)(0), 2.0));
279 BOOST_TEST(testing::equals(waveform.sample(2.0)(0), 2.0));
280
281 value(0) = 3.0;
282 waveform.setSampleAtTime(2, time::Sample{1, value});
283
284 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
285 BOOST_TEST(testing::equals(waveform.sample(1.5)(0), 2.5));
286 BOOST_TEST(testing::equals(waveform.sample(2.0)(0), 3.0));
287}
288
289// Remove or modify this feature? Creating a second degree interpolant by using data from previous windows is difficult, because this would require several pieces of data during initialization. What would be useful: Generating a second degree interpolant from multiple samples in a single window (if available). This would go into the least-squares direction
290PRECICE_TEST_SETUP(1_rank)
291BOOST_AUTO_TEST_CASE(InterpolateDataSecondDegree)
292{
293 PRECICE_TEST();
294
295 // Test second degree interpolation, but there are not enough samples. Therefore, always only first degree.
296 const int interpolationDegree = 2;
297 const int valuesSize = 1;
298 Eigen::VectorXd value(valuesSize);
299 Waveform waveform(interpolationDegree);
300 value(0) = 0.0;
301 waveform.setSampleAtTime(0, time::Sample{1, value});
302 value(0) = 1.0;
303 waveform.setSampleAtTime(1, time::Sample{1, value});
304
305 BOOST_TEST(waveform.nDofs() == valuesSize);
306 BOOST_TEST(waveform.nTimes() == 2);
307
308 BOOST_TEST(testing::equals(waveform.sample(0.0)(0), 0.0));
309 BOOST_TEST(testing::equals(waveform.sample(0.5)(0), 0.5));
310 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 1.0));
311
312 waveform.trim();
313
314 value(0) = 2.0;
315 waveform.setSampleAtTime(1, time::Sample{1, value});
316
317 BOOST_TEST(testing::equals(waveform.sample(0.0)(0), 0.0));
318 BOOST_TEST(testing::equals(waveform.sample(0.5)(0), 1.0));
319 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
320
321 waveform.move();
322 BOOST_TEST(waveform.nTimes() == 1);
323
324 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
325 BOOST_TEST(testing::equals(waveform.sample(1.5)(0), 2.0));
326 BOOST_TEST(testing::equals(waveform.sample(2.0)(0), 2.0));
327
328 value(0) = 8.0;
329 waveform.setSampleAtTime(2, time::Sample{1, value});
330
331 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
332 BOOST_TEST(testing::equals(waveform.sample(1.5)(0), 5.0));
333 BOOST_TEST(testing::equals(waveform.sample(2.0)(0), 8.0));
334
335 waveform.trim();
336
337 value(0) = 4.0;
338 waveform.setSampleAtTime(2, time::Sample{1, value});
339
340 BOOST_TEST(testing::equals(waveform.sample(1.0)(0), 2.0));
341 BOOST_TEST(testing::equals(waveform.sample(1.5)(0), 3.0));
342 BOOST_TEST(testing::equals(waveform.sample(2.0)(0), 4.0));
343
344 waveform.move();
345 BOOST_TEST(waveform.nTimes() == 1);
346
347 BOOST_TEST(testing::equals(waveform.sample(2.0)(0), 4.0));
348 BOOST_TEST(testing::equals(waveform.sample(2.5)(0), 4.0));
349 BOOST_TEST(testing::equals(waveform.sample(3.0)(0), 4.0));
350
351 value(0) = 8.0;
352 waveform.setSampleAtTime(3, time::Sample{1, value});
353
354 BOOST_TEST(testing::equals(waveform.sample(2.0)(0), 4.0));
355 BOOST_TEST(testing::equals(waveform.sample(2.5)(0), 6.0));
356 BOOST_TEST(testing::equals(waveform.sample(3.0)(0), 8.0));
357}
358
359PRECICE_TEST_SETUP(1_rank)
360BOOST_AUTO_TEST_CASE(InterpolateDataFirstDegreeVector)
361{
362 PRECICE_TEST();
363
364 // Test first degree interpolation
365 const int interpolationDegree = 1;
366 const int valuesSize = 3;
367 Eigen::VectorXd value(valuesSize);
368 Waveform waveform(interpolationDegree);
369 value << 0, 0, 0;
370 waveform.setSampleAtTime(0, time::Sample{1, value});
371 value << 1, 2, 3;
372 waveform.setSampleAtTime(1, time::Sample{1, value});
373
374 BOOST_TEST(waveform.nDofs() == valuesSize);
375 BOOST_TEST(waveform.nTimes() == 2);
376
377 for (int i = 0; i < valuesSize; i++) {
378 BOOST_TEST(testing::equals(waveform.sample(0.0)(i), 0 * value[i]));
379 BOOST_TEST(testing::equals(waveform.sample(0.5)(i), 0.5 * value[i]));
380 BOOST_TEST(testing::equals(waveform.sample(1.0)(i), value[i]));
381 }
382
383 waveform.trim();
384
385 value << 2, 4, 2;
386 waveform.setSampleAtTime(1, time::Sample{1, value});
387
388 for (int i = 0; i < valuesSize; i++) {
389 BOOST_TEST(testing::equals(waveform.sample(0.0)(i), 0 * value[i]));
390 BOOST_TEST(testing::equals(waveform.sample(0.5)(i), 0.5 * value[i]));
391 BOOST_TEST(testing::equals(waveform.sample(1.0)(i), value[i]));
392 }
393
394 waveform.move();
395 BOOST_TEST(waveform.nTimes() == 1);
396
397 for (int i = 0; i < valuesSize; i++) {
398 BOOST_TEST(testing::equals(waveform.sample(1.0)(i), value[i]));
399 BOOST_TEST(testing::equals(waveform.sample(1.5)(i), value[i]));
400 BOOST_TEST(testing::equals(waveform.sample(2.0)(i), value[i]));
401 }
402
403 Eigen::VectorXd value0 = value;
404 value << 1, 2, 3;
405 waveform.setSampleAtTime(2, time::Sample{1, value});
406
407 for (int i = 0; i < valuesSize; i++) {
408 BOOST_TEST(testing::equals(waveform.sample(1.0)(i), value0[i]));
409 BOOST_TEST(testing::equals(waveform.sample(1.5)(i), 0.5 * value0[i] + 0.5 * value[i]));
410 }
411}
412
413PRECICE_TEST_SETUP(1_rank)
414BOOST_AUTO_TEST_CASE(PiecewiseInterpolateDataZerothDegree)
415{
416 PRECICE_TEST();
417
418 // Test zeroth degree interpolation
419 const int interpolationDegree = 0;
420 const int valuesSize = 1;
421 Eigen::VectorXd value(valuesSize);
422 Waveform waveform(interpolationDegree);
423 value(0) = 0.0;
424 waveform.setSampleAtTime(0, time::Sample{1, value});
425 value(0) = 0.5;
426 waveform.setSampleAtTime(0.5, time::Sample{1, value});
427 value(0) = 1.0;
428 waveform.setSampleAtTime(1, time::Sample{1, value});
429
430 BOOST_TEST(waveform.nDofs() == valuesSize);
431 BOOST_TEST(waveform.nTimes() == 3);
432 BOOST_TEST(testing::equals(waveform.sample(0.00)(0), 0.0));
433 BOOST_TEST(testing::equals(waveform.sample(0.25)(0), 0.5));
434 BOOST_TEST(testing::equals(waveform.sample(0.50)(0), 0.5));
435 BOOST_TEST(testing::equals(waveform.sample(0.75)(0), 1.0));
436 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 1.0));
437
438 waveform.trim();
439
440 value(0) = 1.5;
441 waveform.setSampleAtTime(0.5, time::Sample{1, value});
442
443 value(0) = 2.0;
444 waveform.setSampleAtTime(1.0, time::Sample{1, value});
445 BOOST_TEST(testing::equals(waveform.sample(0.00)(0), 0.0));
446 BOOST_TEST(testing::equals(waveform.sample(0.25)(0), 1.5));
447 BOOST_TEST(testing::equals(waveform.sample(0.50)(0), 1.5));
448 BOOST_TEST(testing::equals(waveform.sample(0.75)(0), 2.0));
449 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 2.0));
450
451 waveform.move();
452 BOOST_TEST(waveform.nTimes() == 1);
453
454 BOOST_TEST(testing::equals(waveform.sample(0.00)(0), 2.0));
455 BOOST_TEST(testing::equals(waveform.sample(0.25)(0), 2.0));
456 BOOST_TEST(testing::equals(waveform.sample(0.50)(0), 2.0));
457 BOOST_TEST(testing::equals(waveform.sample(0.75)(0), 2.0));
458 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 2.0));
459
460 value(0) = 3.0;
461 waveform.setSampleAtTime(2.0, time::Sample{1, value});
462 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 2.0));
463 BOOST_TEST(testing::equals(waveform.sample(1.25)(0), 3.0));
464 BOOST_TEST(testing::equals(waveform.sample(1.50)(0), 3.0));
465 BOOST_TEST(testing::equals(waveform.sample(1.75)(0), 3.0));
466 BOOST_TEST(testing::equals(waveform.sample(2.00)(0), 3.0));
467
468 waveform.trim();
469
470 value(0) = 1.5;
471 waveform.setSampleAtTime(1.5, time::Sample{1, value});
472
473 value(0) = 4.0;
474 waveform.setSampleAtTime(2.0, time::Sample{1, value});
475 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 2.0));
476 BOOST_TEST(testing::equals(waveform.sample(1.25)(0), 1.5));
477 BOOST_TEST(testing::equals(waveform.sample(1.50)(0), 1.5));
478 BOOST_TEST(testing::equals(waveform.sample(1.75)(0), 4.0));
479 BOOST_TEST(testing::equals(waveform.sample(2.00)(0), 4.0));
480}
481
482PRECICE_TEST_SETUP(1_rank)
483BOOST_AUTO_TEST_CASE(PiecewiseInterpolateDataFirstDegree)
484{
485 PRECICE_TEST();
486
487 // Test zeroth degree interpolation
488 const int interpolationDegree = 1;
489 const int valuesSize = 1;
490 Eigen::VectorXd value(valuesSize);
491 Waveform waveform(interpolationDegree);
492 value(0) = 0.0;
493 waveform.setSampleAtTime(0, time::Sample{1, value});
494 value(0) = 0.5;
495 waveform.setSampleAtTime(0.5, time::Sample{1, value});
496 value(0) = 1.0;
497 waveform.setSampleAtTime(1, time::Sample{1, value});
498
499 BOOST_TEST(waveform.nDofs() == valuesSize);
500 BOOST_TEST(waveform.nTimes() == 3);
501 BOOST_TEST(testing::equals(waveform.sample(0.00)(0), 0.00));
502 BOOST_TEST(testing::equals(waveform.sample(0.25)(0), 0.25));
503 BOOST_TEST(testing::equals(waveform.sample(0.50)(0), 0.50));
504 BOOST_TEST(testing::equals(waveform.sample(0.75)(0), 0.75));
505 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 1.00));
506
507 value(0) = 1.5;
508 waveform.setSampleAtTime(0.5, time::Sample{1, value});
509
510 value(0) = 2.0;
511 waveform.setSampleAtTime(1.0, time::Sample{1, value});
512 BOOST_TEST(testing::equals(waveform.sample(0.00)(0), 0.00));
513 BOOST_TEST(testing::equals(waveform.sample(0.25)(0), 0.75));
514 BOOST_TEST(testing::equals(waveform.sample(0.50)(0), 1.50));
515 BOOST_TEST(testing::equals(waveform.sample(0.75)(0), 1.75));
516 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 2.00));
517
518 waveform.move();
519 BOOST_TEST(waveform.nTimes() == 1);
520
521 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 2.00));
522 BOOST_TEST(testing::equals(waveform.sample(1.25)(0), 2.00));
523 BOOST_TEST(testing::equals(waveform.sample(1.50)(0), 2.00));
524 BOOST_TEST(testing::equals(waveform.sample(1.75)(0), 2.00));
525 BOOST_TEST(testing::equals(waveform.sample(2.00)(0), 2.00));
526
527 value(0) = 3.0;
528 waveform.setSampleAtTime(2.0, time::Sample{1, value});
529 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 2.00));
530 BOOST_TEST(testing::equals(waveform.sample(1.25)(0), 2.25));
531 BOOST_TEST(testing::equals(waveform.sample(1.50)(0), 2.50));
532 BOOST_TEST(testing::equals(waveform.sample(1.75)(0), 2.75));
533 BOOST_TEST(testing::equals(waveform.sample(2.00)(0), 3.00));
534
535 waveform.trim();
536
537 value(0) = 1.5;
538 waveform.setSampleAtTime(1.5, time::Sample{1, value});
539
540 value(0) = 4.0;
541 waveform.setSampleAtTime(2.0, time::Sample{1, value});
542 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 2.00));
543 BOOST_TEST(testing::equals(waveform.sample(1.25)(0), 1.75));
544 BOOST_TEST(testing::equals(waveform.sample(1.50)(0), 1.50));
545 BOOST_TEST(testing::equals(waveform.sample(1.75)(0), 2.75));
546 BOOST_TEST(testing::equals(waveform.sample(2.00)(0), 4.00));
547}
548
549PRECICE_TEST_SETUP(1_rank)
550BOOST_AUTO_TEST_CASE(PiecewiseInterpolateDataSecondDegree)
551{
552 PRECICE_TEST();
553
554 // Test zeroth degree interpolation
555 const int interpolationDegree = 2;
556 const int valuesSize = 1;
557 Waveform waveform(interpolationDegree);
558 Eigen::VectorXd value(valuesSize);
559 value(0) = 0.0;
560 waveform.setSampleAtTime(0, time::Sample{1, value});
561 value(0) = 0.0;
562 waveform.setSampleAtTime(0.5, time::Sample{1, value});
563 value(0) = 2.0;
564 waveform.setSampleAtTime(1, time::Sample{1, value});
565
566 BOOST_TEST(waveform.nDofs() == valuesSize);
567 BOOST_TEST(waveform.nTimes() == 3);
568 BOOST_TEST(testing::equals(waveform.sample(0.00)(0), 0.00));
569 BOOST_TEST(testing::equals(waveform.sample(0.25)(0), -0.25));
570 BOOST_TEST(testing::equals(waveform.sample(0.50)(0), 0.00));
571 BOOST_TEST(testing::equals(waveform.sample(0.75)(0), 0.75));
572 BOOST_TEST(testing::equals(waveform.sample(1.00)(0), 2.00));
573}
574
575PRECICE_TEST_SETUP(1_rank)
576BOOST_AUTO_TEST_CASE(PiecewiseInterpolateDataThirdDegree)
577{
578 PRECICE_TEST();
579
580 // Test zeroth degree interpolation
581 const int interpolationDegree = 3;
582 const int valuesSize = 1;
583 Waveform waveform(interpolationDegree);
584
585 // linearly increasing values
586 Eigen::VectorXd value(valuesSize);
587 for (double t : std::vector<double>{0, 0.25, 0.5, 0.75, 1}) {
588 value(0) = t;
589 waveform.setSampleAtTime(t, time::Sample{1, value});
590 }
591
592 BOOST_TEST(waveform.nDofs() == valuesSize);
593 BOOST_TEST(waveform.nTimes() == 5);
594
595 for (double t : std::vector<double>{0.1, 0.2, 0.3, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}) {
596 BOOST_TEST(testing::equals(waveform.sample(t)(0), t));
597 }
598
599 waveform.trim();
600
601 // quadratically increasing values
602 for (double t : std::vector<double>{0, 0.25, 0.5, 0.75, 1}) {
603 value(0) = t * t;
604 waveform.setSampleAtTime(t, time::Sample{1, value});
605 }
606
607 // interpolates given values
608 for (double t : std::vector<double>{0, 0.25, 0.5, 0.75, 1}) {
609 BOOST_TEST(testing::equals(waveform.sample(t)(0), t * t));
610 }
611
612 // introduces no approximation error w.r.t function
613 for (double t : std::vector<double>{0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}) {
614 BOOST_TEST(testing::equals(waveform.sample(t)(0), t * t));
615 }
616
617 waveform.trim();
618
619 // cubically increasing values
620 for (double t : std::vector<double>{0, 0.25, 0.5, 0.75, 1}) {
621 value(0) = t * t * t;
622 waveform.setSampleAtTime(t, time::Sample{1, value});
623 }
624
625 // interpolates given values
626 for (double t : std::vector<double>{0, 0.25, 0.5, 0.75, 1}) {
627 BOOST_TEST(testing::equals(waveform.sample(t)(0), t * t * t));
628 }
629
630 // introduces no approximation error w.r.t function
631 for (double t : std::vector<double>{0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}) {
632 BOOST_TEST(testing::equals(waveform.sample(t)(0), t * t * t));
633 }
634
635 waveform.trim();
636
637 // cubically increasing values, but with non-uniform spacing
638 for (double t : std::vector<double>{0, 0.01, 0.1, 0.2, 1}) {
639 value(0) = t * t * t;
640 waveform.setSampleAtTime(t, time::Sample{1, value});
641 }
642
643 // interpolates given values
644 for (double t : std::vector<double>{0, 0.01, 0.1, 0.2, 1}) {
645 BOOST_TEST(testing::equals(waveform.sample(t)(0), t * t * t));
646 }
647
648 // introduces no approximation error w.r.t function
649 for (double t : std::vector<double>{0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}) {
650 BOOST_TEST(testing::equals(waveform.sample(t)(0), t * t * t));
651 }
652
653 waveform.trim();
654
655 // quadratically increasing values, but with non-uniform spacing
656 for (double t : std::vector<double>{0, 0.25, 0.5, 0.75, 1}) {
657 value(0) = t * t * t * t;
658 waveform.setSampleAtTime(t, time::Sample{1, value});
659 }
660
661 // interpolates given values
662 for (double t : std::vector<double>{0, 0.25, 0.5, 0.75, 1}) {
663 BOOST_TEST(testing::equals(waveform.sample(t)(0), t * t * t * t));
664 }
665
666 // introduces approximation error w.r.t function
667 for (double t : std::vector<double>{0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}) {
668 double tol = 0.015625; // error < h**3 = 0.015625
669 BOOST_TEST(testing::equals(waveform.sample(t)(0), t * t * t * t, tol));
670 }
671}
672
674
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
int nTimes() const
Number of stored times.
Definition Waveform.cpp:84
void trim()
Trims this Storage by deleting all values except values associated with the window start.
Definition Waveform.cpp:107
void setSampleAtTime(double time, const Sample &sample)
Store Sample at a specific time.
Definition Waveform.cpp:29
void move()
Move this Storage by deleting all stamples except the one at the end of the window.
Definition Waveform.cpp:95
SampleResult sample(double time) const
Need to use interpolation for the case with changing time grids.
Definition Waveform.cpp:200
int nDofs() const
Number of Dofs for each values.
Definition Waveform.cpp:89
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
contains the time interpolation logic.
Definition Sample.hpp:8
Main namespace of the precice library.