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 
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 // ************************************************************
25 TEUCHOS_UNIT_TEST(TimeEventList, Default_Construction)
26 {
27  auto te = rcp(new Tempus::TimeEventList<double>());
28 
29  TEST_COMPARE(te->getName(), ==, "TimeEventList");
30 
31  TEST_COMPARE(te->getTimeList().size(), ==, 0);
32  TEST_FLOATING_EQUALITY(te->getRelTol(), std::numeric_limits<double>::epsilon()*100.0, 1.0e-14);
33  TEST_FLOATING_EQUALITY(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 // ************************************************************
47 TEUCHOS_UNIT_TEST(TimeEventList, Full_Construction)
48 {
49  std::vector<double> testVector;
50  testVector.push_back(-1.0);
51  testVector.push_back( 0.0);
52  testVector.push_back( 5.0);
53  testVector.push_back( 2.0);
54  testVector.push_back( PI);
55 
56  auto te = rcp(new Tempus::TimeEventList<double>(
57  testVector, "TestName", true, 1.0e-14));
58 
59  TEST_COMPARE(te->getName(), ==, "TestName");
60  TEST_FLOATING_EQUALITY(te->getRelTol(), 1.0e-14, 1.0e-14);
61  TEST_COMPARE(te->getLandOnExactly(), ==, true);
62 
63  auto testList = te->getTimeList();
64  TEST_COMPARE(testList.size(), ==, 5);
65  TEST_FLOATING_EQUALITY(testList[0], -1.0, 1.0e-14);
66  TEST_FLOATING_EQUALITY(testList[1], 0.0, 1.0e-14);
67  TEST_FLOATING_EQUALITY(testList[2], 2.0, 1.0e-14);
68  TEST_FLOATING_EQUALITY(testList[3], PI, 1.0e-14);
69  TEST_FLOATING_EQUALITY(testList[4], 5.0, 1.0e-14);
70 }
71 
72 
73 // ************************************************************
74 // ************************************************************
75 TEUCHOS_UNIT_TEST(TimeEventList, Basic_Accessors)
76 {
77  auto te = rcp(new Tempus::TimeEventList<double>());
78 
79  te->setName("TestName");
80  TEST_COMPARE(te->getName(), ==, "TestName");
81  te->setRelTol(0.1);
82  TEST_FLOATING_EQUALITY(te->getRelTol(), 0.1, 1.0e-14);
83  te->setRelTol(1.0e-14);
84  te->setLandOnExactly(false);
85  TEST_COMPARE(te->getLandOnExactly(), ==, false);
86 
87  // Test addTime.
88  te->addTime(0.0);
89  te->addTime(PI);
90  te->addTime(-1.0);
91  te->addTime( 2.0);
92  te->addTime( 5.0);
93 
94  // Add times that should not be duplicated.
95  te->addTime(0.0);
96  te->addTime(PI);
97 
98  auto testList = te->getTimeList();
99  TEST_COMPARE(testList.size(), ==, 5);
100  TEST_FLOATING_EQUALITY(testList[0], -1.0, 1.0e-14);
101  TEST_FLOATING_EQUALITY(testList[1], 0.0, 1.0e-14);
102  TEST_FLOATING_EQUALITY(testList[2], 2.0, 1.0e-14);
103  TEST_FLOATING_EQUALITY(testList[3], PI, 1.0e-14);
104  TEST_FLOATING_EQUALITY(testList[4], 5.0, 1.0e-14);
105 
106  // Test that two events within relative tolerance are added or not.
107  te->addTime( 2.0 + 1.0e-14);
108  TEST_COMPARE(te->getTimeList().size(), ==, 5);
109  te->addTime( 2.0 + 1.0e-13);
110  TEST_COMPARE(te->getTimeList().size(), ==, 6);
111 
112  // Test setTimeList()
113  te->clearTimeList();
114  te->setTimeList(testList);
115  TEST_COMPARE(testList.size(), ==, 5);
116  TEST_FLOATING_EQUALITY(testList[0], -1.0, 1.0e-14);
117  TEST_FLOATING_EQUALITY(testList[1], 0.0, 1.0e-14);
118  TEST_FLOATING_EQUALITY(testList[2], 2.0, 1.0e-14);
119  TEST_FLOATING_EQUALITY(testList[3], PI, 1.0e-14);
120  TEST_FLOATING_EQUALITY(testList[4], 5.0, 1.0e-14);
121 }
122 
123 
124 // ************************************************************
125 // ************************************************************
126 TEUCHOS_UNIT_TEST(TimeEventList, isTime)
127 {
128  auto te = rcp(new Tempus::TimeEventList<double>());
129  te->addTime( 0.0);
130  te->addTime( PI);
131  te->addTime(-1.0);
132  te->addTime( 2.0);
133  te->addTime( 5.0);
134  te->setRelTol(1.0e-14);
135 
136  // Test isTime.
137  // Around first event.
138  TEST_COMPARE(te->isTime(-10.0e-14), ==, false); // Just outside tolerance.
139  TEST_COMPARE(te->isTime( -0.1e-14), ==, true ); // Just inside tolerance.
140  TEST_COMPARE(te->isTime( 0.0 ), ==, true ); // Right on timeEvent.
141  TEST_COMPARE(te->isTime( 0.1e-14), ==, true ); // Just inside tolerance.
142  TEST_COMPARE(te->isTime( 10.0e-14), ==, false); // Just outside tolerance.
143 
144  // Around mid event.
145  TEST_COMPARE(te->isTime(PI + -10.0e-14), ==, false); // Just outside tolerance.
146  TEST_COMPARE(te->isTime(PI + -0.1e-14), ==, true ); // Just inside tolerance.
147  TEST_COMPARE(te->isTime(PI + 0.0 ), ==, true ); // Right on timeEvent.
148  TEST_COMPARE(te->isTime(PI + 0.1e-14), ==, true ); // Just inside tolerance.
149  TEST_COMPARE(te->isTime(PI + 10.0e-14), ==, false); // Just outside tolerance.
150 
151  // Around last event.
152  TEST_COMPARE(te->isTime(5.0 + -10.0e-14), ==, 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), ==, false); // Just outside tolerance.
157 }
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(new Tempus::TimeEventList<double>(
172  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, 1.0e-02);
177  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-1.0 + -0.1e-14), 1.0+0.1e-14, 1.0e-01);
178  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-1.0 + 0.0 ), 1.0+0.0 , 1.0e-02);
179  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-1.0 + 0.1e-14), 1.0-0.1e-14, 1.0e-02);
180  TEST_FLOATING_EQUALITY(te->timeToNextEvent(-1.0 + 10.0e-14), 1.0-1.0e-13, 1.0e-14);
181 
182  // Around mid event.
183  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + -10.0e-14), 1.0e-13, 1.0e-02);
184  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + -0.1e-14), 5.0-PI+0.1e-14, 1.0e-01);
185  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + 0.0 ), 5.0-PI+0.0 , 1.0e-02);
186  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + 0.1e-14), 5.0-PI-0.1e-14, 1.0e-01);
187  TEST_FLOATING_EQUALITY(te->timeToNextEvent(PI + 10.0e-14), 5.0-PI-1.0e-13, 1.0e-14);
188 
189  // Around last event.
190  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0+ -10.0e-14), 1.0e-13, 1.0e-02);
191  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0+ -0.1e-14), te->getDefaultTime(), 1.0e-01);
192  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0+ 0.0 ), te->getDefaultTime(), 1.0e-02);
193  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0+ 0.1e-14), te->getDefaultTime(), 1.0e-01);
194  TEST_FLOATING_EQUALITY(te->timeToNextEvent(5.0+ 10.0e-14), te->getDefaultTime(), 1.0e-02);
195 }
196 
197 
198 // ************************************************************
199 // ************************************************************
200 TEUCHOS_UNIT_TEST(TimeEventList, timeOfNextEvent)
201 {
202  std::vector<double> testList;
203  testList.push_back( 0.0);
204  testList.push_back( PI);
205  testList.push_back(-1.0);
206  testList.push_back( 2.0);
207  testList.push_back( 5.0);
208 
209  auto te = rcp(new Tempus::TimeEventList<double>(
210  testList, "testList", true, 1.0e-14));
211 
212  // Test timeOfNextEvent.
213  // Around first event.
214  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + -10.0e-14), -1.0, 1.0e-14);
215  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + -0.1e-14), 0.0, 1.0e-14);
216  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + 0.0 ), 0.0, 1.0e-14);
217  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + 0.1e-14), 0.0, 1.0e-14);
218  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(-1.0 + 10.0e-14), 0.0, 1.0e-14);
219 
220  // Around mid event.
221  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0+ -10.0e-14), 2.0, 1.0e-14);
222  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0+ -0.1e-14), PI, 1.0e-14);
223  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0+ 0.0 ), PI, 1.0e-14);
224  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0+ 0.1e-14), PI, 1.0e-14);
225  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(2.0+ 10.0e-14), PI, 1.0e-14);
226 
227  // Around last event.
228  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0+ -10.0e-14), 5.0, 1.0e-14);
229  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0+ -0.1e-14), te->getDefaultTime(), 1.0e-14);
230  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0+ 0.0 ), te->getDefaultTime(), 1.0e-14);
231  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0+ 0.1e-14), te->getDefaultTime(), 1.0e-14);
232  TEST_FLOATING_EQUALITY(te->timeOfNextEvent(5.0+ 10.0e-14), te->getDefaultTime(), 1.0e-14);
233 }
234 
235 
236 // ************************************************************
237 // ************************************************************
238 TEUCHOS_UNIT_TEST(TimeEventList, eventInRange)
239 {
240  std::vector<double> testList;
241  testList.push_back( 0.0);
242  testList.push_back( PI);
243  testList.push_back(-1.0);
244  testList.push_back( 2.0);
245  testList.push_back( 5.0);
246 
247  auto te = rcp(new Tempus::TimeEventList<double>(
248  testList, "testList", true, 1.0e-14));
249 
250  // Test eventInRange.
251  // Right end.
252  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + -10.0e-14), ==, false); // Around first event.
253  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + -0.1e-14), ==, true );
254  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + 0.0 ), ==, true );
255  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + 0.1e-14), ==, true );
256  TEST_COMPARE(te->eventInRange(-2.0, -1.0 + 10.0e-14), ==, true );
257 
258  TEST_COMPARE(te->eventInRange(3.0, PI + -10.0e-14), ==, false); // Around mid event.
259  TEST_COMPARE(te->eventInRange(3.0, PI + -0.1e-14), ==, true );
260  TEST_COMPARE(te->eventInRange(3.0, PI + 0.0 ), ==, true );
261  TEST_COMPARE(te->eventInRange(3.0, PI + 0.1e-14), ==, true );
262  TEST_COMPARE(te->eventInRange(3.0, PI + 10.0e-14), ==, true );
263 
264  TEST_COMPARE(te->eventInRange(4.5, 5.0 + -10.0e-14), ==, false); // Around last event.
265  TEST_COMPARE(te->eventInRange(4.5, 5.0 + -0.1e-14), ==, true );
266  TEST_COMPARE(te->eventInRange(4.5, 5.0 + 0.0 ), ==, true );
267  TEST_COMPARE(te->eventInRange(4.5, 5.0 + 0.1e-14), ==, true );
268  TEST_COMPARE(te->eventInRange(4.5, 5.0 + 10.0e-14), ==, true );
269 
270  // Left end.
271  TEST_COMPARE(te->eventInRange(-1.0 + -10.0e-14, -0.5), ==, true ); // Around first event.
272  TEST_COMPARE(te->eventInRange(-1.0 + -0.1e-14, -0.5), ==, false);
273  TEST_COMPARE(te->eventInRange(-1.0 + 0.0 , -0.5), ==, false);
274  TEST_COMPARE(te->eventInRange(-1.0 + 0.1e-14, -0.5), ==, false);
275  TEST_COMPARE(te->eventInRange(-1.0 + 10.0e-14, -0.5), ==, false);
276 
277  TEST_COMPARE(te->eventInRange(PI + -10.0e-14, 3.5), ==, true ); // Around mid event.
278  TEST_COMPARE(te->eventInRange(PI + -0.1e-14, 3.5), ==, false);
279  TEST_COMPARE(te->eventInRange(PI + 0.0 , 3.5), ==, false);
280  TEST_COMPARE(te->eventInRange(PI + 0.1e-14, 3.5), ==, false);
281  TEST_COMPARE(te->eventInRange(PI + 10.0e-14, 3.5), ==, false);
282 
283  TEST_COMPARE(te->eventInRange(5.0 + -10.0e-14, 6.0), ==, true ); // Around last event.
284  TEST_COMPARE(te->eventInRange(5.0 + -0.1e-14, 6.0), ==, false);
285  TEST_COMPARE(te->eventInRange(5.0 + 0.0 , 6.0), ==, false);
286  TEST_COMPARE(te->eventInRange(5.0 + 0.1e-14, 6.0), ==, false);
287  TEST_COMPARE(te->eventInRange(5.0 + 10.0e-14, 6.0), ==, false);
288 }
289 
290 
291 // ************************************************************
292 // ************************************************************
293 TEUCHOS_UNIT_TEST(TimeEventList, getValidParameters)
294 {
295  auto tel = rcp(new Tempus::TimeEventList<double>());
296 
297  auto pl = tel->getValidParameters();
298 
299  TEST_COMPARE (pl->get<std::string>("Type"), ==, "List");
300  TEST_COMPARE (pl->get<std::string>("Name"), ==, "TimeEventList");
301  TEST_FLOATING_EQUALITY(pl->get<double>("Relative Tolerance"),
302  std::numeric_limits<double>::epsilon()*100.0, 1.0e-14);
303  TEST_COMPARE (pl->get<bool>("Land On Exactly"), ==, true);
304  TEST_COMPARE (pl->get<std::string>("Time List"), ==, "");
305 
306  { // Ensure that parameters are "used", excluding sublists.
307  std::ostringstream unusedParameters;
308  pl->unused(unusedParameters);
309  TEST_COMPARE ( unusedParameters.str(), ==, "");
310  }
311 }
312 
313 
314 // ************************************************************
315 // ************************************************************
317 {
318  // Construct parameterList similar to getValidParameters().
319  Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList("Time Event List");
320 
321  pl->set("Name", "Unit Test Time Event List");
322  pl->set("Type", "List");
323  pl->set("Relative Tolerance", 1.0e-10);
324  pl->set("Land On Exactly", false);
325 
326  std::vector<double> times;
327  times.push_back(-0.1);
328  times.push_back( 0.1);
329  times.push_back( 0.5);
330  times.push_back( 1.1);
331  std::ostringstream list;
332  for(std::size_t i = 0; i < times.size()-1; ++i) list << times[i] << ", ";
333  list << times[times.size()-1];
334  pl->set<std::string>("Time List", list.str());
335 
336  // Construct TimeEventList from ParameterList.
337  auto tel = Tempus::createTimeEventList<double>(pl);
338 
339  tel->describe(out, Teuchos::VERB_EXTREME);
340 
341  TEST_COMPARE ( tel->getName() , ==, "Unit Test Time Event List");
342  TEST_COMPARE ( tel->getType() , ==, "List" );
343  TEST_FLOATING_EQUALITY( tel->getRelTol() , 1.0e-10, 1.0e-14);
344  TEST_COMPARE ( tel->getLandOnExactly(), ==, false );
345  auto teList = tel->getTimeList();
346  TEST_FLOATING_EQUALITY( teList[0], -0.1, 1.0e-14);
347  TEST_FLOATING_EQUALITY( teList[1], 0.1, 1.0e-14);
348  TEST_FLOATING_EQUALITY( teList[2], 0.5, 1.0e-14);
349  TEST_FLOATING_EQUALITY( teList[3], 1.1, 1.0e-14);
350 }
351 
352 
353 } // 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.