Tempus  Version of the Day
Time Integration
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Tempus_StepperLeapfrog_impl.hpp
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 
9 #ifndef Tempus_StepperLeapfrog_impl_hpp
10 #define Tempus_StepperLeapfrog_impl_hpp
11 
12 #include "Thyra_VectorStdOps.hpp"
13 
15 
16 
17 namespace Tempus {
18 
19 
20 template<class Scalar>
22 {
23  this->setStepperName( "Leapfrog");
24  this->setStepperType( "Leapfrog");
25  this->setUseFSAL( false);
26  this->setICConsistency( "Consistent");
27  this->setICConsistencyCheck( false);
28 
29  this->setAppAction(Teuchos::null);
30 }
31 
32 template<class Scalar>
34  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& appModel,
35  bool useFSAL,
36  std::string ICConsistency,
37  bool ICConsistencyCheck,
38  const Teuchos::RCP<StepperLeapfrogAppAction<Scalar> >& stepperLFAppAction)
39  {
40  this->setStepperName( "Leapfrog");
41  this->setStepperType( "Leapfrog");
42  this->setUseFSAL( useFSAL);
43  this->setICConsistency( ICConsistency);
44  this->setICConsistencyCheck( ICConsistencyCheck);
45  this->setAppAction(stepperLFAppAction);
46  if (appModel != Teuchos::null) {
47 
48  this->setModel(appModel);
49  this->initialize();
50  }
51  }
52 
53 
54 template<class Scalar>
57  {
58  if (appAction == Teuchos::null) {
59  // Create default appAction
60  stepperLFAppAction_ =
62  }
63  else {
64  stepperLFAppAction_ = appAction;
65  }
66 }
67 
68 
69 template<class Scalar>
71  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory)
72 {
73  using Teuchos::RCP;
74 
75  RCP<SolutionState<Scalar> > initialState = solutionHistory->getCurrentState();
76 
77  // Check if we need Stepper storage for xDotDot
78  if (initialState->getXDotDot() == Teuchos::null)
79  this->setStepperXDotDot(initialState->getX()->clone_v());
80  else
81  this->setStepperXDotDot(initialState->getXDotDot());
82 
84 
85  if (this->getUseFSAL()) {
86  Teuchos::RCP<Teuchos::FancyOStream> out = this->getOStream();
87  Teuchos::OSTab ostab(out,1,"StepperLeapfrog::setInitialConditions()");
88  *out << "Warning -- The First-Same-As-Last (FSAL) principle is not "
89  << "used with Leapfrog because of the algorithm's prescribed "
90  << "order of solution update. The default is to set useFSAL=false, "
91  << "however useFSAL=true will also work but have no affect "
92  << "(i.e., no-op).\n" << std::endl;
93  }
94 }
95 
96 template<class Scalar>
98  const Teuchos::RCP<SolutionHistory<Scalar> >& solutionHistory)
99 {
100  this->checkInitialized();
101 
102  using Teuchos::RCP;
103 
104  TEMPUS_FUNC_TIME_MONITOR("Tempus::StepperLeapfrog::takeStep()");
105  {
106  TEUCHOS_TEST_FOR_EXCEPTION(solutionHistory->getNumStates() < 2,
107  std::logic_error,
108  "Error - StepperLeapfrog<Scalar>::takeStep(...)\n"
109  "Need at least two SolutionStates for Leapfrog.\n"
110  " Number of States = " << solutionHistory->getNumStates() << "\n"
111  "Try setting in \"Solution History\" \"Storage Type\" = \"Undo\"\n"
112  " or \"Storage Type\" = \"Static\" and \"Storage Limit\" = \"2\"\n");
113 
114  RCP<SolutionState<Scalar> > currentState=solutionHistory->getCurrentState();
115  RCP<SolutionState<Scalar> > workingState=solutionHistory->getWorkingState();
116  const Scalar time = currentState->getTime();
117  const Scalar dt = workingState->getTimeStep();
118 
119 
120  RCP<StepperLeapfrog<Scalar> > thisStepper = Teuchos::rcpFromRef(*this);
121 
122  stepperLFAppAction_->execute(solutionHistory, thisStepper,
124 
125  // Perform half-step startup if working state is synced
126  // (i.e., xDot and x are at the same time level).
127  if (workingState->getIsSynced() == true) {
128  // Half-step startup: xDot_{n+1/2} = xDot_n + 0.5*dt*xDotDot_n
129  Thyra::V_VpStV(Teuchos::outArg(*(workingState->getXDot())),
130  *(currentState->getXDot()),0.5*dt,*(currentState->getXDotDot()));
131  }
132  stepperLFAppAction_->execute(solutionHistory, thisStepper,
134  // x_{n+1} = x_n + dt*xDot_{n+1/2}
135  Thyra::V_VpStV(Teuchos::outArg(*(workingState->getX())),
136  *(currentState->getX()),dt,*(workingState->getXDot()));
137 
138  stepperLFAppAction_->execute(solutionHistory, thisStepper,
141 
142  // Evaluate xDotDot = f(x,t).
143  this->evaluateExplicitODE(workingState->getXDotDot(),
144  workingState->getX(),
145  Teuchos::null, time+dt, p);
146  stepperLFAppAction_->execute(solutionHistory, thisStepper,
148  if (workingState->getOutput() == true) {
149  // Half-step sync: xDot_{n+1} = xDot_{n+1/2} + 0.5*dt*xDotDot_{n+1}
150  Thyra::V_VpStV(Teuchos::outArg(*(workingState->getXDot())),
151  *(workingState->getXDot()),0.5*dt,*(workingState->getXDotDot()));
152  workingState->setIsSynced(true);
153  } else {
154  // Full leapfrog step: xDot_{n+3/2} = xDot_{n+1/2} + dt*xDotDot_{n+1}
155  Thyra::V_VpStV(Teuchos::outArg(*(workingState->getXDot())),
156  *(workingState->getXDot()),dt,*(workingState->getXDotDot()));
157  workingState->setIsSynced(false);
158  }
159 
160  workingState->setSolutionStatus(Status::PASSED);
161  workingState->setOrder(this->getOrder());
162  workingState->computeNorms(currentState);
163 
164  stepperLFAppAction_->execute(solutionHistory, thisStepper,
166  }
167  return;
168 }
169 
170 
177 template<class Scalar>
180 {
182  rcp(new StepperState<Scalar>(this->getStepperType()));
183  return stepperState;
184 }
185 
186 
187 template<class Scalar>
190  const Teuchos::EVerbosityLevel verbLevel) const
191 {
192  out << std::endl;
193  Stepper<Scalar>::describe(out, verbLevel);
194  StepperExplicit<Scalar>::describe(out, verbLevel);
195 
196  out << "--- StepperLeapfrog ---\n";
197  out << " stepperLFAppAction_ = "
198  << stepperLFAppAction_ << std::endl;
199  out << "-----------------------" << std::endl;
200 }
201 
202 
203 template<class Scalar>
205 {
206  bool isValidSetup = true;
207 
208  if ( !Stepper<Scalar>::isValidSetup(out) ) isValidSetup = false;
209  if ( !StepperExplicit<Scalar>::isValidSetup(out) ) isValidSetup = false;
210  if (stepperLFAppAction_ == Teuchos::null) {
211  isValidSetup = false;
212  out << "The Leapfrog AppAction is not set!\n";
213  }
214 
215 
216  return isValidSetup;
217 }
218 
219 
220 // Nonmember constructor - ModelEvaluator and ParameterList
221 // ------------------------------------------------------------------------
222 template<class Scalar>
225  const Teuchos::RCP<const Thyra::ModelEvaluator<Scalar> >& model,
227 {
228  auto stepper = Teuchos::rcp(new StepperLeapfrog<Scalar>());
229  stepper->setStepperExplicitValues(pl);
230 
231  if (model != Teuchos::null) {
232  stepper->setModel(model);
233  stepper->initialize();
234  }
235 
236  return stepper;
237 }
238 
239 
240 } // namespace Tempus
241 #endif // Tempus_StepperLeapfrog_impl_hpp
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions and make them consistent.
Teuchos::RCP< StepperLeapfrog< Scalar > > createStepperLeapfrog(const Teuchos::RCP< const Thyra::ModelEvaluator< Scalar > > &model, Teuchos::RCP< Teuchos::ParameterList > pl)
Nonmember constructor - ModelEvaluator and ParameterList.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
virtual void takeStep(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Take the specified timestep, dt, and return true if successful.
Thyra Base interface for time steppers.
StepperState is a simple class to hold state information about the stepper.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Application Action for StepperLeapfrog.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual void setInitialConditions(const Teuchos::RCP< SolutionHistory< Scalar > > &solutionHistory)
Set the initial conditions, make them consistent, and set needed memory.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
virtual Teuchos::RCP< Tempus::StepperState< Scalar > > getDefaultStepperState()
Get a default (initial) StepperState.
SolutionHistory is basically a container of SolutionStates. SolutionHistory maintains a collection of...
virtual bool isValidSetup(Teuchos::FancyOStream &out) const
StepperLeapfrog()
Default constructor.
virtual void setAppAction(Teuchos::RCP< StepperLeapfrogAppAction< Scalar > > appAction)
Thyra Base interface for implicit time steppers.