12 #include "Teuchos_DefaultComm.hpp"
14 #include "Tempus_config.hpp"
15 #include "Tempus_IntegratorBasic.hpp"
16 #include "Tempus_StepperBackwardEuler.hpp"
18 #ifdef TEMPUS_ENABLE_EPETRA_STACK
19 #include "../TestModels/CDR_Model.hpp"
20 #ifdef Tempus_ENABLE_MPI
21 #include "Epetra_MpiComm.h"
23 #include "Epetra_SerialComm.h"
26 #ifdef TEMPUS_ENABLE_TPETRA_STACK
27 #include "../TestModels/CDR_Model_Tpetra.hpp"
28 #include "Tpetra_Core.hpp"
30 #include "../TestUtils/Tempus_ConvergenceTestUtils.hpp"
32 #include "Stratimikos_DefaultLinearSolverBuilder.hpp"
39 namespace Tempus_Test {
41 using Teuchos::getParametersFromXmlFile;
45 using Teuchos::rcp_const_cast;
46 using Teuchos::sublist;
54 template <
typename SC,
typename Model,
typename Comm>
59 std::vector<RCP<Thyra::VectorBase<double>>> solutions;
60 std::vector<RCP<Thyra::VectorBase<double>>> solutionsDot;
61 std::vector<double> StepSize;
62 std::vector<double> xErrorNorm;
63 std::vector<double> xDotErrorNorm;
64 const int nTimeStepSizes = 5;
66 for (
int n = 0; n < nTimeStepSizes; n++) {
69 getParametersFromXmlFile(
"Tempus_BackwardEuler_CDR.xml");
73 const auto num_elements = model_pl->
get<
int>(
"num elements");
74 const auto left_end = model_pl->
get<SC>(
"left end");
75 const auto right_end = model_pl->
get<SC>(
"right end");
76 const auto a_convection = model_pl->
get<SC>(
"a (convection)");
77 const auto k_source = model_pl->
get<SC>(
"k (source)");
79 auto model =
rcp(
new Model(comm, num_elements, left_end, right_end,
80 a_convection, k_source));
83 ::Stratimikos::DefaultLinearSolverBuilder builder;
86 p->set(
"Linear Solver Type",
"Belos");
87 p->set(
"Preconditioner Type",
"None");
88 builder.setParameterList(p);
90 auto lowsFactory = builder.createLinearSolveStrategy(
"");
92 model->set_W_factory(lowsFactory);
101 .
set(
"Initial Time Step", dt);
102 integrator = Tempus::createIntegratorBasic<double>(pl, model);
105 bool integratorStatus = integrator->advanceTime();
109 double time = integrator->getTime();
110 double timeFinal = pl->sublist(
"Demo Integrator")
111 .sublist(
"Time Step Control")
112 .
get<
double>(
"Final Time");
113 double tol = 100.0 * std::numeric_limits<double>::epsilon();
117 StepSize.push_back(dt);
118 auto solution = Thyra::createMember(model->get_x_space());
119 Thyra::copy(*(integrator->getX()), solution.ptr());
120 solutions.push_back(solution);
121 auto solutionDot = Thyra::createMember(model->get_x_space());
122 Thyra::copy(*(integrator->getXDot()), solutionDot.ptr());
123 solutionsDot.push_back(solutionDot);
127 if ((n == nTimeStepSizes - 1) && (commSize == 1)) {
128 std::ofstream ftmp(
"Tempus_BackwardEuler_CDR.dat");
129 ftmp <<
"TITLE=\"Backward Euler Solution to CDR\"\n"
130 <<
"VARIABLES=\"z\",\"T\"\n";
132 std::fabs(left_end - right_end) /
static_cast<double>(num_elements);
134 integrator->getSolutionHistory();
135 int nStates = solutionHistory->getNumStates();
136 for (
int i = 0; i < nStates; i++) {
139 double ttime = solutionState->getTime();
140 ftmp <<
"ZONE T=\"Time=" << ttime <<
"\", I=" << num_elements + 1
142 for (
int j = 0; j < num_elements + 1; j++) {
143 const double x_coord = left_end +
static_cast<double>(j) * dx;
144 ftmp << x_coord <<
" ";
147 for (
int j = 0; j < num_elements + 1; j++)
148 ftmp << get_ele(*x, j) <<
" ";
157 double xDotSlope = 0.0;
159 writeOrderError(
"Tempus_BackwardEuler_CDR-Error.dat", stepper, StepSize,
160 solutions, xErrorNorm, xSlope, solutionsDot, xDotErrorNorm,
176 getParametersFromXmlFile(
"Tempus_BackwardEuler_CDR.xml");
178 const int num_elements = model_pl->
get<
int>(
"num elements");
179 const double left_end = model_pl->
get<
double>(
"left end");
180 const double right_end = model_pl->
get<
double>(
"right end");
184 std::ofstream ftmp(
"Tempus_BackwardEuler_CDR-Solution.dat");
185 for (
int n = 0; n < num_elements + 1; n++) {
187 std::fabs(left_end - right_end) /
static_cast<double>(num_elements);
188 const double x_coord = left_end +
static_cast<double>(n) * dx;
189 ftmp << x_coord <<
" " << Thyra::get_ele(x, n) << std::endl;
197 #ifdef TEMPUS_ENABLE_EPETRA_STACK
203 RCP<Epetra_Comm> comm;
204 #ifdef Tempus_ENABLE_MPI
205 comm =
rcp(
new Epetra_MpiComm(MPI_COMM_WORLD));
207 comm =
rcp(
new Epetra_SerialComm);
210 CDR_Test<double, Tempus_Test::CDR_Model<double>>(comm, comm->NumProc(), out,
215 #ifdef TEMPUS_ENABLE_TPETRA_STACK
221 using SC = Tpetra::Vector<>::scalar_type;
222 using LO = Tpetra::Vector<>::local_ordinal_type;
223 using GO = Tpetra::Vector<>::global_ordinal_type;
224 using Node = Tpetra::Vector<>::node_type;
226 auto comm = Tpetra::getDefaultComm();
228 CDR_Test<SC, Tempus_Test::CDR_Model_Tpetra<SC, LO, GO, Node>>(
229 comm, comm->getSize(), out, success);
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
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)
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
TEUCHOS_UNIT_TEST(BackwardEuler, SinCos_ASA)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
static void summarize(Ptr< const Comm< int > > comm, std::ostream &out=std::cout, const bool alwaysWriteLocal=false, const bool writeGlobalStats=true, const bool writeZeroTimers=true, const ECounterSetOp setOp=Intersection, const std::string &filter="", const bool ignoreZeroTimers=false)
void CDR_Test(const Comm &comm, const int commSize, Teuchos::FancyOStream &out, bool &success)
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
Solution state for integrators and steppers.