11#include "Teuchos_XMLParameterListHelpers.hpp"
13#include "Tempus_TimeStepControl.hpp"
15#include "Tempus_StepperNewmarkImplicitAForm.hpp"
21#include "../TestModels/HarmonicOscillatorModel.hpp"
28using Teuchos::rcp_const_cast;
29using Teuchos::rcp_dynamic_cast;
30using Teuchos::ParameterList;
31using Teuchos::sublist;
43 stepper->setModel(model);
44 stepper->initialize();
45 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
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";
64 stepper->setAppAction(modifier); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
65 stepper->setAppAction(modifierX); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
66 stepper->setSolver(solver); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
67 stepper->setUseFSAL(useFSAL); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
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());
72 stepper->setSchemeName(schemeName); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
73 stepper->setBeta(beta); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
74 stepper->setGamma(gamma); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
79 model, solver, useFSAL,
80 ICConsistency, ICConsistencyCheck, zeroInitialGuess,
81 schemeName, beta, gamma, modifier));
82 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
85 TEUCHOS_ASSERT(stepper->getOrder() == 2);
99class StepperNewmarkImplicitAFormModifierTest
105 StepperNewmarkImplicitAFormModifierTest()
106 : testBEGIN_STEP(false), testBEFORE_SOLVE(false),
107 testAFTER_SOLVE(false), testEND_STEP(false),
108 testCurrentValue(-0.99),
109 testDt(-1.5), testName(
"")
113 virtual ~StepperNewmarkImplicitAFormModifierTest(){}
122 case StepperNewmarkImplicitAFormAppAction<double>::BEGIN_STEP:
124 testBEGIN_STEP =
true;
127 case StepperNewmarkImplicitAFormAppAction<double>::BEFORE_SOLVE:
129 testBEFORE_SOLVE =
true;
130 testDt = sh->getWorkingState()->getTimeStep();
134 case StepperNewmarkImplicitAFormAppAction<double>::AFTER_SOLVE:
136 testAFTER_SOLVE =
true;
137 testName =
"Newmark Implicit A Form - Modifier";
138 stepper->setStepperName(testName);
141 case StepperNewmarkImplicitAFormAppAction<double>::END_STEP:
144 auto x = sh->getWorkingState()->getX();
145 testCurrentValue = get_ele(*(x), 0);
149 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
150 "Error - unknown action location.\n");
155 bool testBEFORE_SOLVE;
156 bool testAFTER_SOLVE;
158 double testCurrentValue;
160 std::string testName;
166class StepperNewmarkImplicitAFormModifierXTest
172 StepperNewmarkImplicitAFormModifierXTest()
173 : testX_BEGIN_STEP(false), testX_BEFORE_SOLVE(false),
174 testX_AFTER_SOLVE(false), testX_END_STEP(false),
175 testX(-0.99), testXDot(-0.99),
176 testDt(-1.5), testTime(-1.5)
180 virtual ~StepperNewmarkImplicitAFormModifierXTest(){}
185 const double time,
const double dt,
189 case StepperNewmarkImplicitAFormModifierXBase<double>::X_BEGIN_STEP:
191 testX_BEGIN_STEP =
true;
192 testX = get_ele(*(x), 0);
195 case StepperNewmarkImplicitAFormModifierXBase<double>::X_BEFORE_SOLVE:
197 testX_BEFORE_SOLVE =
true;
201 case StepperNewmarkImplicitAFormModifierXBase<double>::X_AFTER_SOLVE:
203 testX_AFTER_SOLVE =
true;
205 testX = get_ele(*(x), 0);
208 case StepperNewmarkImplicitAFormModifierXBase<double>::X_END_STEP:
210 testX_END_STEP =
true;
211 testX = get_ele(*(x), 0);
215 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
216 "Error - unknown action location.\n");
220 bool testX_BEGIN_STEP;
221 bool testX_BEFORE_SOLVE;
222 bool testX_AFTER_SOLVE;
233 using Teuchos::sublist;
234 using Teuchos::ParameterList;
239 RCP<ParameterList> pList = Teuchos::getParametersFromXmlFile(
240 "Tempus_NewmarkImplicitAForm_HarmonicOscillator_Damped_SecondOrder.xml");
241 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
244 RCP<ParameterList> hom_pl = sublist(pList,
"HarmonicOscillatorModel",
true);
245 RCP<const Thyra::ModelEvaluator<double> > model =
249 RCP<Tempus::StepperNewmarkImplicitAForm<double> > stepper =
252 auto modifier = rcp(
new StepperNewmarkImplicitAFormModifierTest());
253 stepper->setAppAction(modifier);
254 stepper->initialize();
257 RCP<Tempus::TimeStepControl<double> > timeStepControl =
259 ParameterList tscPL = pl->sublist(
"Default Integrator")
260 .sublist(
"Time Step Control");
261 timeStepControl->setInitIndex(tscPL.get<
int> (
"Initial Time Index"));
262 timeStepControl->setInitTime (tscPL.get<
double>(
"Initial Time"));
263 timeStepControl->setFinalTime(dt);
264 timeStepControl->setInitTimeStep(dt);
265 timeStepControl->initialize();
268 using Teuchos::rcp_const_cast;
269 auto inArgsIC = model->getNominalValues();
270 RCP<Thyra::VectorBase<double> > icX =
271 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
272 RCP<Thyra::VectorBase<double> > icXDot =
273 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot());
274 RCP<Thyra::VectorBase<double> > icXDotDot =
275 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot_dot());
276 RCP<Tempus::SolutionState<double> > icState =
278 icState->setTime (timeStepControl->getInitTime());
279 icState->setIndex (timeStepControl->getInitIndex());
280 icState->setTimeStep(0.0);
281 icState->setOrder (stepper->getOrder());
285 RCP<Tempus::SolutionHistory<double> > solutionHistory =
287 solutionHistory->setName(
"Forward States");
289 solutionHistory->setStorageLimit(2);
290 solutionHistory->addState(icState);
293 RCP<Tempus::IntegratorBasic<double> > integrator =
294 Tempus::createIntegratorBasic<double>();
295 integrator->setStepper(stepper);
296 integrator->setTimeStepControl(timeStepControl);
297 integrator->setSolutionHistory(solutionHistory);
298 integrator->initialize();
301 bool integratorStatus = integrator->advanceTime();
302 TEST_ASSERT(integratorStatus)
306 TEST_COMPARE(modifier->testBEGIN_STEP, ==,
true);
307 TEST_COMPARE(modifier->testBEFORE_SOLVE, ==,
true);
308 TEST_COMPARE(modifier->testAFTER_SOLVE, ==,
true);
309 TEST_COMPARE(modifier->testEND_STEP, ==,
true);
312 auto x = integrator->getX();
313 auto Dt = integrator->getTime();
314 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
315 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
316 TEST_COMPARE(modifier->testName, ==, stepper->getStepperName());
323 using Teuchos::sublist;
324 using Teuchos::ParameterList;
329 RCP<ParameterList> pList = Teuchos::getParametersFromXmlFile(
330 "Tempus_NewmarkImplicitAForm_HarmonicOscillator_Damped_SecondOrder.xml");
331 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
334 RCP<ParameterList> hom_pl = sublist(pList,
"HarmonicOscillatorModel",
true);
335 RCP<const Thyra::ModelEvaluator<double> > model =
339 RCP<Tempus::StepperNewmarkImplicitAForm<double> > stepper =
342 auto modifierX = rcp(
new StepperNewmarkImplicitAFormModifierXTest());
343 stepper->setAppAction(modifierX);
344 stepper->initialize();
347 RCP<Tempus::TimeStepControl<double> > timeStepControl =
349 ParameterList tscPL = pl->sublist(
"Default Integrator")
350 .sublist(
"Time Step Control");
351 timeStepControl->setInitIndex(tscPL.get<
int> (
"Initial Time Index"));
352 timeStepControl->setInitTime (tscPL.get<
double>(
"Initial Time"));
353 timeStepControl->setFinalTime(dt);
354 timeStepControl->setInitTimeStep(dt);
355 timeStepControl->initialize();
358 using Teuchos::rcp_const_cast;
359 auto inArgsIC = model->getNominalValues();
360 RCP<Thyra::VectorBase<double> > icX =
361 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
362 RCP<Thyra::VectorBase<double> > icXDot =
363 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot());
364 RCP<Thyra::VectorBase<double> > icXDotDot =
365 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot_dot());
366 RCP<Tempus::SolutionState<double> > icState =
368 icState->setTime (timeStepControl->getInitTime());
369 icState->setIndex (timeStepControl->getInitIndex());
370 icState->setTimeStep(0.0);
371 icState->setOrder (stepper->getOrder());
375 RCP<Tempus::SolutionHistory<double> > solutionHistory =
377 solutionHistory->setName(
"Forward States");
379 solutionHistory->setStorageLimit(2);
380 solutionHistory->addState(icState);
383 RCP<Tempus::IntegratorBasic<double> > integrator =
384 Tempus::createIntegratorBasic<double>();
385 integrator->setStepper(stepper);
386 integrator->setTimeStepControl(timeStepControl);
387 integrator->setSolutionHistory(solutionHistory);
388 integrator->initialize();
391 bool integratorStatus = integrator->advanceTime();
392 TEST_ASSERT(integratorStatus)
395 TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==,
true);
396 TEST_COMPARE(modifierX->testX_BEFORE_SOLVE, ==,
true);
397 TEST_COMPARE(modifierX->testX_AFTER_SOLVE, ==,
true);
398 TEST_COMPARE(modifierX->testX_END_STEP, ==,
true);
402 auto Dt = integrator->getTime();
403 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
405 const auto x = integrator->getX();
406 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
TimeStepControl manages the time step size. There several mechanisms that effect the time step size a...
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.
@ STORAGE_TYPE_STATIC
Keep a fix number of states.
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.
Teuchos::RCP< Teuchos::ParameterList > defaultSolverParameters()
Returns the default solver ParameterList for implicit Steppers.