9 #include "Teuchos_UnitTestHarness.hpp" 10 #include "Teuchos_XMLParameterListHelpers.hpp" 11 #include "Teuchos_TimeMonitor.hpp" 12 #include "Teuchos_DefaultComm.hpp" 14 #include "Thyra_VectorStdOps.hpp" 16 #include "Tempus_IntegratorBasic.hpp" 17 #include "Tempus_StepperFactory.hpp" 19 #include "Tempus_TimeStepControl.hpp" 21 #include "Tempus_StepperNewmarkImplicitDForm.hpp" 27 #include "../TestModels/SinCosModel.hpp" 28 #include "../TestModels/VanDerPolModel.hpp" 29 #include "../TestModels/HarmonicOscillatorModel.hpp" 30 #include "../TestUtils/Tempus_ConvergenceTestUtils.hpp" 39 using Teuchos::rcp_const_cast;
40 using Teuchos::rcp_dynamic_cast;
41 using Teuchos::ParameterList;
42 using Teuchos::sublist;
43 using Teuchos::getParametersFromXmlFile;
49 class StepperNewmarkImplicitDFormModifierTest
55 StepperNewmarkImplicitDFormModifierTest()
56 : testBEGIN_STEP(false), testBEFORE_SOLVE(false),
57 testAFTER_SOLVE(false), testEND_STEP(false),
58 testCurrentValue(-0.99),
59 testDt(-1.5), testName(
"")
63 virtual ~StepperNewmarkImplicitDFormModifierTest(){}
74 testBEGIN_STEP =
true;
79 testBEFORE_SOLVE =
true;
80 testDt = sh->getWorkingState()->getTimeStep();
86 testAFTER_SOLVE =
true;
87 testName =
"Newmark Implicit A Form - Modifier";
88 stepper->setStepperName(testName);
94 auto x = sh->getWorkingState()->getX();
95 testCurrentValue = get_ele(*(x), 0);
99 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
100 "Error - unknown action location.\n");
105 bool testBEFORE_SOLVE;
106 bool testAFTER_SOLVE;
108 double testCurrentValue;
110 std::string testName;
116 class StepperNewmarkImplicitDFormModifierXTest
122 StepperNewmarkImplicitDFormModifierXTest()
123 : testX_BEGIN_STEP(false), testX_BEFORE_SOLVE(false),
124 testX_AFTER_SOLVE(false), testX_END_STEP(false),
125 testX(-0.99), testXDot(-0.99),
126 testDt(-1.5), testTime(-1.5)
130 virtual ~StepperNewmarkImplicitDFormModifierXTest(){}
135 const double time,
const double dt,
141 testX_BEGIN_STEP =
true;
142 testX = get_ele(*(x), 0);
147 testX_BEFORE_SOLVE =
true;
153 testX_AFTER_SOLVE =
true;
155 testX = get_ele(*(x), 0);
160 testX_END_STEP =
true;
161 testX = get_ele(*(x), 0);
165 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
166 "Error - unknown action location.\n");
170 bool testX_BEGIN_STEP;
171 bool testX_BEFORE_SOLVE;
172 bool testX_AFTER_SOLVE;
188 stepper->setModel(model);
189 stepper->initialize();
190 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
200 bool useFSAL = stepper->getUseFSAL();
201 std::string ICConsistency = stepper->getICConsistency();
202 bool ICConsistencyCheck = stepper->getICConsistencyCheck();
203 bool zeroInitialGuess = stepper->getZeroInitialGuess();
204 std::string schemeName =
"Average Acceleration";
210 stepper->setAppAction(modifier); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
211 stepper->setAppAction(modifierX); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
212 stepper->setSolver(solver); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
213 stepper->setUseFSAL(useFSAL); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
214 stepper->setICConsistency(ICConsistency); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
215 stepper->setICConsistencyCheck(ICConsistencyCheck); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
216 stepper->setZeroInitialGuess(zeroInitialGuess); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
218 stepper->setSchemeName(schemeName); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
219 stepper->setBeta(beta); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
220 stepper->setGamma(gamma); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
225 model, solver, useFSAL,
226 ICConsistency, ICConsistencyCheck, zeroInitialGuess,
227 schemeName, beta, gamma, modifier));
228 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
231 TEUCHOS_ASSERT(stepper->getOrder() == 2);
246 using Teuchos::getParametersFromXmlFile;
247 using Teuchos::sublist;
248 using Teuchos::ParameterList;
253 RCP<ParameterList> pList = getParametersFromXmlFile(
254 "Tempus_NewmarkImplicitAForm_HarmonicOscillator_Damped_SecondOrder.xml");
255 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
258 RCP<ParameterList> hom_pl = sublist(pList,
"HarmonicOscillatorModel",
true);
259 RCP<const Thyra::ModelEvaluator<double> > model =
263 RCP<Tempus::StepperNewmarkImplicitDForm<double> > stepper =
266 auto modifier = rcp(
new StepperNewmarkImplicitDFormModifierTest());
267 stepper->setAppAction(modifier);
268 stepper->initialize();
271 RCP<Tempus::TimeStepControl<double> > timeStepControl =
273 ParameterList tscPL = pl->sublist(
"Default Integrator")
274 .sublist(
"Time Step Control");
275 timeStepControl->setInitIndex(tscPL.get<
int> (
"Initial Time Index"));
276 timeStepControl->setInitTime (tscPL.get<
double>(
"Initial Time"));
277 timeStepControl->setFinalTime(dt);
278 timeStepControl->setInitTimeStep(dt);
279 timeStepControl->initialize();
282 using Teuchos::rcp_const_cast;
283 auto inArgsIC = model->getNominalValues();
284 RCP<Thyra::VectorBase<double> > icX =
286 RCP<Thyra::VectorBase<double> > icXDot =
288 RCP<Thyra::VectorBase<double> > icXDotDot =
290 RCP<Tempus::SolutionState<double> > icState =
292 icState->setTime (timeStepControl->getInitTime());
293 icState->setIndex (timeStepControl->getInitIndex());
294 icState->setTimeStep(0.0);
295 icState->setOrder (stepper->getOrder());
299 RCP<Tempus::SolutionHistory<double> > solutionHistory =
301 solutionHistory->setName(
"Forward States");
303 solutionHistory->setStorageLimit(2);
304 solutionHistory->addState(icState);
307 RCP<Tempus::IntegratorBasic<double> > integrator =
308 Tempus::createIntegratorBasic<double>();
309 integrator->setStepper(stepper);
310 integrator->setTimeStepControl(timeStepControl);
311 integrator->setSolutionHistory(solutionHistory);
312 integrator->initialize();
315 bool integratorStatus = integrator->advanceTime();
316 TEST_ASSERT(integratorStatus)
320 TEST_COMPARE(modifier->testBEGIN_STEP, ==,
true);
321 TEST_COMPARE(modifier->testBEFORE_SOLVE, ==,
true);
322 TEST_COMPARE(modifier->testAFTER_SOLVE, ==,
true);
323 TEST_COMPARE(modifier->testEND_STEP, ==,
true);
326 auto x = integrator->getX();
327 auto Dt = integrator->getTime();
328 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
329 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
330 TEST_COMPARE(modifier->testName, ==, stepper->getStepperName());
336 using Teuchos::getParametersFromXmlFile;
337 using Teuchos::sublist;
338 using Teuchos::ParameterList;
343 RCP<ParameterList> pList = getParametersFromXmlFile(
344 "Tempus_NewmarkImplicitAForm_HarmonicOscillator_Damped_SecondOrder.xml");
345 RCP<ParameterList> pl = sublist(pList,
"Tempus",
true);
348 RCP<ParameterList> hom_pl = sublist(pList,
"HarmonicOscillatorModel",
true);
349 RCP<const Thyra::ModelEvaluator<double> > model =
353 RCP<Tempus::StepperNewmarkImplicitDForm<double> > stepper =
356 auto modifierX = rcp(
new StepperNewmarkImplicitDFormModifierXTest());
357 stepper->setAppAction(modifierX);
358 stepper->initialize();
361 RCP<Tempus::TimeStepControl<double> > timeStepControl =
363 ParameterList tscPL = pl->sublist(
"Default Integrator")
364 .sublist(
"Time Step Control");
365 timeStepControl->setInitIndex(tscPL.get<
int> (
"Initial Time Index"));
366 timeStepControl->setInitTime (tscPL.get<
double>(
"Initial Time"));
367 timeStepControl->setFinalTime(dt);
368 timeStepControl->setInitTimeStep(dt);
369 timeStepControl->initialize();
372 using Teuchos::rcp_const_cast;
373 auto inArgsIC = model->getNominalValues();
374 RCP<Thyra::VectorBase<double> > icX =
376 RCP<Thyra::VectorBase<double> > icXDot =
378 RCP<Thyra::VectorBase<double> > icXDotDot =
380 RCP<Tempus::SolutionState<double> > icState =
382 icState->setTime (timeStepControl->getInitTime());
383 icState->setIndex (timeStepControl->getInitIndex());
384 icState->setTimeStep(0.0);
385 icState->setOrder (stepper->getOrder());
389 RCP<Tempus::SolutionHistory<double> > solutionHistory =
391 solutionHistory->setName(
"Forward States");
393 solutionHistory->setStorageLimit(2);
394 solutionHistory->addState(icState);
397 RCP<Tempus::IntegratorBasic<double> > integrator =
398 Tempus::createIntegratorBasic<double>();
399 integrator->setStepper(stepper);
400 integrator->setTimeStepControl(timeStepControl);
401 integrator->setSolutionHistory(solutionHistory);
402 integrator->initialize();
405 bool integratorStatus = integrator->advanceTime();
406 TEST_ASSERT(integratorStatus)
409 TEST_COMPARE(modifierX->testX_BEGIN_STEP, ==,
true);
410 TEST_COMPARE(modifierX->testX_BEFORE_SOLVE, ==,
true);
411 TEST_COMPARE(modifierX->testX_AFTER_SOLVE, ==,
true);
412 TEST_COMPARE(modifierX->testX_END_STEP, ==,
true);
416 auto Dt = integrator->getTime();
417 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
419 const auto x = integrator->getX();
420 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
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.
void testFactoryConstruction(std::string stepperType, const Teuchos::RCP< const Thyra::ModelEvaluator< double > > &model)
Unit test utility for Stepper construction through StepperFactory.
Teuchos::RCP< StepperNewmarkImplicitDForm< Scalar > > createStepperNewmarkImplicitDForm(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.
Consider the ODE: where is a constant, is a constant damping parameter, is a constant forcing par...
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.