48void CDR_Test(
const Comm& comm,
const int commSize, Teuchos::FancyOStream& out,
51 RCP<Tempus::IntegratorBasic<double>> integrator;
52 std::vector<RCP<Thyra::VectorBase<double>>> solutions;
53 std::vector<RCP<Thyra::VectorBase<double>>> solutionsDot;
54 std::vector<double> StepSize;
55 std::vector<double> xErrorNorm;
56 std::vector<double> xDotErrorNorm;
57 const int nTimeStepSizes = 5;
59 for (
int n = 0; n < nTimeStepSizes; n++) {
61 RCP<ParameterList> pList =
62 getParametersFromXmlFile(
"Tempus_BackwardEuler_CDR.xml");
65 RCP<ParameterList> model_pl = sublist(pList,
"CDR Model",
true);
66 const auto num_elements = model_pl->get<
int>(
"num elements");
67 const auto left_end = model_pl->get<SC>(
"left end");
68 const auto right_end = model_pl->get<SC>(
"right end");
69 const auto a_convection = model_pl->get<SC>(
"a (convection)");
70 const auto k_source = model_pl->get<SC>(
"k (source)");
72 auto model = rcp(
new Model(comm, num_elements, left_end, right_end,
73 a_convection, k_source));
76 ::Stratimikos::DefaultLinearSolverBuilder builder;
78 auto p = rcp(
new ParameterList);
79 p->set(
"Linear Solver Type",
"Belos");
80 p->set(
"Preconditioner Type",
"None");
81 builder.setParameterList(p);
83 auto lowsFactory = builder.createLinearSolveStrategy(
"");
85 model->set_W_factory(lowsFactory);
91 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
92 pl->sublist(
"Demo Integrator")
93 .sublist(
"Time Step Control")
94 .set(
"Initial Time Step", dt);
95 integrator = Tempus::createIntegratorBasic<double>(pl, model);
98 bool integratorStatus = integrator->advanceTime();
99 TEST_ASSERT(integratorStatus)
102 double time = integrator->getTime();
103 double timeFinal = pl->sublist(
"Demo Integrator")
104 .sublist(
"Time Step Control")
105 .get<
double>(
"Final Time");
106 double tol = 100.0 * std::numeric_limits<double>::epsilon();
107 TEST_FLOATING_EQUALITY(time, timeFinal, tol);
110 StepSize.push_back(dt);
111 auto solution = Thyra::createMember(model->get_x_space());
112 Thyra::copy(*(integrator->getX()), solution.ptr());
113 solutions.push_back(solution);
114 auto solutionDot = Thyra::createMember(model->get_x_space());
115 Thyra::copy(*(integrator->getXDot()), solutionDot.ptr());
116 solutionsDot.push_back(solutionDot);
120 if ((n == nTimeStepSizes - 1) && (commSize == 1)) {
121 std::ofstream ftmp(
"Tempus_BackwardEuler_CDR.dat");
122 ftmp <<
"TITLE=\"Backward Euler Solution to CDR\"\n"
123 <<
"VARIABLES=\"z\",\"T\"\n";
125 std::fabs(left_end - right_end) /
static_cast<double>(num_elements);
126 RCP<const SolutionHistory<double>> solutionHistory =
127 integrator->getSolutionHistory();
128 int nStates = solutionHistory->getNumStates();
129 for (
int i = 0; i < nStates; i++) {
130 RCP<const SolutionState<double>> solutionState = (*solutionHistory)[i];
131 RCP<const Thyra::VectorBase<double>> x = solutionState->getX();
132 double ttime = solutionState->getTime();
133 ftmp <<
"ZONE T=\"Time=" << ttime <<
"\", I=" << num_elements + 1
135 for (
int j = 0; j < num_elements + 1; j++) {
136 const double x_coord = left_end +
static_cast<double>(j) * dx;
137 ftmp << x_coord <<
" ";
140 for (
int j = 0; j < num_elements + 1; j++)
141 ftmp << get_ele(*x, j) <<
" ";
150 double xDotSlope = 0.0;
151 RCP<Tempus::Stepper<double>> stepper = integrator->getStepper();
152 writeOrderError(
"Tempus_BackwardEuler_CDR-Error.dat", stepper, StepSize,
153 solutions, xErrorNorm, xSlope, solutionsDot, xDotErrorNorm,
156 TEST_FLOATING_EQUALITY(xSlope, 1.32213, 0.01);
157 TEST_FLOATING_EQUALITY(xErrorNorm[0], 0.116919, 1.0e-4);
158 TEST_FLOATING_EQUALITY(xDotSlope, 1.32052, 0.01);
159 TEST_FLOATING_EQUALITY(xDotErrorNorm[0], 0.449888, 1.0e-4);
168 RCP<ParameterList> pList =
169 getParametersFromXmlFile(
"Tempus_BackwardEuler_CDR.xml");
170 RCP<ParameterList> model_pl = sublist(pList,
"CDR Model",
true);
171 const int num_elements = model_pl->get<
int>(
"num elements");
172 const double left_end = model_pl->get<
double>(
"left end");
173 const double right_end = model_pl->get<
double>(
"right end");
177 std::ofstream ftmp(
"Tempus_BackwardEuler_CDR-Solution.dat");
178 for (
int n = 0; n < num_elements + 1; n++) {
180 std::fabs(left_end - right_end) /
static_cast<double>(num_elements);
181 const double x_coord = left_end +
static_cast<double>(n) * dx;
182 ftmp << x_coord <<
" " << Thyra::get_ele(x, n) << std::endl;
187 Teuchos::TimeMonitor::summarize();
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
void writeOrderError(const std::string filename, Teuchos::RCP< Tempus::Stepper< Scalar > > stepper, std::vector< Scalar > &StepSize, std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > &solutions, std::vector< Scalar > &xErrorNorm, Scalar &xSlope, std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > &solutionsDot, std::vector< Scalar > &xDotErrorNorm, Scalar &xDotSlope, std::vector< Teuchos::RCP< Thyra::VectorBase< Scalar > > > &solutionsDotDot, std::vector< Scalar > &xDotDotErrorNorm, Scalar &xDotDotSlope, Teuchos::FancyOStream &out)