9 #include "Teuchos_UnitTestHarness.hpp" 10 #include "Teuchos_XMLParameterListHelpers.hpp" 11 #include "Teuchos_TimeMonitor.hpp" 12 #include "Teuchos_DefaultComm.hpp" 14 #include "Thyra_VectorStdOps.hpp" 18 #include "../TestModels/SinCosModel.hpp" 19 #include "../TestModels/DahlquistTestModel.hpp" 20 #include "../TestUtils/Tempus_ConvergenceTestUtils.hpp" 30 using Teuchos::rcp_const_cast;
31 using Teuchos::rcp_dynamic_cast;
32 using Teuchos::ParameterList;
33 using Teuchos::sublist;
34 using Teuchos::getParametersFromXmlFile;
45 TEUCHOS_ASSERT(stepper->getOrder() == 2);
71 class StepperRKModifierEDIRK_TrapezoidaTest
77 StepperRKModifierEDIRK_TrapezoidaTest(Teuchos::FancyOStream &Out,
bool &Success)
78 : out(Out), success(Success)
83 virtual ~StepperRKModifierEDIRK_TrapezoidaTest(){}
91 const double relTol = 1.0e-14;
92 auto stageNumber = stepper->getStageNumber();
93 Teuchos::SerialDenseVector<int,double> c = stepper->getTableau()->c();
95 auto currentState = sh->getCurrentState();
96 auto workingState = sh->getWorkingState();
97 const double dt = workingState->getTimeStep();
98 double time = currentState->getTime();
99 if (stageNumber >= 0) time += c(stageNumber)*dt;
101 auto x = workingState->getX();
102 auto xDot = workingState->getXDot();
103 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
109 auto DME = Teuchos::rcp_dynamic_cast<
111 TEST_FLOATING_EQUALITY(DME->getLambda(), -1.0, relTol);
113 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
115 const double x_0 = get_ele(*(x), 0);
116 const double xDot_0 = get_ele(*(xDot), 0);
117 TEST_FLOATING_EQUALITY(x_0, 1.0, relTol);
118 TEST_FLOATING_EQUALITY(xDot_0, -1.0, relTol);
119 TEST_ASSERT(std::abs(time) < relTol);
120 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
121 TEST_COMPARE(stageNumber, ==, -1);
127 const double X_i = get_ele(*(x), 0);
128 const double f_i = get_ele(*(xDot), 0);
130 if (stageNumber == 0) {
131 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
132 TEST_ASSERT(std::abs(f_i) < relTol);
133 TEST_ASSERT(std::abs(time) < relTol);
134 }
else if (stageNumber == 1) {
135 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
136 TEST_FLOATING_EQUALITY(f_i, -1.0, relTol);
137 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
139 TEUCHOS_TEST_FOR_EXCEPT( !(-1 < stageNumber && stageNumber < 2));
148 const double X_i = get_ele(*(x), 0);
149 const double f_i = get_ele(*(xDot), 0);
151 if (stageNumber == 0) {
153 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
154 TEST_FLOATING_EQUALITY(f_i, -1.0, relTol);
155 TEST_ASSERT(std::abs(time) < relTol);
156 }
else if (stageNumber == 1) {
158 TEST_FLOATING_EQUALITY(X_i, 1.0/3.0, relTol);
159 TEST_FLOATING_EQUALITY(f_i, -1.0/3.0, relTol);
160 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
162 TEUCHOS_TEST_FOR_EXCEPT( !(-1 < stageNumber && stageNumber < 2));
169 const double x_1 = get_ele(*(x), 0);
170 time = workingState->getTime();
171 TEST_FLOATING_EQUALITY(x_1, 1.0/3.0, relTol);
172 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
173 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
174 TEST_COMPARE(stageNumber, ==, -1);
176 if (stepper->getUseEmbedded() ==
true) {
177 TEST_FLOATING_EQUALITY(workingState->getTolRel(), 1.0, relTol);
178 TEST_ASSERT(std::abs(workingState->getTolAbs()) < relTol);
180 TEST_ASSERT(std::abs(workingState->getErrorRel()) < relTol);
192 Teuchos::FancyOStream & out;
202 Teuchos::RCP<const Thyra::ModelEvaluator<double> >
205 auto modifier = rcp(
new StepperRKModifierEDIRK_TrapezoidaTest(out, success));
207 stepper->setModel(model);
208 stepper->setAppAction(modifier);
209 stepper->setICConsistency(
"Consistent");
210 stepper->setUseFSAL(
false);
211 stepper->initialize();
217 stepper->setInitialConditions(solutionHistory);
218 solutionHistory->initWorkingState();
220 solutionHistory->getWorkingState()->setTimeStep(dt);
221 solutionHistory->getWorkingState()->setTime(dt);
222 stepper->takeStep(solutionHistory);
225 TEUCHOS_ASSERT(stepper->getOrder() == 2);
At the beginning of the stage.
At the beginning of the step.
void testRKAppAction(const Teuchos::RCP< Tempus::StepperRKBase< double > > &stepper, const Teuchos::RCP< const Thyra::ModelEvaluator< double > > &model, Teuchos::FancyOStream &out, bool &success)
Unit test utility for Stepper RK AppAction.
void testFactoryConstruction(std::string stepperType, const Teuchos::RCP< const Thyra::ModelEvaluator< double > > &model)
Unit test utility for Stepper construction through StepperFactory.
The classic Dahlquist Test Problem.
Before the implicit solve.
Sine-Cosine model problem from Rythmos. This is a canonical Sine-Cosine differential equation with a...
RK Trapezoidal Rule (A.K.A. RK Crank-Nicolson)
Teuchos::RCP< SolutionHistory< Scalar > > createSolutionHistoryME(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model)
Nonmember contructor from a Thyra ModelEvaluator.
Base class for Runge-Kutta methods, ExplicitRK, DIRK and IMEX.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
ACTION_LOCATION
Indicates the location of application action (see algorithm).
void testDIRKAccessorsFullConstruction(const RCP< Tempus::StepperDIRK< double > > &stepper)
Unit test utility for ExplicitRK Stepper construction and accessors.
After the implicit solve.
Before the explicit evaluation.
Base modifier for StepperRK.