9 #include "Teuchos_UnitTestHarness.hpp"
10 #include "Teuchos_XMLParameterListHelpers.hpp"
11 #include "Teuchos_TimeMonitor.hpp"
13 #include "Thyra_VectorStdOps.hpp"
15 #include "Tempus_IntegratorBasic.hpp"
16 #include "Tempus_IntegratorObserverLogging.hpp"
17 #include "Tempus_IntegratorObserverComposite.hpp"
19 #include "Tempus_StepperRKObserverLogging.hpp"
20 #include "Tempus_StepperRKObserverComposite.hpp"
22 #include "../TestModels/SinCosModel.hpp"
23 #include "../TestModels/VanDerPolModel.hpp"
24 #include "../TestUtils/Tempus_ConvergenceTestUtils.hpp"
28 namespace Tempus_Test {
32 using Teuchos::ParameterList;
33 using Teuchos::sublist;
34 using Teuchos::getParametersFromXmlFile;
40 #define TEST_INTEGRATOROBSERVERLOGGING
41 #define TEST_INTEGRATOROBSERVERCOMPOSITE
42 #define TEST_STEPPERRKOBSERVERLOGGING
47 #ifdef TEST_INTEGRATOROBSERVERLOGGING
51 RCP<ParameterList> pList =
52 getParametersFromXmlFile(
"Tempus_Observer_SinCos.xml");
55 RCP<ParameterList> scm_pl = sublist(pList,
"SinCosModel",
true);
56 RCP<SinCosModel<double> > model =
60 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
61 RCP<Tempus::IntegratorBasic<double> > integrator =
62 Tempus::integratorBasic<double>(pl, model);
64 RCP<Tempus::IntegratorObserverLogging<double> > loggingObs =
66 integrator->setObserver(loggingObs);
69 bool integratorStatus = integrator->advanceTime();
70 TEST_ASSERT(integratorStatus)
73 double time = integrator->getTime();
74 double timeFinal = pl->sublist(
"Demo Integrator")
75 .sublist(
"Time Step Control").get<
double>(
"Final Time");
76 TEST_FLOATING_EQUALITY(time, timeFinal, 1.0e-14);
79 std::map<std::string,int> refCounters;
80 std::list<std::string> refOrder;
82 refCounters[loggingObs->nameObserveStartIntegrator_ ] = 1;
83 refCounters[loggingObs->nameObserveStartTimeStep_ ] = 10;
84 refCounters[loggingObs->nameObserveNextTimeStep_ ] = 10;
85 refCounters[loggingObs->nameObserveBeforeTakeStep_ ] = 10;
86 refCounters[loggingObs->nameObserveAfterTakeStep_ ] = 10;
87 refCounters[loggingObs->nameObserveAfterCheckTimeStep_] = 10;
88 refCounters[loggingObs->nameObserveEndTimeStep_ ] = 10;
89 refCounters[loggingObs->nameObserveEndIntegrator_ ] = 1;
91 refOrder.push_back(loggingObs->nameObserveStartIntegrator_ );
92 for (
int i=0 ; i<10; ++i) {
93 refOrder.push_back(loggingObs->nameObserveStartTimeStep_ );
94 refOrder.push_back(loggingObs->nameObserveNextTimeStep_ );
95 refOrder.push_back(loggingObs->nameObserveBeforeTakeStep_ );
96 refOrder.push_back(loggingObs->nameObserveAfterTakeStep_ );
97 refOrder.push_back(loggingObs->nameObserveAfterCheckTimeStep_);
98 refOrder.push_back(loggingObs->nameObserveEndTimeStep_ );
100 refOrder.push_back(loggingObs->nameObserveEndIntegrator_ );
102 const std::map<std::string,int>& counters = *(loggingObs->getCounters());
103 const std::list<std::string>& order = *(loggingObs->getOrder());
107 counters.find(loggingObs->nameObserveStartIntegrator_ )->second,
108 refCounters.find(loggingObs->nameObserveStartIntegrator_ )->second);
110 counters.find(loggingObs->nameObserveStartTimeStep_ )->second,
111 refCounters.find(loggingObs->nameObserveStartTimeStep_ )->second);
113 counters.find(loggingObs->nameObserveNextTimeStep_ )->second,
114 refCounters.find(loggingObs->nameObserveNextTimeStep_ )->second);
116 counters.find(loggingObs->nameObserveBeforeTakeStep_ )->second,
117 refCounters.find(loggingObs->nameObserveBeforeTakeStep_ )->second);
119 counters.find(loggingObs->nameObserveAfterTakeStep_ )->second,
120 refCounters.find(loggingObs->nameObserveAfterTakeStep_ )->second);
122 counters.find(loggingObs->nameObserveAfterCheckTimeStep_)->second,
123 refCounters.find(loggingObs->nameObserveAfterCheckTimeStep_)->second);
125 counters.find(loggingObs->nameObserveEndTimeStep_ )->second,
126 refCounters.find(loggingObs->nameObserveEndTimeStep_ )->second);
128 counters.find(loggingObs->nameObserveEndIntegrator_ )->second,
129 refCounters.find(loggingObs->nameObserveEndIntegrator_ )->second);
131 TEUCHOS_ASSERT(order.size() == refOrder.size());
132 std::list<std::string>::const_iterator orderIter = order.begin();
133 std::list<std::string>::const_iterator refOrderIter = refOrder.begin();
134 for ( ; orderIter != order.end(); ++orderIter,++refOrderIter) {
136 TEST_EQUALITY(*orderIter, *refOrderIter);
140 loggingObs->resetLogCounters();
142 counters.find(loggingObs->nameObserveStartIntegrator_ )->second, 0);
144 counters.find(loggingObs->nameObserveStartTimeStep_ )->second, 0);
146 counters.find(loggingObs->nameObserveNextTimeStep_ )->second, 0);
148 counters.find(loggingObs->nameObserveBeforeTakeStep_ )->second, 0);
150 counters.find(loggingObs->nameObserveAfterTakeStep_ )->second, 0);
152 counters.find(loggingObs->nameObserveAfterCheckTimeStep_)->second, 0);
154 counters.find(loggingObs->nameObserveEndTimeStep_ )->second, 0);
156 counters.find(loggingObs->nameObserveEndIntegrator_ )->second, 0);
157 TEST_EQUALITY(order.size(), 0);
159 Teuchos::TimeMonitor::summarize();
161 #endif // TEST_INTEGRATOROBSERVERLOGGING
163 #ifdef TEST_INTEGRATOROBSERVERCOMPOSITE
168 RCP<ParameterList> pList =
169 getParametersFromXmlFile(
"Tempus_Observer_SinCos.xml");
172 RCP<ParameterList> scm_pl = sublist(pList,
"SinCosModel",
true);
173 RCP<SinCosModel<double> > model =
177 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
178 RCP<Tempus::IntegratorBasic<double> > integrator =
179 Tempus::integratorBasic<double>(pl, model);
181 RCP<Tempus::IntegratorObserverLogging<double> > loggingObs =
185 RCP<Tempus::IntegratorObserverLogging<double> > loggingObs2 =
188 RCP<Tempus::IntegratorObserverComposite<double> > compObs =
191 compObs->addObserver(loggingObs);
192 compObs->addObserver(loggingObs2);
194 compObs->observeStartIntegrator(*integrator);
195 compObs->observeStartTimeStep(*integrator);
196 compObs->observeBeforeTakeStep(*integrator);
197 compObs->observeAfterTakeStep(*integrator);
198 compObs->observeAfterCheckTimeStep(*integrator);
199 compObs->observeEndTimeStep(*integrator);
202 for (
int i=0 ; i<10; ++i) {
203 compObs->observeStartTimeStep(*integrator);
204 compObs->observeBeforeTakeStep(*integrator);
205 compObs->observeAfterTakeStep(*integrator);
206 compObs->observeAfterCheckTimeStep(*integrator);
207 compObs->observeEndTimeStep(*integrator);
209 compObs->observeEndIntegrator(*integrator);
211 const std::map<std::string,int>& counters = *(loggingObs->getCounters());
214 counters.find(loggingObs->nameObserveStartIntegrator_ )->second, 1);
216 counters.find(loggingObs->nameObserveStartTimeStep_ )->second,11);
218 counters.find(loggingObs->nameObserveBeforeTakeStep_ )->second,11);
220 counters.find(loggingObs->nameObserveAfterTakeStep_ )->second,11);
222 counters.find(loggingObs->nameObserveAfterCheckTimeStep_ )->second,11);
224 counters.find(loggingObs->nameObserveEndTimeStep_ )->second,11);
226 counters.find(loggingObs->nameObserveEndIntegrator_ )->second, 1);
228 counters.find(loggingObs2->nameObserveStartIntegrator_ )->second, 1);
230 counters.find(loggingObs2->nameObserveStartTimeStep_ )->second,11);
232 counters.find(loggingObs2->nameObserveBeforeTakeStep_ )->second,11);
234 counters.find(loggingObs2->nameObserveAfterTakeStep_ )->second,11);
236 counters.find(loggingObs2->nameObserveAfterCheckTimeStep_)->second,11);
238 counters.find(loggingObs2->nameObserveEndTimeStep_ )->second,11);
240 counters.find(loggingObs2->nameObserveEndIntegrator_ )->second, 1);
247 #ifdef TEST_STEPPERRKOBSERVERLOGGING
252 const int erkStageCount = 4;
255 RCP<ParameterList> pList =
256 getParametersFromXmlFile(
"Tempus_Observer_SinCos.xml");
259 RCP<ParameterList> scm_pl = sublist(pList,
"SinCosModel",
true);
260 RCP<SinCosModel<double> > model =
264 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
265 pl->sublist(
"Demo Integrator").set(
"Stepper Name",
"Demo RK Stepper");
266 RCP<Tempus::IntegratorBasic<double> > integrator =
267 Tempus::integratorBasic<double>(pl, model);
269 RCP<Tempus::StepperRKObserverLogging<double> > loggingObs =
272 const auto stepper_observer =
274 (integrator->getStepper()->getObserver(),
true);
277 stepper_observer->addObserver(loggingObs);
280 bool integratorStatus = integrator->advanceTime();
281 TEST_ASSERT(integratorStatus)
284 double time = integrator->getTime();
285 const int numberTimeStep = integrator->getIndex();
286 double timeFinal = pl->sublist(
"Demo Integrator")
287 .sublist(
"Time Step Control").get<
double>(
"Final Time");
288 TEST_FLOATING_EQUALITY(time, timeFinal, 1.0e-14);
291 std::map<std::string,int> refCounters;
292 std::list<std::string> refOrder;
294 refCounters[loggingObs->nameObserveBeginTakeStep_ ] = numberTimeStep;
295 refCounters[loggingObs->nameObserveBeginStage_ ] = erkStageCount * numberTimeStep;
296 refCounters[loggingObs->nameObserveBeforeImplicitExplicitly_] = erkStageCount * numberTimeStep;
297 refCounters[loggingObs->nameObserveBeforeSolve_ ] = erkStageCount * numberTimeStep;
298 refCounters[loggingObs->nameObserveAfterSolve_ ] = erkStageCount * numberTimeStep;
299 refCounters[loggingObs->nameObserveBeforeExplicit_ ] = erkStageCount * numberTimeStep;
300 refCounters[loggingObs->nameObserveEndStage_ ] = erkStageCount * numberTimeStep;
301 refCounters[loggingObs->nameObserveEndTakeStep_ ] = numberTimeStep;
303 for (
int i=0 ; i< numberTimeStep; ++i) {
304 refOrder.push_back(loggingObs->nameObserveBeginTakeStep_ );
305 for (
int j=0; j<erkStageCount; ++j){
306 refOrder.push_back(loggingObs->nameObserveBeginStage_ );
307 refOrder.push_back(loggingObs->nameObserveBeforeImplicitExplicitly_ );
308 refOrder.push_back(loggingObs->nameObserveBeforeSolve_ );
309 refOrder.push_back(loggingObs->nameObserveAfterSolve_ );
310 refOrder.push_back(loggingObs->nameObserveBeforeExplicit_ );
311 refOrder.push_back(loggingObs->nameObserveEndStage_ );
313 refOrder.push_back(loggingObs->nameObserveEndTakeStep_ );
316 const std::map<std::string,int>& counters = *(loggingObs->getCounters());
317 const std::list<std::string>& order = *(loggingObs->getOrder());
321 counters.find(loggingObs->nameObserveBeginTakeStep_ )->second,
322 refCounters.find(loggingObs->nameObserveBeginTakeStep_ )->second);
324 counters.find(loggingObs->nameObserveBeginStage_ )->second,
325 refCounters.find(loggingObs->nameObserveBeginStage_ )->second);
327 counters.find(loggingObs->nameObserveBeforeImplicitExplicitly_ )->second,
328 refCounters.find(loggingObs->nameObserveBeforeImplicitExplicitly_ )->second);
330 counters.find(loggingObs->nameObserveBeforeSolve_ )->second,
331 refCounters.find(loggingObs->nameObserveBeforeSolve_ )->second);
333 counters.find(loggingObs->nameObserveAfterSolve_ )->second,
334 refCounters.find(loggingObs->nameObserveAfterSolve_ )->second);
336 counters.find(loggingObs->nameObserveBeforeExplicit_ )->second,
337 refCounters.find(loggingObs->nameObserveBeforeExplicit_ )->second);
339 counters.find(loggingObs->nameObserveEndStage_ )->second,
340 refCounters.find(loggingObs->nameObserveEndStage_ )->second);
342 counters.find(loggingObs->nameObserveEndTakeStep_ )->second,
343 refCounters.find(loggingObs->nameObserveEndTakeStep_ )->second);
345 TEUCHOS_ASSERT(order.size() == refOrder.size());
347 std::list<std::string>::const_iterator orderIter = order.begin();
348 std::list<std::string>::const_iterator refOrderIter = refOrder.begin();
350 for ( ; orderIter != order.end(); ++orderIter,++refOrderIter) {
351 TEST_EQUALITY(*orderIter, *refOrderIter);
355 loggingObs->resetLogCounters();
357 counters.find(loggingObs->nameObserveBeginTakeStep_)->second, 0);
359 counters.find(loggingObs->nameObserveBeginStage_)->second, 0);
361 counters.find(loggingObs->nameObserveBeforeImplicitExplicitly_)->second, 0);
363 counters.find(loggingObs->nameObserveBeforeSolve_)->second, 0);
365 counters.find(loggingObs->nameObserveAfterSolve_)->second, 0);
367 counters.find(loggingObs->nameObserveBeforeExplicit_)->second, 0);
369 counters.find(loggingObs->nameObserveEndStage_)->second, 0);
371 counters.find(loggingObs->nameObserveEndTakeStep_)->second, 0);
372 TEST_EQUALITY(order.size(), 0);
375 Teuchos::TimeMonitor::summarize();
This observer logs calls to observer functions. This observer simply logs and counts the calls to eac...
Sine-Cosine model problem from Rythmos. This is a canonical Sine-Cosine differential equation with a...
This observer logs calls to observer functions. This observer simply logs and counts the calls to eac...
TEUCHOS_UNIT_TEST(BackwardEuler, SinCos_ASA)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
This observer is a composite observer,.
This observer is a composite observer,.
Solution state for integrators and steppers. SolutionState contains the metadata for solutions and th...