39 stepper->setModel(model);
40 stepper->initialize();
41 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
54 predictorStepper->setModel(
56 predictorStepper->initialize();
59 bool useFSAL = defaultStepper->getUseFSAL();
60 std::string ICConsistency = defaultStepper->getICConsistency();
61 bool ICConsistencyCheck = defaultStepper->getICConsistencyCheck();
62 bool zeroInitialGuess = defaultStepper->getZeroInitialGuess();
65 stepper->setAppAction(modifier);
66 stepper->initialize();
67 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
68 stepper->setAppAction(modifierX);
69 stepper->initialize();
70 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
71 stepper->setAppAction(observer);
72 stepper->initialize();
73 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
74 stepper->setSolver(solver);
75 stepper->initialize();
76 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
77 stepper->setPredictor(predictorStepper);
78 stepper->initialize();
79 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
80 stepper->setUseFSAL(useFSAL);
81 stepper->initialize();
82 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
83 stepper->setICConsistency(ICConsistency);
84 stepper->initialize();
85 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
86 stepper->setICConsistencyCheck(ICConsistencyCheck);
87 stepper->initialize();
88 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
89 stepper->setZeroInitialGuess(zeroInitialGuess);
90 stepper->initialize();
91 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
95 model, solver, predictorStepper, useFSAL, ICConsistency,
96 ICConsistencyCheck, zeroInitialGuess, modifier));
97 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
100 TEUCHOS_ASSERT(stepper->getOrder() == 1);
182 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
187 stepper->setModel(model);
188 auto modifier = rcp(
new StepperBackwardEulerModifierTest());
189 stepper->setAppAction(modifier);
190 stepper->initialize();
196 stepper->setInitialConditions(solutionHistory);
197 solutionHistory->initWorkingState();
199 solutionHistory->getWorkingState()->setTimeStep(dt);
200 stepper->takeStep(solutionHistory);
203 TEST_COMPARE(modifier->testBEGIN_STEP, ==,
true);
204 TEST_COMPARE(modifier->testBEFORE_SOLVE, ==,
true);
205 TEST_COMPARE(modifier->testAFTER_SOLVE, ==,
true);
206 TEST_COMPARE(modifier->testEND_STEP, ==,
true);
209 auto x = solutionHistory->getCurrentState()->getX();
210 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
211 x = solutionHistory->getWorkingState()->getX();
212 TEST_FLOATING_EQUALITY(modifier->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
213 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
214 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
216 TEST_COMPARE(modifier->testName, ==,
"Backward Euler - Modifier");
288 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
293 stepper->setModel(model);
294 auto observer = rcp(
new StepperBackwardEulerObserverTest());
295 stepper->setAppAction(observer);
296 stepper->initialize();
302 stepper->setInitialConditions(solutionHistory);
303 solutionHistory->initWorkingState();
305 solutionHistory->getWorkingState()->setTimeStep(dt);
306 stepper->takeStep(solutionHistory);
309 TEST_COMPARE(observer->testBEGIN_STEP, ==,
true);
310 TEST_COMPARE(observer->testBEFORE_SOLVE, ==,
true);
311 TEST_COMPARE(observer->testAFTER_SOLVE, ==,
true);
312 TEST_COMPARE(observer->testEND_STEP, ==,
true);
315 auto x = solutionHistory->getCurrentState()->getX();
316 TEST_FLOATING_EQUALITY(observer->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
317 x = solutionHistory->getWorkingState()->getX();
318 TEST_FLOATING_EQUALITY(observer->testWorkingValue, get_ele(*(x), 0), 1.0e-14);
319 TEST_FLOATING_EQUALITY(observer->testDt, dt, 1.0e-14);
321 TEST_COMPARE(observer->testName, ==,
"Backward Euler");
390 Teuchos::RCP<const Thyra::ModelEvaluator<double> > model =
395 stepper->setModel(model);
396 auto modifierX = rcp(
new StepperBackwardEulerModifierXTest());
397 stepper->setAppAction(modifierX);
398 stepper->initialize();
404 stepper->setInitialConditions(solutionHistory);
405 solutionHistory->initWorkingState();
407 solutionHistory->getWorkingState()->setTimeStep(dt);
408 stepper->takeStep(solutionHistory);
411 TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==,
true);
412 TEST_COMPARE(modifierX->testX_BEFORE_SOLVE, ==,
true);
413 TEST_COMPARE(modifierX->testX_AFTER_SOLVE, ==,
true);
414 TEST_COMPARE(modifierX->testXDOT_END_STEP, ==,
true);
417 auto x = solutionHistory->getCurrentState()->getX();
418 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
420 auto xDot = solutionHistory->getWorkingState()->getXDot();
421 if (xDot == Teuchos::null) xDot = stepper->getStepperXDot();
423 TEST_FLOATING_EQUALITY(modifierX->testXDot, get_ele(*(xDot), 0), 1.0e-14);
424 auto Dt = solutionHistory->getWorkingState()->getTimeStep();
425 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
427 auto time = solutionHistory->getWorkingState()->getTime();
428 TEST_FLOATING_EQUALITY(modifierX->testTime, time, 1.0e-14);
436 RCP<ParameterList> pList =
437 Teuchos::getParametersFromXmlFile(
"Tempus_BackwardEuler_SinCos.xml");
440 RCP<ParameterList> scm_pl = sublist(pList,
"SinCosModel",
true);
443 RCP<ParameterList> tempusPL = sublist(pList,
"Tempus",
true);
447 RCP<Tempus::IntegratorBasic<double> > integrator =
448 Tempus::createIntegratorBasic<double>(tempusPL, model);
450 RCP<ParameterList> stepperPL = sublist(tempusPL,
"Default Stepper",
true);
451 RCP<const ParameterList> defaultPL =
452 integrator->getStepper()->getValidParameters();
454 bool pass = haveSameValuesSorted(*stepperPL, *defaultPL,
true);
457 out <<
"stepperPL -------------- \n"
458 << *stepperPL << std::endl;
459 out <<
"defaultPL -------------- \n"
460 << *defaultPL << std::endl;
467 RCP<Tempus::IntegratorBasic<double> > integrator =
468 Tempus::createIntegratorBasic<double>(model,
469 std::string(
"Backward Euler"));
471 RCP<ParameterList> stepperPL = sublist(tempusPL,
"Default Stepper",
true);
473 stepperPL->set(
"Predictor Stepper Type",
"None");
474 RCP<const ParameterList> defaultPL =
475 integrator->getStepper()->getValidParameters();
477 bool pass = haveSameValuesSorted(*stepperPL, *defaultPL,
true);
480 out <<
"stepperPL -------------- \n"
481 << *stepperPL << std::endl;
482 out <<
"defaultPL -------------- \n"
483 << *defaultPL << std::endl;
494 std::vector<std::string> options;
495 options.push_back(
"Default Parameters");
496 options.push_back(
"ICConsistency and Check");
498 for (
const auto& option : options) {
500 RCP<ParameterList> pList =
501 Teuchos::getParametersFromXmlFile(
"Tempus_BackwardEuler_SinCos.xml");
502 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
505 RCP<ParameterList> scm_pl = sublist(pList,
"SinCosModel",
true);
511 stepper->setModel(model);
512 if (option ==
"ICConsistency and Check") {
513 stepper->setICConsistency(
"Consistent");
514 stepper->setICConsistencyCheck(
true);
516 stepper->initialize();
520 ParameterList tscPL =
521 pl->sublist(
"Default Integrator").sublist(
"Time Step Control");
522 timeStepControl->setInitIndex(tscPL.get<
int>(
"Initial Time Index"));
523 timeStepControl->setInitTime(tscPL.get<
double>(
"Initial Time"));
524 timeStepControl->setFinalTime(tscPL.get<
double>(
"Final Time"));
525 timeStepControl->setInitTimeStep(dt);
526 timeStepControl->initialize();
529 auto inArgsIC = model->getNominalValues();
531 rcp_const_cast<Thyra::VectorBase<double> >(inArgsIC.get_x());
533 icState->setTime(timeStepControl->getInitTime());
534 icState->setIndex(timeStepControl->getInitIndex());
535 icState->setTimeStep(0.0);
536 icState->setOrder(stepper->getOrder());
541 solutionHistory->setName(
"Forward States");
543 solutionHistory->setStorageLimit(2);
544 solutionHistory->addState(icState);
547 stepper->setInitialConditions(solutionHistory);
550 RCP<Tempus::IntegratorBasic<double> > integrator =
551 Tempus::createIntegratorBasic<double>();
552 integrator->setStepper(stepper);
553 integrator->setTimeStepControl(timeStepControl);
554 integrator->setSolutionHistory(solutionHistory);
556 integrator->initialize();
559 bool integratorStatus = integrator->advanceTime();
560 TEST_ASSERT(integratorStatus)
563 double time = integrator->getTime();
564 double timeFinal = pl->sublist(
"Default Integrator")
565 .sublist(
"Time Step Control")
566 .get<
double>(
"Final Time");
567 TEST_FLOATING_EQUALITY(time, timeFinal, 1.0e-14);
570 RCP<Thyra::VectorBase<double> > x = integrator->getX();
571 RCP<const Thyra::VectorBase<double> > x_exact =
572 model->getExactSolution(time).get_x();
575 RCP<Thyra::VectorBase<double> > xdiff = x->clone_v();
576 Thyra::V_StVpStV(xdiff.ptr(), 1.0, *x_exact, -1.0, *(x));
579 out <<
" Stepper = " << stepper->description() <<
" with " << option
581 out <<
" =========================" << std::endl;
582 out <<
" Exact solution : " << get_ele(*(x_exact), 0) <<
" "
583 << get_ele(*(x_exact), 1) << std::endl;
584 out <<
" Computed solution: " << get_ele(*(x), 0) <<
" "
585 << get_ele(*(x), 1) << std::endl;
586 out <<
" Difference : " << get_ele(*(xdiff), 0) <<
" "
587 << get_ele(*(xdiff), 1) << std::endl;
588 out <<
" =========================" << std::endl;
589 TEST_FLOATING_EQUALITY(get_ele(*(x), 0), 0.798923, 1.0e-4);
590 TEST_FLOATING_EQUALITY(get_ele(*(x), 1), 0.516729, 1.0e-4);