Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_UnitTest_IntegratorBasic.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 
11 
12 #include "Tempus_StepperBackwardEuler.hpp"
14 
15 namespace Tempus_Unit_Test {
16 
18 using Teuchos::RCP;
19 using Teuchos::rcp;
20 using Teuchos::rcp_const_cast;
21 using Teuchos::rcp_dynamic_cast;
22 using Teuchos::sublist;
23 
25 
26 // ************************************************************
27 // ************************************************************
28 TEUCHOS_UNIT_TEST(IntegratorBasic, Default_Construction)
29 {
30  // Default Construction.
31  auto integrator = Teuchos::rcp(new Tempus::IntegratorBasic<double>());
32  TEST_ASSERT(integrator->isInitialized() == false);
33 
34  TEST_COMPARE(integrator->getIntegratorName(), ==, "Integrator Basic");
35  TEST_COMPARE(integrator->getIntegratorType(), ==, "Integrator Basic");
36  TEST_COMPARE(integrator->getStepper()->getStepperName(), ==, "Forward Euler");
37  TEST_ASSERT(integrator->getStepper()->getModel() == Teuchos::null);
38  TEST_ASSERT(integrator->getSolutionHistory() != Teuchos::null);
39  TEST_COMPARE(integrator->getSolutionHistory()->getNumStates(), ==, 0);
40  TEST_ASSERT(integrator->getTimeStepControl() != Teuchos::null);
41  TEST_ASSERT(integrator->getTimeStepControl()->getStepType() == "Constant");
42  TEST_ASSERT(integrator->getObserver() != Teuchos::null);
43 
44  // Setup ModelEvaluator -------------------------------------
45  auto model = rcp(new Tempus_Test::SinCosModel<double>());
46  integrator->setModel(model);
47 
48  // Setup SolutionHistory ------------------------------------
49  auto inArgsIC = model->getNominalValues();
50  auto icSolution =
51  rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
52  auto icState = Tempus::createSolutionStateX(icSolution);
53  auto solutionHistory = rcp(new Tempus::SolutionHistory<double>());
54  solutionHistory->addState(icState);
55 
56  integrator->setSolutionHistory(solutionHistory);
57  integrator->initialize();
58 
59  TEST_ASSERT(integrator->isInitialized() == true);
60 }
61 
62 // ************************************************************
63 // ************************************************************
64 TEUCHOS_UNIT_TEST(IntegratorBasic, Full_Construction)
65 {
66  auto stepper = rcp(new Tempus::StepperBackwardEuler<double>());
67  auto model = rcp(new Tempus_Test::SinCosModel<double>());
68  stepper->setModel(model);
69 
70  // Setup SolutionHistory ------------------------------------
71  auto inArgsIC = model->getNominalValues();
72  auto icSolution =
73  rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
74  auto icState = Tempus::createSolutionStateX(icSolution);
75  auto solutionHistory = rcp(new Tempus::SolutionHistory<double>());
76  solutionHistory->addState(icState);
77 
78  // Setup TimeStepControl ------------------------------------
79  auto timeStepControl = rcp(new Tempus::TimeStepControl<double>());
80 
81  // Setup IntegratorObserver ---------------------------------
82  auto integratorObserver = rcp(new Tempus::IntegratorObserverBasic<double>());
83 
84  std::vector<int> outputScreenIndices{10, 20, 30};
85  int outputScreenInterval = 72;
86 
87  // Full argument list construction.
88  auto integrator = Teuchos::rcp(new Tempus::IntegratorBasic<double>(
89  stepper, solutionHistory, timeStepControl, integratorObserver,
90  outputScreenIndices, outputScreenInterval));
91 
92  TEST_ASSERT(integrator->isInitialized() == true);
93 
94  TEST_COMPARE(integrator->getIntegratorName(), ==, "Integrator Basic");
95  TEST_COMPARE(integrator->getIntegratorType(), ==, "Integrator Basic");
96  TEST_COMPARE(integrator->getStepper()->getStepperName(), ==,
97  "Backward Euler");
98  TEST_ASSERT(integrator->getStepper()->getModel() != Teuchos::null);
99  TEST_ASSERT(integrator->getSolutionHistory() != Teuchos::null);
100  TEST_COMPARE(integrator->getSolutionHistory()->getNumStates(), ==, 1);
101  TEST_ASSERT(integrator->getTimeStepControl() != Teuchos::null);
102  TEST_ASSERT(integrator->getTimeStepControl()->getStepType() == "Constant");
103  TEST_ASSERT(integrator->getObserver() != Teuchos::null);
104  TEST_ASSERT(integrator->getScreenOutputIndexList() == outputScreenIndices);
105  TEST_ASSERT(integrator->getScreenOutputIndexInterval() ==
106  outputScreenInterval);
107 }
108 
109 // ************************************************************
110 // ************************************************************
111 TEUCHOS_UNIT_TEST(IntegratorBasic, Describe)
112 {
113  // 1) Setup the ParameterList (here we start with params from .xml file)
114  RCP<ParameterList> pl =
115  Teuchos::getParametersFromXmlFile("Tempus_IntegratorBasic_default.xml");
116 
117  // 2) Setup the ModelEvaluator
119 
120  // 3) Setup the Integrator
121  RCP<ParameterList> tempusPL = sublist(pl, "Tempus", true);
123  Tempus::createIntegratorBasic<double>(tempusPL, model);
124 
125  std::ostringstream ss;
127  Teuchos::fancyOStream(Teuchos::rcpFromRef(ss));
128 
129  integrator->describe(*myOut, Teuchos::VERB_EXTREME);
130 
131  auto testS = ss.str();
132 
133  // Find major headers.
134  auto npos = std::string::npos;
135  TEST_ASSERT(npos != testS.find("--- Tempus::IntegratorBasic ---"));
136  TEST_ASSERT(npos != testS.find("--- Tempus::SolutionHistory"));
137  TEST_ASSERT(npos != testS.find("--- SolutionState (index = 0; time = "
138  " 0; dt = 1e+99) ---"));
139  TEST_ASSERT(npos != testS.find("--- Tempus::SolutionStateMetaData ---"));
140  TEST_ASSERT(npos != testS.find("--- Tempus::StepperState"));
141  TEST_ASSERT(npos != testS.find("--- Tempus::PhysicsState"));
142  TEST_ASSERT(npos != testS.find("--- Tempus::TimeStepControl ---"));
143  TEST_ASSERT(npos !=
144  testS.find("--- Tempus::TimeStepControlStrategyConstant ---"));
145  TEST_ASSERT(npos != testS.find("--- Stepper ---"));
146  TEST_ASSERT(npos != testS.find("stepperType_ = Forward Euler"));
147  TEST_ASSERT(npos != testS.find("--- StepperExplicit ---"));
148 
149  integrator->setStatus(Tempus::Status::FAILED);
150  TEST_ASSERT(integrator->getStatus() == Tempus::Status::FAILED);
151  integrator->setStatus(Tempus::Status::WORKING);
152  TEST_ASSERT(integrator->getStatus() == Tempus::Status::WORKING);
153  integrator->setStatus(Tempus::Status::PASSED);
154  TEST_ASSERT(integrator->getStatus() == Tempus::Status::PASSED);
155 }
156 
157 // ************************************************************
158 // ************************************************************
159 TEUCHOS_UNIT_TEST(IntegratorBasic, checkTimeStep)
160 {
162  auto integrator = Tempus::createIntegratorBasic<double>(
163  model, std::string("Backward Euler"));
164 
165  // Ensure initial status is working and unchanged by checkTimeStep.
166  integrator->getNonConstSolutionHistory()->initWorkingState();
167  TEST_ASSERT(integrator->getStatus() == Tempus::Status::WORKING);
168 
169  auto tsc = integrator->getNonConstTimeStepControl();
170  auto ws = integrator->getSolutionHistory()->getWorkingState();
171 
172  // integrator->checkTimeStep();
173 
174  // Test "Too many TimeStep failures"
175  ws->setNFailures(11);
176  integrator->checkTimeStep();
177  TEST_ASSERT(integrator->getStatus() == Tempus::Status::FAILED);
178  // Reset test.
179  ws->setNFailures(0);
180  integrator->setStatus(Tempus::Status::WORKING);
181 
182  // Test "Too many consecutive TimeStep failures"
183  ws->setNConsecutiveFailures(6);
184  integrator->checkTimeStep();
185  TEST_ASSERT(integrator->getStatus() == Tempus::Status::FAILED);
186  // Reset test.
187  ws->setNConsecutiveFailures(0);
188  integrator->setStatus(Tempus::Status::WORKING);
189 
190  // Test "Timestep size is at the minimum timestep size and the step failed."
191  ws->setTimeStep(1.0);
192  ws->setSolutionStatus(Tempus::Status::FAILED);
193  tsc->setMinTimeStep(1.0);
194  integrator->checkTimeStep();
195  TEST_ASSERT(integrator->getStatus() == Tempus::Status::FAILED);
196  // Reset test.
197  ws->setSolutionStatus(Tempus::Status::PASSED);
198  tsc->setMinTimeStep(0.1);
199  integrator->setStatus(Tempus::Status::WORKING);
200 
201  // Test "Stepper failure."
202  ws->setSolutionStatus(Tempus::Status::FAILED);
203  integrator->checkTimeStep();
204  TEST_ASSERT(ws->getNFailures() == 1);
205  TEST_ASSERT(ws->getNRunningFailures() == 1);
206  TEST_ASSERT(ws->getNConsecutiveFailures() == 1);
207  TEST_ASSERT(ws->getSolutionStatus() == Tempus::Status::FAILED);
208  // Reset test.
209  ws->setNFailures(0);
210  ws->setNRunningFailures(0);
211  ws->setNConsecutiveFailures(0);
212  ws->setSolutionStatus(Tempus::Status::PASSED);
213 
214  // Test "Constant time step failure."
216  tsc->setTimeStepControlStrategy(tscs);
217  ws->setTimeStep(0.1);
218  tsc->setInitTimeStep(1.0);
219  integrator->checkTimeStep();
220  TEST_ASSERT(ws->getNFailures() == 1);
221  TEST_ASSERT(ws->getNRunningFailures() == 1);
222  TEST_ASSERT(ws->getNConsecutiveFailures() == 1);
223  TEST_ASSERT(ws->getSolutionStatus() == Tempus::Status::FAILED);
224  // Not resetting test as it is the last test.
225 }
226 
227 // ************************************************************
228 // ************************************************************
229 // Test Integrator creation from ParameterList and ModelEvaluator.
230 TEUCHOS_UNIT_TEST(IntegratorBasic, PL_ME_Creation)
231 {
232  // 1) Setup default Integrator
234  Tempus::createIntegratorBasic<double>();
235 
236  // 2) Setup the ParameterList
237  // - Start with the default Tempus PL
238  // - Add Stepper PL
239  RCP<ParameterList> tempusPL =
240  Teuchos::rcp_const_cast<ParameterList>(integrator->getValidParameters());
241 
242  tempusPL->sublist("Default Integrator").set("Stepper Name", "Demo Stepper");
243  RCP<ParameterList> stepperPL = Teuchos::parameterList();
244  stepperPL->set("Stepper Type", "Forward Euler");
245  tempusPL->set("Demo Stepper", *stepperPL);
246 
247  // 3) Create integrator from non-member function
249  integrator = Tempus::createIntegratorBasic<double>(tempusPL, model);
250 
251  // Test the ParameterList
252  auto testPL = integrator->getValidParameters();
253  // Write out ParameterList to rebaseline test.
254  // writeParameterListToXmlFile(*testPL,"Tempus_IntegratorBasic_ref2-test.xml");
255 
256  // Read params from reference .xml file
257  RCP<ParameterList> referencePL =
258  Teuchos::getParametersFromXmlFile("Tempus_IntegratorBasic_ref.xml");
259 
260  bool pass = haveSameValuesSorted(*testPL, *referencePL, true);
261  if (!pass) {
262  out << std::endl;
263  out << "testPL -------------- \n"
264  << *testPL << std::endl;
265  out << "referencePL -------------- \n"
266  << *referencePL << std::endl;
267  }
268  TEST_ASSERT(pass)
269 }
270 
271 } // namespace Tempus_Unit_Test
Teuchos::RCP< SolutionState< Scalar > > createSolutionStateX(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &xdot=Teuchos::null, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &xdotdot=Teuchos::null)
Nonmember constructor from non-const solution vectors, x.
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)
IntegratorObserverBasic class for time integrators. This basic class has simple no-op functions...
#define TEST_ASSERT(v1)
Sine-Cosine model problem from Rythmos. This is a canonical Sine-Cosine differential equation with a...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
TimeStepControl manages the time step size. There several mechanisms that effect the time step size a...
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
StepControlStrategy class for TimeStepControl.
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")