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