Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_UnitTest_TimeEventList.cpp
Go to the documentation of this file.
1 // @HEADER
2 // ****************************************************************************
3 // Tempus: Copyright (2017) Sandia Corporation
4 //
5 // Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6 // ****************************************************************************
7 // @HEADER
8 
10 #include "Tempus_TimeEventList.hpp"
11 
12 static double PI = M_PI;
13 
14 namespace Tempus_Unit_Test {
15 
16 using Teuchos::RCP;
17 using Teuchos::rcp;
18 using Teuchos::rcp_const_cast;
19 using Teuchos::rcp_dynamic_cast;
20 
21 // ************************************************************
22 // ************************************************************
23 TEUCHOS_UNIT_TEST(TimeEventList, Default_Construction)
24 {
25  auto te = rcp(new Tempus::TimeEventList<double>());
26 
27  TEST_COMPARE(te->getName(), ==, "TimeEventList");
28 
29  TEST_COMPARE(te->getTimeList().size(), ==, 0);
31  te->getRelTol(), std::numeric_limits<double>::epsilon() * 100.0, 1.0e-14);
33  te->getAbsTol(), std::numeric_limits<double>::epsilon() * 100.0, 1.0e-14);
34 
35  TEST_COMPARE(te->getLandOnExactly(), ==, true);
36 
37  // Check base class defaults (functions not implemented in TimeEventList).
38  TEST_COMPARE(te->isIndex(1), ==, false);
39  TEST_COMPARE(te->indexToNextEvent(1), ==, te->getDefaultIndex());
40  TEST_COMPARE(te->indexOfNextEvent(1), ==, te->getDefaultIndex());
41  TEST_COMPARE(te->eventInRangeIndex(1, 4), ==, false);
42 }
43 
44 // ************************************************************
45 // ************************************************************
46 TEUCHOS_UNIT_TEST(TimeEventList, Full_Construction)
47 {
48  std::vector<double> testVector;
49  testVector.push_back(-1.0);
50  testVector.push_back(0.0);
51  testVector.push_back(5.0);
52  testVector.push_back(2.0);
53  testVector.push_back(PI);
54 
55  auto te = rcp(
56  new Tempus::TimeEventList<double>(testVector, "TestName", true, 1.0e-14));
57 
58  TEST_COMPARE(te->getName(), ==, "TestName");
59  TEST_FLOATING_EQUALITY(te->getRelTol(), 1.0e-14, 1.0e-14);
60  TEST_COMPARE(te->getLandOnExactly(), ==, true);
61 
62  auto testList = te->getTimeList();
63  TEST_COMPARE(testList.size(), ==, 5);
64  TEST_FLOATING_EQUALITY(testList[0], -1.0, 1.0e-14);
65  TEST_FLOATING_EQUALITY(testList[1], 0.0, 1.0e-14);
66  TEST_FLOATING_EQUALITY(testList[2], 2.0, 1.0e-14);
67  TEST_FLOATING_EQUALITY(testList[3], PI, 1.0e-14);
68  TEST_FLOATING_EQUALITY(testList[4], 5.0, 1.0e-14);
69 }
70 
71 // ************************************************************
72 // ************************************************************
73 TEUCHOS_UNIT_TEST(TimeEventList, Basic_Accessors)
74 {
75  auto te = rcp(new Tempus::TimeEventList<double>());
76 
77  te->setName("TestName");
78  TEST_COMPARE(te->getName(), ==, "TestName");
79  te->setRelTol(0.1);
80  TEST_FLOATING_EQUALITY(te->getRelTol(), 0.1, 1.0e-14);
81  te->setRelTol(1.0e-14);
82  te->setLandOnExactly(false);
83  TEST_COMPARE(te->getLandOnExactly(), ==, false);
84 
85  // Test addTime.
86  te->addTime(0.0);
87  te->addTime(PI);
88  te->addTime(-1.0);
89  te->addTime(2.0);
90  te->addTime(5.0);
91 
92  // Add times that should not be duplicated.
93  te->addTime(0.0);
94  te->addTime(PI);
95 
96  auto testList = te->getTimeList();
97  TEST_COMPARE(testList.size(), ==, 5);
98  TEST_FLOATING_EQUALITY(testList[0], -1.0, 1.0e-14);
99  TEST_FLOATING_EQUALITY(testList[1], 0.0, 1.0e-14);
100  TEST_FLOATING_EQUALITY(testList[2], 2.0, 1.0e-14);
101  TEST_FLOATING_EQUALITY(testList[3], PI, 1.0e-14);
102  TEST_FLOATING_EQUALITY(testList[4], 5.0, 1.0e-14);
103 
104  // Test that two events within relative tolerance are added or not.
105  te->addTime(2.0 + 1.0e-14);
106  TEST_COMPARE(te->getTimeList().size(), ==, 5);
107  te->addTime(2.0 + 1.0e-13);
108  TEST_COMPARE(te->getTimeList().size(), ==, 6);
109 
110  // Test setTimeList()
111  te->clearTimeList();
112  te->setTimeList(testList);
113  TEST_COMPARE(testList.size(), ==, 5);
114  TEST_FLOATING_EQUALITY(testList[0], -1.0, 1.0e-14);
115  TEST_FLOATING_EQUALITY(testList[1], 0.0, 1.0e-14);
116  TEST_FLOATING_EQUALITY(testList[2], 2.0, 1.0e-14);
117  TEST_FLOATING_EQUALITY(testList[3], PI, 1.0e-14);
118  TEST_FLOATING_EQUALITY(testList[4], 5.0, 1.0e-14);
119 }
120 
121 // ************************************************************
122 // ************************************************************
123 TEUCHOS_UNIT_TEST(TimeEventList, isTime)
124 {
125  auto te = rcp(new Tempus::TimeEventList<double>());
126  te->addTime(0.0);
127  te->addTime(PI);
128  te->addTime(-1.0);
129  te->addTime(2.0);
130  te->addTime(5.0);
131  te->setRelTol(1.0e-14);
132 
133  // Test isTime.
134  // Around first event.
135  TEST_COMPARE(te->isTime(-10.0e-14), ==, false); // Just outside tolerance.
136  TEST_COMPARE(te->isTime(-0.1e-14), ==, true); // Just inside tolerance.
137  TEST_COMPARE(te->isTime(0.0), ==, true); // Right on timeEvent.
138  TEST_COMPARE(te->isTime(0.1e-14), ==, true); // Just inside tolerance.
139  TEST_COMPARE(te->isTime(10.0e-14), ==, false); // Just outside tolerance.
140 
141  // Around mid event.
142  TEST_COMPARE(te->isTime(PI + -10.0e-14), ==,
143  false); // Just outside tolerance.
144  TEST_COMPARE(te->isTime(PI + -0.1e-14), ==, true); // Just inside tolerance.
145  TEST_COMPARE(te->isTime(PI + 0.0), ==, true); // Right on timeEvent.
146  TEST_COMPARE(te->isTime(PI + 0.1e-14), ==, true); // Just inside tolerance.
147  TEST_COMPARE(te->isTime(PI + 10.0e-14), ==,
148  false); // Just outside tolerance.
149 
150  // Around last event.
151  TEST_COMPARE(te->isTime(5.0 + -10.0e-14), ==,
152  false); // Just outside tolerance.
153  TEST_COMPARE(te->isTime(5.0 + -0.1e-14), ==, true); // Just inside tolerance.
154  TEST_COMPARE(te->isTime(5.0 + 0.0), ==, true); // Right on timeEvent.
155  TEST_COMPARE(te->isTime(5.0 + 0.1e-14), ==, true); // Just inside tolerance.
156  TEST_COMPARE(te->isTime(5.0 + 10.0e-14), ==,
157  false); // Just outside tolerance.
158 }
159 
160 // ************************************************************
161 // ************************************************************
162 TEUCHOS_UNIT_TEST(TimeEventList, timeToNextEvent)
163 {
164  std::vector<double> testList;
165  testList.push_back(0.0);
166  testList.push_back(PI);
167  testList.push_back(-1.0);
168  testList.push_back(2.0);
169  testList.push_back(5.0);
170 
171  auto te = rcp(
172  new Tempus::TimeEventList<double>(testList, "testList", true, 1.0e-14));
173 
174  // Test timeToNextEvent.
175  // Around first event.
176  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-1.0 + -10.0e-14), 1.0e-13,
177  1.0e-02);
178  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-1.0 + -0.1e-14), 1.0 + 0.1e-14,
179  1.0e-01);
180  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-1.0 + 0.0), 1.0 + 0.0, 1.0e-02);
181  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-1.0 + 0.1e-14), 1.0 - 0.1e-14,
182  1.0e-02);
183  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-1.0 + 10.0e-14), 1.0 - 1.0e-13,
184  1.0e-14);
185 
186  // Around mid event.
187  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + -10.0e-14), 1.0e-13, 1.0e-02);
188  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + -0.1e-14), 5.0 - PI + 0.1e-14,
189  1.0e-01);
190  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + 0.0), 5.0 - PI + 0.0,
191  1.0e-02);
192  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + 0.1e-14), 5.0 - PI - 0.1e-14,
193  1.0e-01);
194  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + 10.0e-14), 5.0 - PI - 1.0e-13,
195  1.0e-14);
196 
197  // Around last event.
198  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0 + -10.0e-14), 1.0e-13,
199  1.0e-02);
200  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0 + -0.1e-14),
201  te->getDefaultTime(), 1.0e-01);
202  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0 + 0.0), te->getDefaultTime(),
203  1.0e-02);
204  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0 + 0.1e-14),
205  te->getDefaultTime(), 1.0e-01);
206  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0 + 10.0e-14),
207  te->getDefaultTime(), 1.0e-02);
208 }
209 
210 // ************************************************************
211 // ************************************************************
212 TEUCHOS_UNIT_TEST(TimeEventList, timeOfNextEvent)
213 {
214  std::vector<double> testList;
215  testList.push_back(0.0);
216  testList.push_back(PI);
217  testList.push_back(-1.0);
218  testList.push_back(2.0);
219  testList.push_back(5.0);
220 
221  auto te = rcp(
222  new Tempus::TimeEventList<double>(testList, "testList", true, 1.0e-14));
223 
224  // Test timeOfNextEvent.
225  // Around first event.
226  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + -10.0e-14), -1.0, 1.0e-14);
227  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + -0.1e-14), 0.0, 1.0e-14);
228  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + 0.0), 0.0, 1.0e-14);
229  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + 0.1e-14), 0.0, 1.0e-14);
230  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + 10.0e-14), 0.0, 1.0e-14);
231 
232  // Around mid event.
233  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0 + -10.0e-14), 2.0, 1.0e-14);
234  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0 + -0.1e-14), PI, 1.0e-14);
235  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0 + 0.0), PI, 1.0e-14);
236  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0 + 0.1e-14), PI, 1.0e-14);
237  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0 + 10.0e-14), PI, 1.0e-14);
238 
239  // Around last event.
240  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0 + -10.0e-14), 5.0, 1.0e-14);
241  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0 + -0.1e-14),
242  te->getDefaultTime(), 1.0e-14);
243  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0 + 0.0), te->getDefaultTime(),
244  1.0e-14);
245  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0 + 0.1e-14),
246  te->getDefaultTime(), 1.0e-14);
247  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0 + 10.0e-14),
248  te->getDefaultTime(), 1.0e-14);
249 }
250 
251 // ************************************************************
252 // ************************************************************
253 TEUCHOS_UNIT_TEST(TimeEventList, eventInRange)
254 {
255  std::vector<double> testList;
256  testList.push_back(0.0);
257  testList.push_back(PI);
258  testList.push_back(-1.0);
259  testList.push_back(2.0);
260  testList.push_back(5.0);
261 
262  auto te = rcp(
263  new Tempus::TimeEventList<double>(testList, "testList", true, 1.0e-14));
264 
265  // Test eventInRange.
266  // Right end.
267  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + -10.0e-14), ==,
268  false); // Around first event.
269  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + -0.1e-14), ==, true);
270  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + 0.0), ==, true);
271  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + 0.1e-14), ==, true);
272  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + 10.0e-14), ==, true);
273 
274  TEST_COMPARE(te->eventInRange(3.0, PI + -10.0e-14), ==,
275  false); // Around mid event.
276  TEST_COMPARE(te->eventInRange(3.0, PI + -0.1e-14), ==, true);
277  TEST_COMPARE(te->eventInRange(3.0, PI + 0.0), ==, true);
278  TEST_COMPARE(te->eventInRange(3.0, PI + 0.1e-14), ==, true);
279  TEST_COMPARE(te->eventInRange(3.0, PI + 10.0e-14), ==, true);
280 
281  TEST_COMPARE(te->eventInRange(4.5, 5.0 + -10.0e-14), ==,
282  false); // Around last event.
283  TEST_COMPARE(te->eventInRange(4.5, 5.0 + -0.1e-14), ==, true);
284  TEST_COMPARE(te->eventInRange(4.5, 5.0 + 0.0), ==, true);
285  TEST_COMPARE(te->eventInRange(4.5, 5.0 + 0.1e-14), ==, true);
286  TEST_COMPARE(te->eventInRange(4.5, 5.0 + 10.0e-14), ==, true);
287 
288  // Left end.
289  TEST_COMPARE(te->eventInRange(-1.0 + -10.0e-14, -0.5), ==,
290  true); // Around first event.
291  TEST_COMPARE(te->eventInRange(-1.0 + -0.1e-14, -0.5), ==, false);
292  TEST_COMPARE(te->eventInRange(-1.0 + 0.0, -0.5), ==, false);
293  TEST_COMPARE(te->eventInRange(-1.0 + 0.1e-14, -0.5), ==, false);
294  TEST_COMPARE(te->eventInRange(-1.0 + 10.0e-14, -0.5), ==, false);
295 
296  TEST_COMPARE(te->eventInRange(PI + -10.0e-14, 3.5), ==,
297  true); // Around mid event.
298  TEST_COMPARE(te->eventInRange(PI + -0.1e-14, 3.5), ==, false);
299  TEST_COMPARE(te->eventInRange(PI + 0.0, 3.5), ==, false);
300  TEST_COMPARE(te->eventInRange(PI + 0.1e-14, 3.5), ==, false);
301  TEST_COMPARE(te->eventInRange(PI + 10.0e-14, 3.5), ==, false);
302 
303  TEST_COMPARE(te->eventInRange(5.0 + -10.0e-14, 6.0), ==,
304  true); // Around last event.
305  TEST_COMPARE(te->eventInRange(5.0 + -0.1e-14, 6.0), ==, false);
306  TEST_COMPARE(te->eventInRange(5.0 + 0.0, 6.0), ==, false);
307  TEST_COMPARE(te->eventInRange(5.0 + 0.1e-14, 6.0), ==, false);
308  TEST_COMPARE(te->eventInRange(5.0 + 10.0e-14, 6.0), ==, false);
309 }
310 
311 // ************************************************************
312 // ************************************************************
313 TEUCHOS_UNIT_TEST(TimeEventList, getValidParameters)
314 {
315  auto tel = rcp(new Tempus::TimeEventList<double>());
316 
317  auto pl = tel->getValidParameters();
318 
319  TEST_COMPARE(pl->get<std::string>("Type"), ==, "List");
320  TEST_COMPARE(pl->get<std::string>("Name"), ==, "TimeEventList");
321  TEST_FLOATING_EQUALITY(pl->get<double>("Relative Tolerance"),
322  std::numeric_limits<double>::epsilon() * 100.0,
323  1.0e-14);
324  TEST_COMPARE(pl->get<bool>("Land On Exactly"), ==, true);
325  TEST_COMPARE(pl->get<std::string>("Time List"), ==, "");
326 
327  { // Ensure that parameters are "used", excluding sublists.
328  std::ostringstream unusedParameters;
329  pl->unused(unusedParameters);
330  TEST_COMPARE(unusedParameters.str(), ==, "");
331  }
332 }
333 
334 // ************************************************************
335 // ************************************************************
337 {
338  // Construct parameterList similar to getValidParameters().
340  Teuchos::parameterList("Time Event List");
341 
342  pl->set("Name", "Unit Test Time Event List");
343  pl->set("Type", "List");
344  pl->set("Relative Tolerance", 1.0e-10);
345  pl->set("Land On Exactly", false);
346 
347  std::vector<double> times;
348  times.push_back(-0.1);
349  times.push_back(0.1);
350  times.push_back(0.5);
351  times.push_back(1.1);
352  std::ostringstream list;
353  for (std::size_t i = 0; i < times.size() - 1; ++i) list << times[i] << ", ";
354  list << times[times.size() - 1];
355  pl->set<std::string>("Time List", list.str());
356 
357  // Construct TimeEventList from ParameterList.
358  auto tel = Tempus::createTimeEventList<double>(pl);
359 
360  tel->describe(out, Teuchos::VERB_EXTREME);
361 
362  TEST_COMPARE(tel->getName(), ==, "Unit Test Time Event List");
363  TEST_COMPARE(tel->getType(), ==, "List");
364  TEST_FLOATING_EQUALITY(tel->getRelTol(), 1.0e-10, 1.0e-14);
365  TEST_COMPARE(tel->getLandOnExactly(), ==, false);
366  auto teList = tel->getTimeList();
367  TEST_FLOATING_EQUALITY(teList[0], -0.1, 1.0e-14);
368  TEST_FLOATING_EQUALITY(teList[1], 0.1, 1.0e-14);
369  TEST_FLOATING_EQUALITY(teList[2], 0.5, 1.0e-14);
370  TEST_FLOATING_EQUALITY(teList[3], 1.1, 1.0e-14);
371 }
372 
373 } // namespace Tempus_Unit_Test
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEST_COMPARE(v1, comp, v2)
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
TimeEventList specifies a list of time events.
static double PI
Teuchos::RCP< TimeEventList< Scalar > > createTimeEventList(Teuchos::RCP< Teuchos::ParameterList > pList)
Nonmember Constructor via ParameterList.