13 #include "Tempus_TimeStepControl.hpp"
15 #include "Tempus_StepperNewmarkImplicitAForm.hpp"
21 #include "../TestModels/HarmonicOscillatorModel.hpp"
24 namespace Tempus_Unit_Test {
28 using Teuchos::rcp_const_cast;
29 using Teuchos::rcp_dynamic_cast;
31 using Teuchos::sublist;
43 stepper->setModel(model);
44 stepper->initialize();
54 bool useFSAL = stepper->getUseFSAL();
55 std::string ICConsistency = stepper->getICConsistency();
56 bool ICConsistencyCheck = stepper->getICConsistencyCheck();
57 bool zeroInitialGuess = stepper->getZeroInitialGuess();
58 std::string schemeName =
"Average Acceleration";
68 stepper->setICConsistency(ICConsistency); stepper->initialize();
TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
69 stepper->setICConsistencyCheck(ICConsistencyCheck); stepper->initialize();
TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
70 stepper->setZeroInitialGuess(zeroInitialGuess); stepper->initialize();
TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
79 model, solver, useFSAL,
80 ICConsistency, ICConsistencyCheck, zeroInitialGuess,
81 schemeName, beta, gamma, modifier));
103 std::vector<std::string> options;
104 options.push_back(
"Default Parameters");
105 options.push_back(
"ICConsistency and Check");
107 for(
const auto& option: options) {
111 "Tempus_NewmarkImplicitAForm_HarmonicOscillator_Damped_SecondOrder.xml");
122 if (option ==
"ICConsistency and Check") {
123 stepper->setICConsistency(
"Consistent");
124 stepper->setICConsistencyCheck(
true);
126 stepper->initialize();
133 timeStepControl->setInitIndex(tscPL.
get<
int> (
"Initial Time Index"));
134 timeStepControl->setInitTime (tscPL.
get<
double>(
"Initial Time"));
135 timeStepControl->setFinalTime(tscPL.
get<
double>(
"Final Time"));
136 timeStepControl->setInitTimeStep(dt);
137 timeStepControl->initialize();
140 using Teuchos::rcp_const_cast;
141 auto inArgsIC = model->getNominalValues();
150 icState->setTime (timeStepControl->getInitTime());
151 icState->setIndex (timeStepControl->getInitIndex());
152 icState->setTimeStep(0.0);
153 icState->setOrder (stepper->getOrder());
159 solutionHistory->setName(
"Forward States");
161 solutionHistory->setStorageLimit(2);
162 solutionHistory->addState(icState);
165 stepper->setInitialConditions(solutionHistory);
169 Tempus::createIntegratorBasic<double>();
170 integrator->setStepper(stepper);
171 integrator->setTimeStepControl(timeStepControl);
172 integrator->setSolutionHistory(solutionHistory);
174 integrator->initialize();
178 bool integratorStatus = integrator->advanceTime();
183 double time = integrator->getTime();
184 double timeFinal =pl->
sublist(
"Default Integrator")
185 .
sublist(
"Time Step Control").
get<
double>(
"Final Time");
191 model->getExactSolution(time).get_x();
195 Thyra::V_StVpStV(xdiff.
ptr(), 1.0, *x_exact, -1.0, *(x));
198 std::cout <<
" Stepper = " << stepper->description()
199 <<
"\n with " << option << std::endl;
200 std::cout <<
" =========================" << std::endl;
201 std::cout <<
" Exact solution : " << get_ele(*(x_exact), 0) << std::endl;
202 std::cout <<
" Computed solution: " << get_ele(*(x ), 0) << std::endl;
203 std::cout <<
" Difference : " << get_ele(*(xdiff ), 0) << std::endl;
204 std::cout <<
" =========================" << std::endl;
205 TEST_FLOATING_EQUALITY(get_ele(*(x), 0), -0.222222, 1.0e-4 );
212 class StepperNewmarkImplicitAFormModifierTest
218 StepperNewmarkImplicitAFormModifierTest()
219 : testBEGIN_STEP(false), testBEFORE_SOLVE(false),
220 testAFTER_SOLVE(false), testEND_STEP(false),
221 testCurrentValue(-0.99),
222 testDt(-1.5), testName(
"")
226 virtual ~StepperNewmarkImplicitAFormModifierTest(){}
237 testBEGIN_STEP =
true;
242 testBEFORE_SOLVE =
true;
243 testDt = sh->getWorkingState()->getTimeStep();
249 testAFTER_SOLVE =
true;
250 testName =
"Newmark Implicit A Form - Modifier";
251 stepper->setStepperName(testName);
257 auto x = sh->getWorkingState()->getX();
258 testCurrentValue = get_ele(*(x), 0);
263 "Error - unknown action location.\n");
268 bool testBEFORE_SOLVE;
269 bool testAFTER_SOLVE;
271 double testCurrentValue;
273 std::string testName;
279 class StepperNewmarkImplicitAFormModifierXTest
285 StepperNewmarkImplicitAFormModifierXTest()
286 : testX_BEGIN_STEP(false), testX_BEFORE_SOLVE(false),
287 testX_AFTER_SOLVE(false), testX_END_STEP(false),
288 testX(-0.99), testXDot(-0.99),
289 testDt(-1.5), testTime(-1.5)
293 virtual ~StepperNewmarkImplicitAFormModifierXTest(){}
298 const double time,
const double dt,
304 testX_BEGIN_STEP =
true;
305 testX = get_ele(*(x), 0);
310 testX_BEFORE_SOLVE =
true;
316 testX_AFTER_SOLVE =
true;
318 testX = get_ele(*(x), 0);
323 testX_END_STEP =
true;
324 testX = get_ele(*(x), 0);
329 "Error - unknown action location.\n");
333 bool testX_BEGIN_STEP;
334 bool testX_BEFORE_SOLVE;
335 bool testX_AFTER_SOLVE;
346 using Teuchos::sublist;
353 "Tempus_NewmarkImplicitAForm_HarmonicOscillator_Damped_SecondOrder.xml");
365 auto modifier =
rcp(
new StepperNewmarkImplicitAFormModifierTest());
366 stepper->setAppAction(modifier);
367 stepper->initialize();
374 timeStepControl->setInitIndex(tscPL.
get<
int> (
"Initial Time Index"));
375 timeStepControl->setInitTime (tscPL.
get<
double>(
"Initial Time"));
376 timeStepControl->setFinalTime(dt);
377 timeStepControl->setInitTimeStep(dt);
378 timeStepControl->initialize();
381 using Teuchos::rcp_const_cast;
382 auto inArgsIC = model->getNominalValues();
391 icState->setTime (timeStepControl->getInitTime());
392 icState->setIndex (timeStepControl->getInitIndex());
393 icState->setTimeStep(0.0);
394 icState->setOrder (stepper->getOrder());
400 solutionHistory->setName(
"Forward States");
402 solutionHistory->setStorageLimit(2);
403 solutionHistory->addState(icState);
407 Tempus::createIntegratorBasic<double>();
408 integrator->setStepper(stepper);
409 integrator->setTimeStepControl(timeStepControl);
410 integrator->setSolutionHistory(solutionHistory);
411 integrator->initialize();
414 bool integratorStatus = integrator->advanceTime();
425 auto x = integrator->getX();
426 auto Dt = integrator->getTime();
429 TEST_COMPARE(modifier->testName, ==, stepper->getStepperName());
436 using Teuchos::sublist;
443 "Tempus_NewmarkImplicitAForm_HarmonicOscillator_Damped_SecondOrder.xml");
455 auto modifierX =
rcp(
new StepperNewmarkImplicitAFormModifierXTest());
456 stepper->setAppAction(modifierX);
457 stepper->initialize();
464 timeStepControl->setInitIndex(tscPL.
get<
int> (
"Initial Time Index"));
465 timeStepControl->setInitTime (tscPL.
get<
double>(
"Initial Time"));
466 timeStepControl->setFinalTime(dt);
467 timeStepControl->setInitTimeStep(dt);
468 timeStepControl->initialize();
471 using Teuchos::rcp_const_cast;
472 auto inArgsIC = model->getNominalValues();
481 icState->setTime (timeStepControl->getInitTime());
482 icState->setIndex (timeStepControl->getInitIndex());
483 icState->setTimeStep(0.0);
484 icState->setOrder (stepper->getOrder());
490 solutionHistory->setName(
"Forward States");
492 solutionHistory->setStorageLimit(2);
493 solutionHistory->addState(icState);
497 Tempus::createIntegratorBasic<double>();
498 integrator->setStepper(stepper);
499 integrator->setTimeStepControl(timeStepControl);
500 integrator->setSolutionHistory(solutionHistory);
501 integrator->initialize();
504 bool integratorStatus = integrator->advanceTime();
515 auto Dt = integrator->getTime();
518 const auto x = integrator->getX();
Teuchos::RCP< SolutionState< Scalar > > createSolutionStateX(const Teuchos::RCP< Thyra::VectorBase< Scalar > > &x, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &xdot=Teuchos::null, const Teuchos::RCP< Thyra::VectorBase< Scalar > > &xdotdot=Teuchos::null)
Nonmember constructor from non-const solution vectors, x.
Teuchos::RCP< StepperNewmarkImplicitAForm< Scalar > > createStepperNewmarkImplicitAForm(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
void testFactoryConstruction(std::string stepperType, const Teuchos::RCP< const Thyra::ModelEvaluator< double > > &model)
Unit test utility for Stepper construction through StepperFactory.
T & get(const std::string &name, T def_value)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
#define TEST_COMPARE(v1, comp, v2)
#define TEST_FLOATING_EQUALITY(v1, v2, tol)
Teuchos::RCP< Teuchos::ParameterList > defaultSolverParameters()
Returns the default solver ParameterList for implicit Steppers.
Consider the ODE: where is a constant, is a constant damping parameter, is a constant forcing par...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
TEUCHOS_UNIT_TEST(BackwardEuler, Default_Construction)
TimeStepControl manages the time step size. There several mechanisms that effect the time step size a...
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
Keep a fix number of states.
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)