13#include "../TestModels/DahlquistTestModel.hpp"
20using Teuchos::rcp_const_cast;
21using Teuchos::rcp_dynamic_cast;
22using Teuchos::ParameterList;
23using Teuchos::sublist;
34 TEUCHOS_ASSERT(stepper->getOrder() == 2);
60class StepperRKModifierEDIRK_TrapezoidaTest
66 StepperRKModifierEDIRK_TrapezoidaTest(Teuchos::FancyOStream &Out,
bool &Success)
67 : out(Out), success(Success)
72 virtual ~StepperRKModifierEDIRK_TrapezoidaTest(){}
80 const double relTol = 1.0e-14;
81 auto stageNumber = stepper->getStageNumber();
82 Teuchos::SerialDenseVector<int,double> c = stepper->getTableau()->c();
84 auto currentState = sh->getCurrentState();
85 auto workingState = sh->getWorkingState();
86 const double dt = workingState->getTimeStep();
87 double time = currentState->getTime();
88 if (stageNumber >= 0) time += c(stageNumber)*dt;
90 auto x = workingState->getX();
91 auto xDot = workingState->getXDot();
92 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
95 case StepperRKAppAction<double>::BEGIN_STEP:
98 auto DME = Teuchos::rcp_dynamic_cast<
100 TEST_FLOATING_EQUALITY(DME->getLambda(), -1.0, relTol);
102 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
104 const double x_0 = get_ele(*(x), 0);
105 const double xDot_0 = get_ele(*(xDot), 0);
106 TEST_FLOATING_EQUALITY(x_0, 1.0, relTol);
107 TEST_FLOATING_EQUALITY(xDot_0, -1.0, relTol);
108 TEST_ASSERT(std::abs(time) < relTol);
109 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
110 TEST_COMPARE(stageNumber, ==, -1);
113 case StepperRKAppAction<double>::BEGIN_STAGE:
114 case StepperRKAppAction<double>::BEFORE_SOLVE:
116 const double X_i = get_ele(*(x), 0);
117 const double f_i = get_ele(*(xDot), 0);
119 if (stageNumber == 0) {
120 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
121 TEST_ASSERT(std::abs(f_i) < relTol);
122 TEST_ASSERT(std::abs(time) < relTol);
123 }
else if (stageNumber == 1) {
124 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
125 TEST_FLOATING_EQUALITY(f_i, -1.0, relTol);
126 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
128 TEUCHOS_TEST_FOR_EXCEPT( !(-1 < stageNumber && stageNumber < 2));
133 case StepperRKAppAction<double>::AFTER_SOLVE:
134 case StepperRKAppAction<double>::BEFORE_EXPLICIT_EVAL:
135 case StepperRKAppAction<double>::END_STAGE:
137 const double X_i = get_ele(*(x), 0);
138 const double f_i = get_ele(*(xDot), 0);
140 if (stageNumber == 0) {
142 TEST_FLOATING_EQUALITY(X_i, 1.0, relTol);
143 TEST_FLOATING_EQUALITY(f_i, -1.0, relTol);
144 TEST_ASSERT(std::abs(time) < relTol);
145 }
else if (stageNumber == 1) {
147 TEST_FLOATING_EQUALITY(X_i, 1.0/3.0, relTol);
148 TEST_FLOATING_EQUALITY(f_i, -1.0/3.0, relTol);
149 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
151 TEUCHOS_TEST_FOR_EXCEPT( !(-1 < stageNumber && stageNumber < 2));
156 case StepperRKAppAction<double>::END_STEP:
158 const double x_1 = get_ele(*(x), 0);
159 time = workingState->getTime();
160 TEST_FLOATING_EQUALITY(x_1, 1.0/3.0, relTol);
161 TEST_FLOATING_EQUALITY(time, 1.0, relTol);
162 TEST_FLOATING_EQUALITY(dt, 1.0, relTol);
163 TEST_COMPARE(stageNumber, ==, -1);
165 if (stepper->getUseEmbedded() ==
true) {
166 TEST_FLOATING_EQUALITY(workingState->getTolRel(), 1.0, relTol);
167 TEST_ASSERT(std::abs(workingState->getTolAbs()) < relTol);
169 TEST_ASSERT(std::abs(workingState->getErrorRel()) < relTol);
181 Teuchos::FancyOStream & out;
191 Teuchos::RCP<const Thyra::ModelEvaluator<double> >
194 auto modifier = rcp(
new StepperRKModifierEDIRK_TrapezoidaTest(out, success));
196 stepper->setModel(model);
197 stepper->setAppAction(modifier);
198 stepper->setICConsistency(
"Consistent");
199 stepper->setUseFSAL(
false);
200 stepper->initialize();
206 stepper->setInitialConditions(solutionHistory);
207 solutionHistory->initWorkingState();
209 solutionHistory->getWorkingState()->setTimeStep(dt);
210 solutionHistory->getWorkingState()->setTime(dt);
211 stepper->takeStep(solutionHistory);
214 TEUCHOS_ASSERT(stepper->getOrder() == 2);
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
RK Trapezoidal Rule (A.K.A. RK Crank-Nicolson)
ACTION_LOCATION
Indicates the location of application action (see algorithm).
Base class for Runge-Kutta methods, ExplicitRK, DIRK and IMEX.
Base modifier for StepperRK.
The classic Dahlquist Test Problem.
Sine-Cosine model problem from Rythmos. This is a canonical Sine-Cosine differential equation.
void testDIRKAccessorsFullConstruction(const RCP< Tempus::StepperDIRK< double > > &stepper)
Unit test utility for ExplicitRK Stepper construction and accessors.
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.
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
void testFactoryConstruction(std::string stepperType, const Teuchos::RCP< const Thyra::ModelEvaluator< double > > &model)
Unit test utility for Stepper construction through StepperFactory.
Teuchos::RCP< SolutionHistory< Scalar > > createSolutionHistoryME(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model)
Nonmember contructor from a Thyra ModelEvaluator.