Tempus Version of the Day
Time Integration
Loading...
Searching...
No Matches
Tempus_UnitTest_NewmarkImplicitDForm.cpp
Go to the documentation of this file.
1// @HEADER
2// ****************************************************************************
3// Tempus: Copyright (2017) Sandia Corporation
4//
5// Distributed under BSD 3-clause license (See accompanying file Copyright.txt)
6// ****************************************************************************
7// @HEADER
8
10
11#include "Teuchos_XMLParameterListHelpers.hpp"
12
13#include "Tempus_TimeStepControl.hpp"
14
15#include "Tempus_StepperNewmarkImplicitDForm.hpp"
20
21#include "../TestModels/HarmonicOscillatorModel.hpp"
22
23
24namespace Tempus_Unit_Test {
25
26using Teuchos::RCP;
27using Teuchos::rcp;
28using Teuchos::rcp_const_cast;
29using Teuchos::rcp_dynamic_cast;
30using Teuchos::ParameterList;
31using Teuchos::sublist;
32
34
35// ************************************************************
36// ************************************************************
37class StepperNewmarkImplicitDFormModifierTest
39{
40public:
41
43 StepperNewmarkImplicitDFormModifierTest()
44 : testBEGIN_STEP(false), testBEFORE_SOLVE(false),
45 testAFTER_SOLVE(false), testEND_STEP(false),
46 testCurrentValue(-0.99),
47 testDt(-1.5), testName("")
48 {}
49
51 virtual ~StepperNewmarkImplicitDFormModifierTest(){}
52
54 virtual void modify(
55 Teuchos::RCP<Tempus::SolutionHistory<double> > sh,
58 {
59 switch(actLoc) {
60 case StepperNewmarkImplicitDFormAppAction<double>::BEGIN_STEP:
61 {
62 testBEGIN_STEP = true;
63 break;
64 }
65 case StepperNewmarkImplicitDFormAppAction<double>::BEFORE_SOLVE:
66 {
67 testBEFORE_SOLVE = true;
68 testDt = sh->getWorkingState()->getTimeStep();
69 //sh->getWorkingState()->setTimeStep(testDt);
70 break;
71 }
72 case StepperNewmarkImplicitDFormAppAction<double>::AFTER_SOLVE:
73 {
74 testAFTER_SOLVE = true;
75 testName = "Newmark Implicit A Form - Modifier";
76 stepper->setStepperName(testName);
77 break;
78 }
79 case StepperNewmarkImplicitDFormAppAction<double>::END_STEP:
80 {
81 testEND_STEP = true;
82 auto x = sh->getWorkingState()->getX();
83 testCurrentValue = get_ele(*(x), 0);
84 break;
85 }
86 default:
87 TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
88 "Error - unknown action location.\n");
89 }
90 }
91
92 bool testBEGIN_STEP;
93 bool testBEFORE_SOLVE;
94 bool testAFTER_SOLVE;
95 bool testEND_STEP;
96 double testCurrentValue;
97 double testDt;
98 std::string testName;
99};
100
101
102// ************************************************************
103// ************************************************************
104class StepperNewmarkImplicitDFormModifierXTest
106{
107public:
108
110 StepperNewmarkImplicitDFormModifierXTest()
111 : testX_BEGIN_STEP(false), testX_BEFORE_SOLVE(false),
112 testX_AFTER_SOLVE(false), testX_END_STEP(false),
113 testX(-0.99), testXDot(-0.99),
114 testDt(-1.5), testTime(-1.5)
115 {}
116
118 virtual ~StepperNewmarkImplicitDFormModifierXTest(){}
119
121 virtual void modify(
122 Teuchos::RCP<Thyra::VectorBase<double> > x,
123 const double time, const double dt,
125 {
126 switch(modType) {
127 case StepperNewmarkImplicitDFormModifierXBase<double>::X_BEGIN_STEP:
128 {
129 testX_BEGIN_STEP = true;
130 testX = get_ele(*(x), 0);
131 break;
132 }
133 case StepperNewmarkImplicitDFormModifierXBase<double>::X_BEFORE_SOLVE:
134 {
135 testX_BEFORE_SOLVE = true;
136 testDt = dt;
137 break;
138 }
139 case StepperNewmarkImplicitDFormModifierXBase<double>::X_AFTER_SOLVE:
140 {
141 testX_AFTER_SOLVE = true;
142 testTime = time;
143 testX = get_ele(*(x), 0);
144 break;
145 }
146 case StepperNewmarkImplicitDFormModifierXBase<double>::X_END_STEP:
147 {
148 testX_END_STEP = true;
149 testX = get_ele(*(x), 0);
150 break;
151 }
152 default:
153 TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
154 "Error - unknown action location.\n");
155 }
156 }
157
158 bool testX_BEGIN_STEP;
159 bool testX_BEFORE_SOLVE;
160 bool testX_AFTER_SOLVE;
161 bool testX_END_STEP;
162 double testX;
163 double testXDot;
164 double testDt;
165 double testTime;
166};
167
168// ************************************************************
169// ************************************************************
170TEUCHOS_UNIT_TEST(NewmarkImplicitDForm, Default_Construction)
171{
172 auto model = rcp(new Tempus_Test::HarmonicOscillatorModel<double>());
173
174 // Default construction.
175 auto stepper = rcp(new Tempus::StepperNewmarkImplicitDForm<double>());
176 stepper->setModel(model);
177 stepper->initialize();
178 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
179
182
183
184 // Default values for construction.
185 auto solver = rcp(new Thyra::NOXNonlinearSolver());
186 solver->setParameterList(Tempus::defaultSolverParameters());
187
188 bool useFSAL = stepper->getUseFSAL();
189 std::string ICConsistency = stepper->getICConsistency();
190 bool ICConsistencyCheck = stepper->getICConsistencyCheck();
191 bool zeroInitialGuess = stepper->getZeroInitialGuess();
192 std::string schemeName = "Average Acceleration";
193 double beta = 0.25;
194 double gamma = 0.5;
195
196
197 // Test the set functions.
198 stepper->setAppAction(modifier); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
199 stepper->setAppAction(modifierX); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
200 stepper->setSolver(solver); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
201 stepper->setUseFSAL(useFSAL); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
202 stepper->setICConsistency(ICConsistency); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
203 stepper->setICConsistencyCheck(ICConsistencyCheck); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
204 stepper->setZeroInitialGuess(zeroInitialGuess); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
205
206 stepper->setSchemeName(schemeName); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
207 stepper->setBeta(beta); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
208 stepper->setGamma(gamma); stepper->initialize(); TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
209
210
211 // Full argument list construction.
213 model, solver, useFSAL,
214 ICConsistency, ICConsistencyCheck, zeroInitialGuess,
215 schemeName, beta, gamma, modifier));
216 TEUCHOS_TEST_FOR_EXCEPT(!stepper->isInitialized());
217
218 // Test stepper properties.
219 TEUCHOS_ASSERT(stepper->getOrder() == 2);
220}
221
222
223// ************************************************************
224// ************************************************************
225TEUCHOS_UNIT_TEST(NewmarkImplicitDForm, StepperFactory_Construction)
226{
227 auto model = rcp(new Tempus_Test::HarmonicOscillatorModel<double>());
228 testFactoryConstruction("Newmark Implicit d-Form", model);
229}
230
231TEUCHOS_UNIT_TEST(NewmarkImplicitDForm, AppAction_Modifier)
232{
233 using Teuchos::RCP;
234 using Teuchos::sublist;
235 using Teuchos::ParameterList;
236
237 double dt = 1.0;
238
239 // Read params from .xml file
240 RCP<ParameterList> pList = Teuchos::getParametersFromXmlFile(
241 "Tempus_NewmarkImplicitAForm_HarmonicOscillator_Damped_SecondOrder.xml");
242 RCP<ParameterList> pl = sublist(pList, "Tempus", true);
243
244 // Setup the HarmonicOscillatorModel
245 RCP<ParameterList> hom_pl = sublist(pList, "HarmonicOscillatorModel", true);
246 RCP<const Thyra::ModelEvaluator<double> > model =
247 Teuchos::rcp(new Tempus_Test::HarmonicOscillatorModel<double>(hom_pl));
248
249 // Setup Stepper for field solve ----------------------------
250 RCP<Tempus::StepperNewmarkImplicitDForm<double> > stepper =
251 Tempus::createStepperNewmarkImplicitDForm(model, Teuchos::null);
252
253 auto modifier = rcp(new StepperNewmarkImplicitDFormModifierTest());
254 stepper->setAppAction(modifier);
255 stepper->initialize();
256
257 // Setup TimeStepControl ------------------------------------
258 RCP<Tempus::TimeStepControl<double> > timeStepControl =
259 Teuchos::rcp(new Tempus::TimeStepControl<double>());
260 ParameterList tscPL = pl->sublist("Default Integrator")
261 .sublist("Time Step Control");
262 timeStepControl->setInitIndex(tscPL.get<int> ("Initial Time Index"));
263 timeStepControl->setInitTime (tscPL.get<double>("Initial Time"));
264 timeStepControl->setFinalTime(dt);
265 timeStepControl->setInitTimeStep(dt);
266 timeStepControl->initialize();
267
268 // Setup initial condition SolutionState --------------------
269 using Teuchos::rcp_const_cast;
270 auto inArgsIC = model->getNominalValues();
271 RCP<Thyra::VectorBase<double> > icX =
272 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x());
273 RCP<Thyra::VectorBase<double> > icXDot =
274 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot());
275 RCP<Thyra::VectorBase<double> > icXDotDot =
276 rcp_const_cast<Thyra::VectorBase<double> > (inArgsIC.get_x_dot_dot());
277 RCP<Tempus::SolutionState<double> > icState =
278 Tempus::createSolutionStateX(icX, icXDot, icXDotDot);
279 icState->setTime (timeStepControl->getInitTime());
280 icState->setIndex (timeStepControl->getInitIndex());
281 icState->setTimeStep(0.0);
282 icState->setOrder (stepper->getOrder());
283 icState->setSolutionStatus(Tempus::Status::PASSED); // ICs are passing.
284
285 // Setup SolutionHistory ------------------------------------
286 RCP<Tempus::SolutionHistory<double> > solutionHistory =
287 Teuchos::rcp(new Tempus::SolutionHistory<double>());
288 solutionHistory->setName("Forward States");
289 solutionHistory->setStorageType(Tempus::STORAGE_TYPE_STATIC);
290 solutionHistory->setStorageLimit(2);
291 solutionHistory->addState(icState);
292
293 // Setup Integrator -----------------------------------------
294 RCP<Tempus::IntegratorBasic<double> > integrator =
295 Tempus::createIntegratorBasic<double>();
296 integrator->setStepper(stepper);
297 integrator->setTimeStepControl(timeStepControl);
298 integrator->setSolutionHistory(solutionHistory);
299 integrator->initialize();
300
301 // Integrate to timeMax
302 bool integratorStatus = integrator->advanceTime();
303 TEST_ASSERT(integratorStatus)
304
305
306 // Testing that each ACTION_LOCATION has been called.
307 TEST_COMPARE(modifier->testBEGIN_STEP, ==, true);
308 TEST_COMPARE(modifier->testBEFORE_SOLVE, ==, true);
309 TEST_COMPARE(modifier->testAFTER_SOLVE, ==, true);
310 TEST_COMPARE(modifier->testEND_STEP, ==, true);
311
312 // Testing that values can be set through the Modifier.
313 auto x = integrator->getX();
314 auto Dt = integrator->getTime();
315 TEST_FLOATING_EQUALITY(modifier->testDt, Dt, 1.0e-14);
316 TEST_FLOATING_EQUALITY(modifier->testCurrentValue, get_ele(*(x), 0), 1.0e-14);
317 TEST_COMPARE(modifier->testName, ==, stepper->getStepperName());
318}
319
320TEUCHOS_UNIT_TEST(NewmarkImplicitDForm, AppAction_ModifierX)
321{
322 using Teuchos::RCP;
323 using Teuchos::sublist;
324 using Teuchos::ParameterList;
325
326 double dt = 1.0;
327
328 // Read params from .xml file
329 RCP<ParameterList> pList = Teuchos::getParametersFromXmlFile(
330 "Tempus_NewmarkImplicitAForm_HarmonicOscillator_Damped_SecondOrder.xml");
331 RCP<ParameterList> pl = sublist(pList, "Tempus", true);
332
333 // Setup the HarmonicOscillatorModel
334 RCP<ParameterList> hom_pl = sublist(pList, "HarmonicOscillatorModel", true);
335 RCP<const Thyra::ModelEvaluator<double> > model =
336 Teuchos::rcp(new Tempus_Test::HarmonicOscillatorModel<double>(hom_pl));
337
338 // Setup Stepper for field solve ----------------------------
339 RCP<Tempus::StepperNewmarkImplicitDForm<double> > stepper =
340 Tempus::createStepperNewmarkImplicitDForm(model, Teuchos::null);
341
342 auto modifierX = rcp(new StepperNewmarkImplicitDFormModifierXTest());
343 stepper->setAppAction(modifierX);
344 stepper->initialize();
345
346 // Setup TimeStepControl ------------------------------------
347 RCP<Tempus::TimeStepControl<double> > timeStepControl =
348 Teuchos::rcp(new Tempus::TimeStepControl<double>());
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();
356
357 // Setup initial condition SolutionState --------------------
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 =
367 Tempus::createSolutionStateX(icX, icXDot, icXDotDot);
368 icState->setTime (timeStepControl->getInitTime());
369 icState->setIndex (timeStepControl->getInitIndex());
370 icState->setTimeStep(0.0);
371 icState->setOrder (stepper->getOrder());
372 icState->setSolutionStatus(Tempus::Status::PASSED); // ICs are passing.
373
374 // Setup SolutionHistory ------------------------------------
375 RCP<Tempus::SolutionHistory<double> > solutionHistory =
376 Teuchos::rcp(new Tempus::SolutionHistory<double>());
377 solutionHistory->setName("Forward States");
378 solutionHistory->setStorageType(Tempus::STORAGE_TYPE_STATIC);
379 solutionHistory->setStorageLimit(2);
380 solutionHistory->addState(icState);
381
382 // Setup Integrator -----------------------------------------
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();
389
390 // Integrate to timeMax
391 bool integratorStatus = integrator->advanceTime();
392 TEST_ASSERT(integratorStatus)
393
394 // Testing that each ACTION_LOCATION has been called.
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);
399
400
401 // Testing that values can be set through the Modifier.
402 auto Dt = integrator->getTime();
403 TEST_FLOATING_EQUALITY(modifierX->testDt, Dt, 1.0e-14);
404
405 const auto x = integrator->getX();
406 TEST_FLOATING_EQUALITY(modifierX->testX, get_ele(*(x), 0), 1.0e-14);
407}
408
409} // namespace Tempus_Test
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
ACTION_LOCATION
Indicates the location of application action (see algorithm).
MODIFIER_TYPE
Indicates the location of application action (see algorithm).
virtual void modify(Teuchos::RCP< Thyra::VectorBase< double > >, const double, const double, const MODIFIER_TYPE modType)=0
Modify solution based on the MODIFIER_TYPE.
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< 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.