Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
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
13static double PI = M_PI;
14
15namespace Tempus_Unit_Test {
16
17using Teuchos::RCP;
18using Teuchos::rcp;
19using Teuchos::rcp_const_cast;
20using Teuchos::rcp_dynamic_cast;
21
22
23// ************************************************************
24// ************************************************************
25TEUCHOS_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// ************************************************************
47TEUCHOS_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// ************************************************************
75TEUCHOS_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// ************************************************************
126TEUCHOS_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// ************************************************************
162TEUCHOS_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// ************************************************************
200TEUCHOS_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// ************************************************************
238TEUCHOS_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// ************************************************************
293TEUCHOS_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// ************************************************************
316TEUCHOS_UNIT_TEST(TimeEventList, createTimeEventList)
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_Test
static double PI
TimeEventList specifies a list of time events.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)