Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_UnitTest_TimeEventRangeIndex.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 
11 #include "Tempus_TimeEventRangeIndex.hpp"
12 
13 namespace Tempus_Unit_Test {
14 
15 using Teuchos::RCP;
16 using Teuchos::rcp;
17 using Teuchos::rcp_const_cast;
18 using Teuchos::rcp_dynamic_cast;
19 
20 // ************************************************************
21 // ************************************************************
22 TEUCHOS_UNIT_TEST(TimeEventRangeIndex, Default_Construction)
23 {
25 
26  TEST_COMPARE(te->getName(), ==, "TimeEventRangeIndex (0; 0; 1)");
27 
28  // Test when everything is zero.
29  TEST_COMPARE(te->getIndexStart(), ==, 0);
30  TEST_COMPARE(te->getIndexStop(), ==, 0);
31  TEST_COMPARE(te->getIndexStride(), ==, 1);
32  TEST_COMPARE(te->getNumEvents(), ==, 1);
33 
34  // Check base class defaults (functions not implemented in
35  // TimeEventRangeIndex).
36  TEST_COMPARE(te->isTime(1.0), ==, false);
37  TEST_COMPARE(te->timeToNextEvent(1.0), ==, te->getDefaultTime());
38  TEST_COMPARE(te->timeOfNextEvent(1.0), ==, te->getDefaultTime());
39  TEST_COMPARE(te->eventInRange(1.0, 4.0), ==, false);
40 }
41 
42 // ************************************************************
43 // ************************************************************
44 TEUCHOS_UNIT_TEST(TimeEventRangeIndex, Construction)
45 {
46  auto te = rcp(new Tempus::TimeEventRangeIndex<double>(-1, 10, 2, "TestName"));
47 
48  TEST_COMPARE(te->getName(), ==, "TestName");
49 
50  // Test when everything is zero.
51  TEST_COMPARE(te->getIndexStart(), ==, -1);
52  TEST_COMPARE(te->getIndexStop(), ==, 10);
53  TEST_COMPARE(te->getIndexStride(), ==, 2);
54  TEST_COMPARE(te->getNumEvents(), ==, 6);
55 }
56 
57 // ************************************************************
58 // ************************************************************
59 TEUCHOS_UNIT_TEST(TimeEventRangeIndex, Basic_Accesors)
60 {
62 
63  te->setName("TestName");
64  TEST_COMPARE(te->getName(), ==, "TestName");
65 
66  // Reset start after stop.
67  te->setIndexStart(1);
68  TEST_COMPARE(te->getIndexStart(), ==, 1);
69  TEST_COMPARE(te->getIndexStop(), ==, 1);
70  TEST_COMPARE(te->getIndexStride(), ==, 1);
71  TEST_COMPARE(te->getNumEvents(), ==, 1);
72 
73  // Reset stop.
74  te->setIndexStop(5);
75  TEST_COMPARE(te->getIndexStart(), ==, 1);
76  TEST_COMPARE(te->getIndexStop(), ==, 5);
77  TEST_COMPARE(te->getIndexStride(), ==, 1);
78  TEST_COMPARE(te->getNumEvents(), ==, 5);
79 
80  // Reset stride.
81  te->setIndexStride(2);
82  TEST_COMPARE(te->getIndexStart(), ==, 1);
83  TEST_COMPARE(te->getIndexStop(), ==, 5);
84  TEST_COMPARE(te->getIndexStride(), ==, 2);
85  TEST_COMPARE(te->getNumEvents(), ==, 3);
86 
87  // Set with index range.
88  te->setIndexRange(-5, 5, 3);
89  TEST_COMPARE(te->getIndexStart(), ==, -5);
90  TEST_COMPARE(te->getIndexStop(), ==, 5);
91  TEST_COMPARE(te->getIndexStride(), ==, 3);
92  TEST_COMPARE(te->getNumEvents(), ==, 4);
93 }
94 
95 // ************************************************************
96 // ************************************************************
97 TEUCHOS_UNIT_TEST(TimeEventRangeIndex, Stride)
98 {
100  te->setIndexStart(1);
101  te->setIndexStop(5);
102  TEST_COMPARE(te->getIndexStart(), ==, 1);
103  TEST_COMPARE(te->getIndexStop(), ==, 5);
104 
105  // Negative stride should be reset to stop_-start_.
106  te->setIndexStride(-1);
107  TEST_COMPARE(te->getIndexStride(), ==, 1);
108  TEST_COMPARE(te->getNumEvents(), ==, 5);
109 
110  // Large stride should be reset to stop_-start_.
111  te->setIndexStride(5);
112  TEST_COMPARE(te->getIndexStride(), ==, 4);
113  TEST_COMPARE(te->getNumEvents(), ==, 2);
114 }
115 
116 // ************************************************************
117 // ************************************************************
118 TEUCHOS_UNIT_TEST(TimeEventRangeIndex, isIndex)
119 {
120  auto te = rcp(new Tempus::TimeEventRangeIndex<double>());
121  te->setIndexRange(-5, 5, 3);
122 
123  // Test isIndex.
124  TEST_COMPARE(te->isIndex(-6), ==, false); // Around first event.
125  TEST_COMPARE(te->isIndex(-5), ==, true);
126  TEST_COMPARE(te->isIndex(-4), ==, false);
127 
128  TEST_COMPARE(te->isIndex(0), ==, false); // Around mid event.
129  TEST_COMPARE(te->isIndex(1), ==, true);
130  TEST_COMPARE(te->isIndex(2), ==, false);
131 
132  TEST_COMPARE(te->isIndex(3), ==, false); // Around last event.
133  TEST_COMPARE(te->isIndex(4), ==, true);
134  TEST_COMPARE(te->isIndex(5), ==, false);
135 }
136 
137 // ************************************************************
138 // ************************************************************
139 TEUCHOS_UNIT_TEST(TimeEventRangeIndex, indexToNextEvent)
140 {
141  auto te = rcp(new Tempus::TimeEventRangeIndex<double>());
142  te->setIndexRange(-5, 5, 3);
143 
144  // Test indexToNextEvent.
145  TEST_COMPARE(te->indexToNextEvent(-9), ==, 4); // Around first event.
146  TEST_COMPARE(te->indexToNextEvent(-5), ==, 3);
147  TEST_COMPARE(te->indexToNextEvent(-4), ==, 2);
148 
149  TEST_COMPARE(te->indexToNextEvent(-1), ==, 2); // Around mid event.
150  TEST_COMPARE(te->indexToNextEvent(1), ==, 3);
151  TEST_COMPARE(te->indexToNextEvent(3), ==, 1);
152 
153  TEST_COMPARE(te->indexToNextEvent(2), ==, 2); // Around last event.
154  TEST_COMPARE(te->indexToNextEvent(4), ==, te->getDefaultIndex() - 4);
155  TEST_COMPARE(te->indexToNextEvent(8), ==, te->getDefaultIndex() - 8);
156 }
157 
158 // ************************************************************
159 // ************************************************************
160 TEUCHOS_UNIT_TEST(TimeEventRangeIndex, indexOfNextEvent)
161 {
162  auto te = rcp(new Tempus::TimeEventRangeIndex<double>());
163  te->setIndexRange(-5, 5, 3);
164 
165  // Test indexOfNextEvent.
166  TEST_COMPARE(te->indexOfNextEvent(-9), ==, -5); // Around first event.
167  TEST_COMPARE(te->indexOfNextEvent(-5), ==, -2);
168  TEST_COMPARE(te->indexOfNextEvent(-4), ==, -2);
169 
170  TEST_COMPARE(te->indexOfNextEvent(-1), ==, 1); // Around mid event.
171  TEST_COMPARE(te->indexOfNextEvent(1), ==, 4);
172  TEST_COMPARE(te->indexOfNextEvent(3), ==, 4);
173 
174  TEST_COMPARE(te->indexOfNextEvent(2), ==, 4); // Around last event.
175  TEST_COMPARE(te->indexOfNextEvent(4), ==, te->getDefaultIndex());
176  TEST_COMPARE(te->indexOfNextEvent(8), ==, te->getDefaultIndex());
177 }
178 
179 // ************************************************************
180 // ************************************************************
181 TEUCHOS_UNIT_TEST(TimeEventRangeIndex, eventInRangeIndex)
182 {
183  auto te = rcp(new Tempus::TimeEventRangeIndex<double>());
184  te->setIndexRange(-5, 5, 3);
185 
186  // Test eventInRangeIndex.
187  // Right end.
188  TEST_COMPARE(te->eventInRangeIndex(-9, -6), ==,
189  false); // Around first event.
190  TEST_COMPARE(te->eventInRangeIndex(-9, -5), ==, true);
191  TEST_COMPARE(te->eventInRangeIndex(-9, -4), ==, true);
192 
193  TEST_COMPARE(te->eventInRangeIndex(-1, 0), ==, false); // Around mid event.
194  TEST_COMPARE(te->eventInRangeIndex(-1, 1), ==, true);
195  TEST_COMPARE(te->eventInRangeIndex(-1, 2), ==, true);
196 
197  TEST_COMPARE(te->eventInRangeIndex(2, 3), ==, false); // Around last event.
198  TEST_COMPARE(te->eventInRangeIndex(2, 4), ==, true);
199  TEST_COMPARE(te->eventInRangeIndex(2, 5), ==, true);
200 
201  // Left end.
202  TEST_COMPARE(te->eventInRangeIndex(-6.0, -3), ==,
203  true); // Around first event.
204  TEST_COMPARE(te->eventInRangeIndex(-5.0, -3), ==, false);
205  TEST_COMPARE(te->eventInRangeIndex(-4.0, -3), ==, false);
206 
207  TEST_COMPARE(te->eventInRangeIndex(-3, 0), ==, true); // Around mid event.
208  TEST_COMPARE(te->eventInRangeIndex(-2, 0), ==, false);
209  TEST_COMPARE(te->eventInRangeIndex(-1, 0), ==, false);
210 
211  TEST_COMPARE(te->eventInRangeIndex(3, 8), ==, true); // Around last event.
212  TEST_COMPARE(te->eventInRangeIndex(4, 8), ==, false);
213  TEST_COMPARE(te->eventInRangeIndex(5, 8), ==, false);
214 }
215 
216 // ************************************************************
217 // ************************************************************
218 TEUCHOS_UNIT_TEST(TimeEventRangeIndex, getValidParameters)
219 {
220  auto teri = rcp(new Tempus::TimeEventRangeIndex<double>());
221 
222  auto pl = teri->getValidParameters();
223 
224  TEST_COMPARE(pl->get<std::string>("Type"), ==, "Range Index");
225  TEST_COMPARE(pl->get<std::string>("Name"), ==,
226  "TimeEventRangeIndex (0; 0; 1)");
227  TEST_COMPARE(pl->get<int>("Start Index"), ==, 0);
228  TEST_COMPARE(pl->get<int>("Stop Index"), ==, 0);
229  TEST_COMPARE(pl->get<int>("Stride Index"), ==, 1);
230 
231  { // Ensure that parameters are "used", excluding sublists.
232  std::ostringstream unusedParameters;
233  pl->unused(unusedParameters);
234  TEST_COMPARE(unusedParameters.str(), ==, "");
235  }
236 }
237 
238 // ************************************************************
239 // ************************************************************
241 {
242  // Construct parameterList similar to getValidParameters().
244  Teuchos::parameterList("Time Event Range Index");
245 
246  pl->set("Name", "Unit Test Time Event Range Index");
247  pl->set("Type", "Range Index");
248  pl->set("Start Index", -1);
249  pl->set("Stop Index", 11);
250  pl->set("Stride Index", 2);
251 
252  // Construct TimeEventRangeIndex from ParameterList.
253  auto teri = Tempus::createTimeEventRangeIndex<double>(pl);
254 
255  teri->describe(out, Teuchos::VERB_EXTREME);
256 
257  TEST_COMPARE(teri->getName(), ==, "Unit Test Time Event Range Index");
258  TEST_COMPARE(teri->getType(), ==, "Range Index");
259  TEST_COMPARE(teri->getIndexStart(), ==, -1);
260  TEST_COMPARE(teri->getIndexStop(), ==, 11);
261  TEST_COMPARE(teri->getIndexStride(), ==, 2);
262  TEST_COMPARE(teri->getNumEvents(), ==, 7);
263 }
264 
265 } // namespace Tempus_Unit_Test
TimeEventRangeIndex specifies a start, stop and stride index.
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)
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)