Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_UnitTest_TimeEventRange.cpp
Go to the documentation of this file.
1 //@HEADER
2 // *****************************************************************************
3 // Tempus: Time Integration and Sensitivity Analysis Package
4 //
5 // Copyright 2017 NTESS and the Tempus contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 //@HEADER
9 
11 #include "Tempus_TimeEventRange.hpp"
12 
13 static double PI = M_PI;
14 
15 namespace Tempus_Unit_Test {
16 
17 using Teuchos::RCP;
18 using Teuchos::rcp;
19 using Teuchos::rcp_const_cast;
20 using Teuchos::rcp_dynamic_cast;
21 
22 // ************************************************************
23 // ************************************************************
24 TEUCHOS_UNIT_TEST(TimeEventRange, Default_Construction)
25 {
26  auto te = rcp(new Tempus::TimeEventRange<double>());
27 
28  TEST_COMPARE(te->getName(), ==, "TimeEventRange (0; 0; 0)");
29  te->setName("TestName");
30  TEST_COMPARE(te->getName(), ==, "TestName");
31 
32  TEST_FLOATING_EQUALITY(te->getTimeStart(), 0.0, 1.0e-14);
33  TEST_FLOATING_EQUALITY(te->getTimeStop(), 0.0, 1.0e-14);
34  TEST_FLOATING_EQUALITY(te->getTimeStride(), 0.0, 1.0e-14);
35  TEST_COMPARE(te->getNumEvents(), ==, 1);
36 
38  te->getRelTol(), std::numeric_limits<double>::epsilon() * 100.0, 1.0e-14);
40  te->getAbsTol(), std::numeric_limits<double>::epsilon() * 100.0, 1.0e-14);
41 
42  TEST_COMPARE(te->getLandOnExactly(), ==, true);
43 }
44 
45 // ************************************************************
46 // ************************************************************
47 TEUCHOS_UNIT_TEST(TimeEventRange, Full_Construction_Stride)
48 {
49  auto te = rcp(new Tempus::TimeEventRange<double>(0.0, PI, 1.0, "TestName",
50  true, 1.0e-14));
51 
52  // te->describe(out, Teuchos::VERB_EXTREME);
53 
54  TEST_COMPARE(te->getName(), ==, "TestName");
55 
56  // Test when everything is zero.
57  TEST_FLOATING_EQUALITY(te->getTimeStart(), 0.0, 1.0e-14);
58  TEST_FLOATING_EQUALITY(te->getTimeStop(), PI, 1.0e-14);
59  TEST_FLOATING_EQUALITY(te->getTimeStride(), 1.0, 1.0e-14);
60  TEST_COMPARE(te->getNumEvents(), ==, 4);
61 
62  auto teRange2 = rcp(new Tempus::TimeEventRange<double>(
63  -PI / 2.0, PI / 2.0, PI / 4.0, "teRange2", true, 1.0e-14));
64 
65  TEST_FLOATING_EQUALITY(teRange2->timeToNextEvent(0.1), PI / 4.0 - 0.1,
66  1.0e-14);
67 }
68 
69 // ************************************************************
70 // ************************************************************
71 TEUCHOS_UNIT_TEST(TimeEventRange, Full_Construction_NumEvents)
72 {
73  auto te = rcp(new Tempus::TimeEventRange<double>(0.0, PI, 5, "TestName", true,
74  1.0e-14));
75 
76  TEST_COMPARE(te->getName(), ==, "TestName");
77 
78  // Test when everything is zero.
79  TEST_FLOATING_EQUALITY(te->getTimeStart(), 0.0, 1.0e-14);
80  TEST_FLOATING_EQUALITY(te->getTimeStop(), PI, 1.0e-14);
81  TEST_FLOATING_EQUALITY(te->getTimeStride(), PI / 4.0, 1.0e-14);
82  TEST_COMPARE(te->getNumEvents(), ==, 5);
83 }
84 
85 // ************************************************************
86 // ************************************************************
87 TEUCHOS_UNIT_TEST(TimeEventRange, Basic_Accessors)
88 {
89  auto te = rcp(new Tempus::TimeEventRange<double>());
90 
91  te->setRelTol(0.1);
92  TEST_FLOATING_EQUALITY(te->getRelTol(), 0.1, 1.0e-14);
93  te->setRelTol(1.0e-14);
94  te->setLandOnExactly(false);
95  TEST_COMPARE(te->getLandOnExactly(), ==, false);
96  te->setLandOnExactly(true);
97 
98  // Reset start after stop.
99  te->setTimeStart(1.0);
100  TEST_FLOATING_EQUALITY(te->getTimeStart(), 1.0, 1.0e-14);
101  TEST_FLOATING_EQUALITY(te->getTimeStop(), 1.0, 1.0e-14);
102  TEST_FLOATING_EQUALITY(te->getTimeStride(), 0.0, 1.0e-14);
103  TEST_COMPARE(te->getNumEvents(), ==, 1);
104 
105  // Reset stop.
106  te->setTimeStop(4.0);
107  TEST_FLOATING_EQUALITY(te->getTimeStart(), 1.0, 1.0e-14);
108  TEST_FLOATING_EQUALITY(te->getTimeStop(), 4.0, 1.0e-14);
109  TEST_FLOATING_EQUALITY(te->getTimeStride(), 3.0, 1.0e-14);
110  TEST_COMPARE(te->getNumEvents(), ==, 2);
111 
112  // Reset stride.
113  te->setTimeStride(0.5);
114  TEST_FLOATING_EQUALITY(te->getTimeStart(), 1.0, 1.0e-14);
115  TEST_FLOATING_EQUALITY(te->getTimeStop(), 4.0, 1.0e-14);
116  TEST_FLOATING_EQUALITY(te->getTimeStride(), 0.5, 1.0e-14);
117  TEST_COMPARE(te->getNumEvents(), ==, 7);
118 }
119 
120 // ************************************************************
121 // ************************************************************
122 TEUCHOS_UNIT_TEST(TimeEventRange, Stride)
123 {
124  auto te = rcp(new Tempus::TimeEventRange<double>());
125  te->setTimeStart(1.0);
126  te->setTimeStop(4.0);
127  te->setTimeStride(0.5);
128 
129  // Negative stride should be reset to stop_-start_.
130  te->setTimeStride(-0.5);
131  TEST_FLOATING_EQUALITY(te->getTimeStart(), 1.0, 1.0e-14);
132  TEST_FLOATING_EQUALITY(te->getTimeStop(), 4.0, 1.0e-14);
133  TEST_FLOATING_EQUALITY(te->getTimeStride(), 0.5, 1.0e-14);
134  TEST_COMPARE(te->getNumEvents(), ==, 7);
135 
136  // Large stride should be reset to stop_-start_.
137  te->setTimeStride(5.0);
138  TEST_FLOATING_EQUALITY(te->getTimeStart(), 1.0, 1.0e-14);
139  TEST_FLOATING_EQUALITY(te->getTimeStop(), 4.0, 1.0e-14);
140  TEST_FLOATING_EQUALITY(te->getTimeStride(), 3.0, 1.0e-14);
141  TEST_COMPARE(te->getNumEvents(), ==, 2);
142 
143  // Stride smaller than relative tolerance should be reset to stop_-start_.
144  te->setTimeStride(1.0e-14);
145  TEST_FLOATING_EQUALITY(te->getTimeStart(), 1.0, 1.0e-14);
146  TEST_FLOATING_EQUALITY(te->getTimeStop(), 4.0, 1.0e-14);
147  TEST_FLOATING_EQUALITY(te->getTimeStride(), 3.0, 1.0e-14);
148  TEST_COMPARE(te->getNumEvents(), ==, 2);
149 }
150 
151 // ************************************************************
152 // ************************************************************
153 TEUCHOS_UNIT_TEST(TimeEventRange, setTimeRange)
154 {
155  auto te = rcp(new Tempus::TimeEventRange<double>());
156 
157  // Set with time range with stride.
158  te->setTimeRange(0.0, PI, 1.0);
159  TEST_FLOATING_EQUALITY(te->getTimeStart(), 0.0, 1.0e-14);
160  TEST_FLOATING_EQUALITY(te->getTimeStop(), PI, 1.0e-14);
161  TEST_FLOATING_EQUALITY(te->getTimeStride(), 1.0, 1.0e-14);
162  TEST_COMPARE(te->getNumEvents(), ==, 4);
163 
164  // Set with time range number of events.
165  te->setTimeRange(0.0, PI, 5);
166  TEST_FLOATING_EQUALITY(te->getTimeStart(), 0.0, 1.0e-14);
167  TEST_FLOATING_EQUALITY(te->getTimeStop(), PI, 1.0e-14);
168  TEST_FLOATING_EQUALITY(te->getTimeStride(), PI / 4.0, 1.0e-14);
169  TEST_COMPARE(te->getNumEvents(), ==, 5);
170 }
171 
172 // ************************************************************
173 // ************************************************************
174 TEUCHOS_UNIT_TEST(TimeEventRange, setNumEvents)
175 {
176  auto te = rcp(new Tempus::TimeEventRange<double>());
177 
178  // Set with time range with stride, then set number of events.
179  te->setTimeRange(0.0, PI, 1.0);
180  te->setNumEvents(5);
181  TEST_FLOATING_EQUALITY(te->getTimeStart(), 0.0, 1.0e-14);
182  TEST_FLOATING_EQUALITY(te->getTimeStop(), PI, 1.0e-14);
183  TEST_FLOATING_EQUALITY(te->getTimeStride(), PI / 4.0, 1.0e-14);
184  TEST_COMPARE(te->getNumEvents(), ==, 5);
185 }
186 
187 // ************************************************************
188 // ************************************************************
189 TEUCHOS_UNIT_TEST(TimeEventRange, isTime)
190 {
191  auto te = rcp(new Tempus::TimeEventRange<double>());
192  te->setTimeRange(0.0, PI, 1.0);
193  te->setRelTol(1.0e-14);
194 
195  // Before first event. (This is exactly one stride before range.)
196  TEST_COMPARE(te->isTime(-1.0 + -10.0e-14), ==,
197  false); // Just outside tolerance.
198  TEST_COMPARE(te->isTime(-1.0 + -0.1e-14), ==,
199  false); // Just inside tolerance.
200  TEST_COMPARE(te->isTime(-1.0 + 0.0), ==, false); // Right on timeEvent.
201  TEST_COMPARE(te->isTime(-1.0 + 0.1e-14), ==,
202  false); // Just inside tolerance.
203  TEST_COMPARE(te->isTime(-1.0 + 10.0e-14), ==,
204  false); // Just outside tolerance.
205 
206  // Around first event.
207  TEST_COMPARE(te->isTime(-10.0e-14), ==, false); // Just outside tolerance.
208  TEST_COMPARE(te->isTime(-0.1e-14), ==, true); // Just inside tolerance.
209  TEST_COMPARE(te->isTime(0.0), ==, true); // Right on timeEvent.
210  TEST_COMPARE(te->isTime(0.1e-14), ==, true); // Just inside tolerance.
211  TEST_COMPARE(te->isTime(10.0e-14), ==, false); // Just outside tolerance.
212 
213  // Around mid event.
214  TEST_COMPARE(te->isTime(1.0 + -10.0e-14), ==,
215  false); // Just outside tolerance.
216  TEST_COMPARE(te->isTime(1.0 + -0.1e-14), ==, true); // Just inside tolerance.
217  TEST_COMPARE(te->isTime(1.0 + 0.0), ==, true); // Right on timeEvent.
218  TEST_COMPARE(te->isTime(1.0 + 0.1e-14), ==, true); // Just inside tolerance.
219  TEST_COMPARE(te->isTime(1.0 + 10.0e-14), ==,
220  false); // Just outside tolerance.
221 
222  // Around last event.
223  TEST_COMPARE(te->isTime(3.0 + -10.0e-14), ==,
224  false); // Just outside tolerance.
225  TEST_COMPARE(te->isTime(3.0 + -0.1e-14), ==, true); // Just inside tolerance.
226  TEST_COMPARE(te->isTime(3.0 + 0.0), ==, true); // Right on timeEvent.
227  TEST_COMPARE(te->isTime(3.0 + 0.1e-14), ==, true); // Just inside tolerance.
228  TEST_COMPARE(te->isTime(3.0 + 10.0e-14), ==,
229  false); // Just outside tolerance.
230 
231  // After last event. (This is exactly one stride after range.)
232  TEST_COMPARE(te->isTime(4.0 + -10.0e-14), ==,
233  false); // Just outside tolerance.
234  TEST_COMPARE(te->isTime(4.0 + -0.1e-14), ==,
235  false); // Just inside tolerance.
236  TEST_COMPARE(te->isTime(4.0 + 0.0), ==, false); // Right on timeEvent.
237  TEST_COMPARE(te->isTime(4.0 + 0.1e-14), ==, false); // Just inside tolerance.
238  TEST_COMPARE(te->isTime(4.0 + 10.0e-14), ==,
239  false); // Just outside tolerance.
240 }
241 
242 // ************************************************************
243 // ************************************************************
244 TEUCHOS_UNIT_TEST(TimeEventRange, timeToNextEvent)
245 {
246  auto te = rcp(new Tempus::TimeEventRange<double>());
247  te->setTimeRange(0.0, PI, 1.0);
248  te->setRelTol(1.0e-14);
249 
250  // Test timeToNextEvent.
251  // Around first event.
252  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-10.0e-14), 10.0e-14,
253  1.0e-14); // Just outside tolerance.
254  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-0.1e-14), 1.0 + 0.1e-14,
255  1.0e-14); // Just inside tolerance.
256  TEST_FLOATING_EQUALITY(te->timeToNextEvent(0.0), 1.0 + 0.0,
257  1.0e-14); // Right on timeEvent.
258  TEST_FLOATING_EQUALITY(te->timeToNextEvent(0.1e-14), 1.0 - 0.1e-14,
259  1.0e-14); // Just inside tolerance.
260  TEST_FLOATING_EQUALITY(te->timeToNextEvent(10.0e-14), 1.0 - 10.0e-14,
261  1.0e-14); // Just outside tolerance.
262 
263  // Around mid event.
264  TEST_FLOATING_EQUALITY(te->timeToNextEvent(1.0 + -10.0e-14), 10.0e-14,
265  1.0e-02); // Just outside tolerance.
266  TEST_FLOATING_EQUALITY(te->timeToNextEvent(1.0 + -0.1e-14), 1.0 + 0.1e-14,
267  1.0e-01); // Just inside tolerance.
268  TEST_FLOATING_EQUALITY(te->timeToNextEvent(1.0 + 0.0), 1.0 + 0.0,
269  1.0e-02); // Right on timeEvent.
270  TEST_FLOATING_EQUALITY(te->timeToNextEvent(1.0 + 0.1e-14), 1.0 - 0.1e-14,
271  1.0e-01); // Just inside tolerance.
272  TEST_FLOATING_EQUALITY(te->timeToNextEvent(1.0 + 10.0e-14), 1.0 - 10.0e-14,
273  1.0e-14); // Just outside tolerance.
274 
275  // Around last event.
276  TEST_FLOATING_EQUALITY(te->timeToNextEvent(3.0 + -10.0e-14), 10.0e-14,
277  1.0e-02); // Just outside tolerance.
278  TEST_FLOATING_EQUALITY(te->timeToNextEvent(3.0 + -0.1e-14),
279  te->getDefaultTime(),
280  1.0e-01); // Just inside tolerance.
281  TEST_FLOATING_EQUALITY(te->timeToNextEvent(3.0 + 0.0), te->getDefaultTime(),
282  1.0e-02); // Right on timeEvent.
283  TEST_FLOATING_EQUALITY(te->timeToNextEvent(3.0 + 0.1e-14),
284  te->getDefaultTime(),
285  1.0e-01); // Just inside tolerance.
286  TEST_FLOATING_EQUALITY(te->timeToNextEvent(3.0 + 10.0e-14),
287  te->getDefaultTime(),
288  1.0e-02); // Just outside tolerance.
289 }
290 
291 // ************************************************************
292 // ************************************************************
293 TEUCHOS_UNIT_TEST(TimeEventRange, timeOfNextEvent)
294 {
295  auto te = rcp(new Tempus::TimeEventRange<double>());
296  te->setTimeRange(0.0, PI, 1.0);
297  te->setRelTol(1.0e-14);
298 
299  // Test timeOfNextEvent.
300  // Around first event.
301  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-10.0e-14), 0.0,
302  1.0e-14); // Just outside tolerance.
303  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-0.1e-14), 1.0,
304  1.0e-14); // Just inside tolerance.
305  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(0.0), 1.0,
306  1.0e-14); // Right on timeEvent.
307  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(0.1e-14), 1.0,
308  1.0e-14); // Just inside tolerance.
309  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(10.0e-14), 1.0,
310  1.0e-14); // Just outside tolerance.
311 
312  // Around mid event.
313  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(1.0 + -10.0e-14), 1.0,
314  1.0e-14); // Just outside tolerance.
315  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(1.0 + -0.1e-14), 2.0,
316  1.0e-14); // Just inside tolerance.
317  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(1.0 + 0.0), 2.0,
318  1.0e-14); // Right on timeEvent.
319  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(1.0 + 0.1e-14), 2.0,
320  1.0e-14); // Just inside tolerance.
321  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(1.0 + 10.0e-14), 2.0,
322  1.0e-14); // Just outside tolerance.
323 
324  // Around last event.
325  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(3.0 + -10.0e-14), 3.0,
326  1.0e-14); // Just outside tolerance.
327  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(3.0 + -0.1e-14),
328  te->getDefaultTime(),
329  1.0e-14); // Just inside tolerance.
330  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(3.0 + 0.0), te->getDefaultTime(),
331  1.0e-14); // Right on timeEvent.
332  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(3.0 + 0.1e-14),
333  te->getDefaultTime(),
334  1.0e-14); // Just inside tolerance.
335  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(3.0 + 10.0e-14),
336  te->getDefaultTime(),
337  1.0e-14); // Just outside tolerance.
338 }
339 
340 // ************************************************************
341 // ************************************************************
342 TEUCHOS_UNIT_TEST(TimeEventRange, eventInRange)
343 {
344  auto te = rcp(new Tempus::TimeEventRange<double>());
345  te->setTimeRange(0.0, PI, 1.0);
346  te->setRelTol(1.0e-14);
347 
348  // Test eventInRange.
349  // Right end of input range.
350  // Around first event.
351  TEST_COMPARE(te->eventInRange(-1.0, -10.0e-14), ==,
352  false); // Just outside tolerance.
353  TEST_COMPARE(te->eventInRange(-1.0, -0.1e-14), ==,
354  true); // Just inside tolerance.
355  TEST_COMPARE(te->eventInRange(-1.0, 0.0), ==, true); // Right on timeEvent.
356  TEST_COMPARE(te->eventInRange(-1.0, 0.1e-14), ==,
357  true); // Just inside tolerance.
358  TEST_COMPARE(te->eventInRange(-1.0, 10.0e-14), ==,
359  true); // Just outside tolerance.
360 
361  // Around mid event.
362  TEST_COMPARE(te->eventInRange(0.5, 1.0 + -10.0e-14), ==,
363  false); // Just outside tolerance.
364  TEST_COMPARE(te->eventInRange(0.5, 1.0 + -0.1e-14), ==,
365  true); // Just inside tolerance.
366  TEST_COMPARE(te->eventInRange(0.5, 1.0 + 0.0), ==,
367  true); // Right on timeEvent.
368  TEST_COMPARE(te->eventInRange(0.5, 1.0 + 0.1e-14), ==,
369  true); // Just inside tolerance.
370  TEST_COMPARE(te->eventInRange(0.5, 1.0 + 10.0e-14), ==,
371  true); // Just outside tolerance.
372 
373  // Around last event.
374  TEST_COMPARE(te->eventInRange(2.5, 3.0 + -10.0e-14), ==,
375  false); // Just outside tolerance.
376  TEST_COMPARE(te->eventInRange(2.5, 3.0 + -0.1e-14), ==,
377  true); // Just inside tolerance.
378  TEST_COMPARE(te->eventInRange(2.5, 3.0 + 0.0), ==,
379  true); // Right on timeEvent.
380  TEST_COMPARE(te->eventInRange(2.5, 3.0 + 0.1e-14), ==,
381  true); // Just inside tolerance.
382  TEST_COMPARE(te->eventInRange(2.5, 3.0 + 10.0e-14), ==,
383  true); // Just outside tolerance.
384 
385  // Left end of input range.
386  // Around first event.
387  TEST_COMPARE(te->eventInRange(-10.0e-14, 0.5), ==,
388  true); // Just outside tolerance.
389  TEST_COMPARE(te->eventInRange(-0.1e-14, 0.5), ==,
390  false); // Just inside tolerance.
391  TEST_COMPARE(te->eventInRange(0.0, 0.5), ==, false); // Right on timeEvent.
392  TEST_COMPARE(te->eventInRange(0.1e-14, 0.5), ==,
393  false); // Just inside tolerance.
394  TEST_COMPARE(te->eventInRange(10.0e-14, 0.5), ==,
395  false); // Just outside tolerance.
396 
397  // Around mid event.
398  TEST_COMPARE(te->eventInRange(1.0 + -10.0e-14, 1.5), ==,
399  true); // Just outside tolerance.
400  TEST_COMPARE(te->eventInRange(1.0 + -0.1e-14, 1.5), ==,
401  false); // Just inside tolerance.
402  TEST_COMPARE(te->eventInRange(1.0 + 0.0, 1.5), ==,
403  false); // Right on timeEvent.
404  TEST_COMPARE(te->eventInRange(1.0 + 0.1e-14, 1.5), ==,
405  false); // Just inside tolerance.
406  TEST_COMPARE(te->eventInRange(1.0 + 10.0e-14, 1.5), ==,
407  false); // Just outside tolerance.
408 
409  // Around last event.
410  TEST_COMPARE(te->eventInRange(3.0 + -10.0e-14, 4.0), ==,
411  true); // Just outside tolerance.
412  TEST_COMPARE(te->eventInRange(3.0 + -0.1e-14, 4.0), ==,
413  false); // Just inside tolerance.
414  TEST_COMPARE(te->eventInRange(3.0 + 0.0, 4.0), ==,
415  false); // Right on timeEvent.
416  TEST_COMPARE(te->eventInRange(3.0 + 0.1e-14, 4.0), ==,
417  false); // Just inside tolerance.
418  TEST_COMPARE(te->eventInRange(3.0 + 10.0e-14, 4.0), ==,
419  false); // Just outside tolerance.
420 }
421 
422 // ************************************************************
423 // ************************************************************
424 TEUCHOS_UNIT_TEST(TimeEventRange, getValidParameters)
425 {
426  auto ter = rcp(new Tempus::TimeEventRange<double>());
427 
428  auto pl = ter->getValidParameters();
429 
430  TEST_COMPARE(pl->get<std::string>("Type"), ==, "Range");
431  TEST_COMPARE(pl->get<std::string>("Name"), ==, "TimeEventRange (0; 0; 0)");
432  TEST_FLOATING_EQUALITY(pl->get<double>("Start Time"), 0.0, 1.0e-14);
433  TEST_FLOATING_EQUALITY(pl->get<double>("Stop Time"), 0.0, 1.0e-14);
434  TEST_FLOATING_EQUALITY(pl->get<double>("Stride Time"), 0.0, 1.0e-14);
435  TEST_COMPARE(pl->get<int>("Number of Events"), ==, 1);
436  TEST_FLOATING_EQUALITY(pl->get<double>("Relative Tolerance"),
437  std::numeric_limits<double>::epsilon() * 100.0,
438  1.0e-14);
439  TEST_COMPARE(pl->get<bool>("Land On Exactly"), ==, true);
440 
441  { // Ensure that parameters are "used", excluding sublists.
442  std::ostringstream unusedParameters;
443  pl->unused(unusedParameters);
444  TEST_COMPARE(unusedParameters.str(), ==, "");
445  }
446 }
447 
448 // ************************************************************
449 // ************************************************************
451 {
452  // Construct parameterList similar to getValidParameters().
454  Teuchos::parameterList("Time Event Range");
455 
456  pl->set("Name", "Unit Test Time Event Range");
457  pl->set("Type", "Range");
458  pl->set("Start Time", -0.1);
459  pl->set("Stop Time", 1.1);
460  pl->set("Stride Time", 0.1);
461  pl->set("Relative Tolerance", 1.0e-10);
462  pl->set("Land On Exactly", false);
463 
464  // Construct TimeEventRange from ParameterList.
465  auto ter = Tempus::createTimeEventRange<double>(pl);
466 
467  // ter->describe(out, Teuchos::VERB_EXTREME);
468 
469  TEST_COMPARE(ter->getName(), ==, "Unit Test Time Event Range");
470  TEST_COMPARE(ter->getType(), ==, "Range");
471  TEST_FLOATING_EQUALITY(ter->getTimeStart(), -0.1, 1.0e-14);
472  TEST_FLOATING_EQUALITY(ter->getTimeStop(), 1.1, 1.0e-14);
473  TEST_FLOATING_EQUALITY(ter->getTimeStride(), 0.1, 1.0e-14);
474  TEST_COMPARE(ter->getNumEvents(), ==, 13);
475  TEST_FLOATING_EQUALITY(ter->getRelTol(), 1.0e-10, 1.0e-14);
476  TEST_COMPARE(ter->getLandOnExactly(), ==, false);
477 }
478 
479 // ************************************************************
480 // ************************************************************
481 TEUCHOS_UNIT_TEST(TimeEventRange, SingleEventAtZero)
482 {
483  auto ter = rcp(new Tempus::TimeEventRange<double>(0.0, 0.0, 0.0,
484  "SingleEventAtZero", true));
485  ter->describe(out, Teuchos::VERB_EXTREME);
486 
487  TEST_COMPARE(ter->getNumEvents(), ==, 1);
488 
489  TEST_COMPARE(ter->isTime(0.0), ==, true);
490  TEST_FLOATING_EQUALITY(ter->timeToNextEvent(-1.0), 1.0, 1.0e-14);
491  TEST_FLOATING_EQUALITY(ter->timeOfNextEvent(-1.0), 0.0, 1.0e-14);
492  TEST_FLOATING_EQUALITY(ter->timeToNextEvent(0.0), ter->getDefaultTime(),
493  1.0e-14);
494  TEST_FLOATING_EQUALITY(ter->timeOfNextEvent(0.0), ter->getDefaultTime(),
495  1.0e-14);
496  TEST_COMPARE(ter->eventInRange(-1.0, 1.0), ==, true);
497  TEST_COMPARE(ter->eventInRange(0.0, 1.0), ==, false);
498  TEST_COMPARE(ter->eventInRange(0.0, 0.0), ==, false);
499 }
500 
501 } // namespace Tempus_Unit_Test
#define TEST_COMPARE(v1, comp, v2)
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
TimeEventRange specifies a start, stop and stride time.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< TimeEventRange< Scalar > > createTimeEventRange(Teuchos::RCP< Teuchos::ParameterList > pList)
Nonmember Constructor via ParameterList.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
static double PI