Tempus  Version of the Day
Time Integration
Tempus_IntegratorTest.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 
9 #include "Teuchos_UnitTestHarness.hpp"
10 #include "Teuchos_XMLParameterListHelpers.hpp"
11 #include "Teuchos_TimeMonitor.hpp"
12 
13 #include "Tempus_IntegratorBasic.hpp"
14 
15 #include "../TestModels/SinCosModel.hpp"
16 
17 #include <vector>
18 
19 namespace Tempus_Test {
20 
21 using Teuchos::RCP;
22 using Teuchos::ParameterList;
23 using Teuchos::sublist;
24 using Teuchos::getParametersFromXmlFile;
25 
29 
30 
31 // Test Integrator construction from ParameterList and ModelEvaluator.
32 TEUCHOS_UNIT_TEST(IntegratorBasic, PL_ME_Construction)
33 {
34  // 1) Setup the ParameterList (here we start with params from .xml file)
35  RCP<ParameterList> pl = getParametersFromXmlFile("Tempus_default.xml");
36 
37  // 2) Setup the ModelEvaluator
38  RCP<SinCosModel<double> > model = Teuchos::rcp(new SinCosModel<double> ());
39 
40  // 3) Setup the Integrator
41  RCP<ParameterList> tempusPL = sublist(pl, "Tempus", true);
42  RCP<Tempus::IntegratorBasic<double> > integrator =
43  Tempus::createIntegratorBasic<double>(tempusPL, model);
44 
45  // Test the ParameterList
46  auto testPL = integrator->getValidParameters();
47  // Write out ParameterList to rebaseline test.
48  //writeParameterListToXmlFile(*testPL, "Tempus_IntegratorBasic_ref-test.xml");
49 
50  // Read params from reference .xml file
51  RCP<ParameterList> referencePL =
52  getParametersFromXmlFile("Tempus_IntegratorBasic_ref.xml");
53 
54  bool pass = haveSameValuesSorted(*testPL, *referencePL, true);
55  if (!pass) {
56  std::cout << std::endl;
57  std::cout << "testPL -------------- \n" << *testPL << std::endl;
58  std::cout << "referencePL -------------- \n" << *referencePL << std::endl;
59  }
60  TEST_ASSERT(pass)
61 }
62 
63 
64 // Test integrator construction, and then setParameterList, setStepper, and
65 // initialization.
67 {
68  // 1) Setup the Integrator
69  RCP<Tempus::IntegratorBasic<double> > integrator =
70  Tempus::createIntegratorBasic<double>();
71 
72  // 2) Setup the ParameterList
73  // - Start with the default Tempus PL
74  // - Add Stepper PL
75  RCP<ParameterList> tempusPL = Teuchos::rcp_const_cast<ParameterList>(
76  integrator->getValidParameters());
77 
78  tempusPL->sublist("Default Integrator").set("Stepper Name", "Demo Stepper");
79  RCP<ParameterList> stepperPL = Teuchos::parameterList();
80  stepperPL->set("Stepper Type", "Forward Euler");
81  tempusPL->set("Demo Stepper", *stepperPL);
82 
83  // 3) Create integrator
84  RCP<SinCosModel<double> > model = Teuchos::rcp(new SinCosModel<double> ());
85  integrator = Tempus::createIntegratorBasic<double>(tempusPL, model);
86  integrator->initialize();
87 
88  // Test the ParameterList
89  auto testPL = integrator->getValidParameters();
90  // Write out ParameterList to rebaseline test.
91  //writeParameterListToXmlFile(*testPL,"Tempus_IntegratorBasic_ref2-test.xml");
92 
93  // Read params from reference .xml file
94  RCP<ParameterList> referencePL =
95  getParametersFromXmlFile("Tempus_IntegratorBasic_ref2.xml");
96 
97  bool pass = haveSameValuesSorted(*testPL, *referencePL, true);
98  if (!pass) {
99  std::cout << std::endl;
100  std::cout << "testPL -------------- \n" << *testPL << std::endl;
101  std::cout << "referencePL -------------- \n" << *referencePL << std::endl;
102  }
103  TEST_ASSERT(pass)
104 }
105 
106 
108 {
109  // 1) Setup the ParameterList (here we start with params from .xml file)
110  RCP<ParameterList> pl = getParametersFromXmlFile("Tempus_default.xml");
111 
112  // 2) Setup the ModelEvaluator
113  RCP<SinCosModel<double> > model = Teuchos::rcp(new SinCosModel<double> ());
114 
115  // 3) Setup the Integrator
116  RCP<ParameterList> tempusPL = sublist(pl, "Tempus", true);
117  RCP<Tempus::IntegratorBasic<double> > integrator =
118  Tempus::createIntegratorBasic<double>(tempusPL, model);
119 
120  std::ostringstream ss;
121  Teuchos::RCP<Teuchos::FancyOStream> myOut =
122  Teuchos::fancyOStream(Teuchos::rcpFromRef(ss));
123 
124  integrator->describe(*myOut, Teuchos::VERB_EXTREME);
125 
126  auto testS = ss.str();
127 
128  // Find major headers.
129  auto npos = std::string::npos;
130  TEST_ASSERT(npos != testS.find("--- Tempus::IntegratorBasic ---"));
131  TEST_ASSERT(npos != testS.find("--- Tempus::SolutionHistory"));
132  TEST_ASSERT(npos != testS.find("--- SolutionState (index = 0; time = 0; dt = 1) ---"));
133  TEST_ASSERT(npos != testS.find("--- Tempus::SolutionStateMetaData ---"));
134  TEST_ASSERT(npos != testS.find("--- Tempus::StepperState"));
135  TEST_ASSERT(npos != testS.find("--- Tempus::PhysicsState"));
136  TEST_ASSERT(npos != testS.find("--- Tempus::TimeStepControl ---"));
137  TEST_ASSERT(npos != testS.find("--- Tempus::TimeStepControlStrategyConstant ---"));
138  TEST_ASSERT(npos != testS.find("--- Stepper ---"));
139  TEST_ASSERT(npos != testS.find("stepperType_ = Forward Euler"));
140  TEST_ASSERT(npos != testS.find("--- StepperExplicit ---"));
141 
142  integrator->setStatus(Tempus::Status::FAILED);
143  TEST_ASSERT(integrator->getStatus() == Tempus::Status::FAILED);
144  integrator->setStatus(Tempus::Status::WORKING);
145  TEST_ASSERT(integrator->getStatus() == Tempus::Status::WORKING);
146  integrator->setStatus(Tempus::Status::PASSED);
147  TEST_ASSERT(integrator->getStatus() == Tempus::Status::PASSED);
148 }
149 
150 
151 } // namespace Tempus_Test
Sine-Cosine model problem from Rythmos. This is a canonical Sine-Cosine differential equation with a...
TEUCHOS_UNIT_TEST(BackwardEuler, SinCos_ASA)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Solution state for integrators and steppers. SolutionState contains the metadata for solutions and th...