30#ifndef Rythmos_INTEGRATOR_BUILDER_DEF_H
31#define Rythmos_INTEGRATOR_BUILDER_DEF_H
34#include "Rythmos_IntegratorBuilder_decl.hpp"
35#include "Rythmos_IntegrationControlStrategyAcceptingIntegratorBase.hpp"
36#include "Rythmos_SolverAcceptingStepperBase.hpp"
39#include "Teuchos_as.hpp"
42#include "Rythmos_DefaultIntegrator.hpp"
43#include "Rythmos_SimpleIntegrationControlStrategy.hpp"
44#include "Rythmos_RampingIntegrationControlStrategy.hpp"
45#include "Rythmos_FixedStepControlStrategy.hpp"
46#include "Rythmos_SimpleStepControlStrategy.hpp"
47#include "Rythmos_FirstOrderErrorStepControlStrategy.hpp"
48#include "Rythmos_ImplicitBDFStepperStepControl.hpp"
49#include "Rythmos_ImplicitBDFStepperRampingStepControl.hpp"
50#include "Rythmos_InterpolationBuffer.hpp"
51#include "Rythmos_PointwiseInterpolationBufferAppender.hpp"
53#include "Rythmos_ImplicitBDFStepperErrWtVecCalc.hpp"
54#include "Rythmos_LinearInterpolator.hpp"
55#include "Rythmos_HermiteInterpolator.hpp"
56#include "Rythmos_CubicSplineInterpolator.hpp"
59#include "Rythmos_ForwardSensitivityStepper.hpp"
65 static std::string integratorSettings_name =
"Integrator Settings";
66 static std::string integratorSettings_docs =
67 "These parameters are used directly in setting up the Integrator.";
68 static std::string integratorSelection_name =
"Integrator Selection";
69 static std::string integratorSelection_docs =
70 "Select the Integrator to be used.";
71 static std::string integrationControlSelection_name =
72 "Integration Control Strategy Selection";
73 static std::string integrationControlSelection_docs =
74 "Note that some settings conflict between step control and integration "
75 "control. In general, the integration control decides which steps will "
76 "be fixed or variable, not the stepper. When the integration control "
77 "decides to take variable steps, the step control is then responsible "
78 "for choosing appropriate step-sizes.";
79 static std::string stepperSettings_name =
"Stepper Settings";
80 static std::string stepperSettings_docs =
81 "This parameter list sets various parameters for the Stepper.";
82 static std::string stepperSelection_name =
"Stepper Selection";
83 static std::string stepperSelection_docs =
84 "Selects the Stepper for the time integration. It should be that "
85 "some time integrators can be accessed through different Steppers, "
86 "e.g., Backward Euler can be obtained through the `Backward Euler', "
87 "a first-order `Implicit BDF', or a one-stage `Implicit RK' Stepper."
88 "Special note for `Implicit RK' Stepper: If a fully implicit RK Butcher "
89 "tableau is chosen, then the stepper will not be fully initialized "
90 "unless a W factory object is set on the IntegratorBuilder through "
92 static std::string ForwardEulerStepper_name =
"Forward Euler";
93 static std::string ForwardEulerStepper_docs =
94 "This is the basic Forward Euler method: x_n = x_{n-1} + dt*x_dot_{n-1}";
95 static std::string BackwardEulerStepper_name =
"Backward Euler";
96 static std::string BackwardEulerStepper_docs =
97 "This is the basic Backward Euler method: x_n = x_{n-1} + dt*x_dot_n";
98 static std::string ImplicitBDFStepper_name =
"Implicit BDF";
99 static std::string ImplicitBDFStepper_docs =
100 "This Stepper provides a re-implementation of the algorithms in "
101 "the LLNL Sundials code IDA. This is an implicit BDF integrator "
102 "for DAEs which uses variable step-sizes and variable-orders "
103 "first through fourth.";
104 static std::string rkButcherTableauSelection_name =
105 "Runge Kutta Butcher Tableau Selection";
106 static std::string rkButcherTableauSelection_docs =
107 "Only the Explicit RK Stepper and the Implicit RK Stepper accept an "
108 "RK Butcher Tableau.";
109 static std::string ExplicitRKStepper_name =
"Explicit RK";
110 static std::string ExplicitRKStepper_docs =
111 "This Stepper has many explicit time-integrators using Runge-Kutta "
112 "formulation and the Butcher Tableau specification. See `"
113 +rkButcherTableauSelection_name+
"' ParameterList for available options.";
114 static std::string ImplicitRKStepper_name =
"Implicit RK";
115 static std::string ImplicitRKStepper_docs =
116 "This Stepper has many implicit time-integrators using Runge-Kutta "
117 "formulation and the Butcher Tableau specification. See `"
118 +rkButcherTableauSelection_name+
"' ParameterList for available options.";
119 static std::string stepControlSettings_name =
"Step Control Settings";
120 static std::string stepControlSettings_docs =
121 "Not all step control strategies are compatible with each stepper. "
122 "If the strategy has the name of a stepper in its name, then it only "
123 "works with that stepper.";
124 static std::string stepControlSelection_name =
125 "Step Control Strategy Selection";
126 static std::string stepControlSelection_docs =
127 "Used to select the Control Strategy for the stepper.";
128 static std::string errWtVecSelection_name =
129 "Error Weight Vector Calculator Selection";
130 static std::string errWtVecSelection_docs =
131 "Not all ErrWtVec calculators are compatible with each step control "
132 "strategy. If the calculator has the name of a stepper or another "
133 "step control strategy in its name, then it only works with that step "
135 static std::string interpolationBufferSettings_name =
136 "Interpolation Buffer Settings";
137 static std::string interpolationBufferSettings_docs =
138 "This parameter list sets various parameters for the InterpolationBuffer.";
139 static std::string interpolationBufferSelection_name =
140 "Trailing Interpolation Buffer Selection";
141 static std::string interpolationBufferSelection_docs =
142 "Used to select the Interpolation Buffer.";
143 static std::string interpolationBufferAppenderSelection_name =
144 "Interpolation Buffer Appender Selection";
145 static std::string interpolationBufferAppenderSelection_docs =
146 "Used to select the Interpolation Buffer Appender.";
147 static std::string initialTime_name =
"Initial Time";
148 static int initialTime_default = 0;
149 static std::string initialTime_docs =
150 "The initial time to start integration.";
151 static std::string finalTimeRythmos_name =
"Final Time";
152 static int finalTimeRythmos_default = 1;
153 static std::string finalTimeRythmos_docs =
"The final time to end integration.";
154 static std::string landOnFinalTime_name =
"Land On Final Time";
155 static bool landOnFinalTime_default =
true;
156 static std::string landOnFinalTime_docs =
157 "Exactly land on the final time; do not step past final time and "
159 static std::string interpolatorSelection_name =
"Interpolator Selection";
160 static std::string interpolatorSelection_docs =
161 "Choose the interpolator to use.";
162 static std::string stepperInterpolatorSelection_docs =
163 "Note all Steppers accept an interpolator. Currently, only the "
164 "BackwardEuler stepper does.";
167 static std::string integratorBuilder_name =
"Rythmos::Integrator";
168 static std::string integratorBuilderType_name =
"Integrator Type";
169 static std::string integrationControlBuilder_name =
170 "Rythmos::IntegrationControlStrategy";
171 static std::string integrationControlBuilderType_name =
172 "Integration Control Strategy Type";
173 static std::string stepControlBuilder_name =
174 "Rythmos::StepControlStrategy";
175 static std::string stepControlBuilderType_name =
176 "Step Control Strategy Type";
177 static std::string interpolationBufferBuilder_name =
178 "Rythmos::InterpolationBuffer";
179 static std::string interpolationBufferBuilderType_name =
180 "Interpolation Buffer Type";
181 static std::string interpolationBufferAppenderBuilder_name =
182 "Rythmos::InterpolationBufferAppender";
183 static std::string interpolationBufferAppenderBuilderType_name =
184 "Interpolation Buffer Appender Type";
185 static std::string errWtVecCalcBuilder_name =
"Rythmos::ErrWtVecCalc";
186 static std::string errWtVecCalcBuilderType_name =
187 "Error Weight Vector Calculator Type";
188 static std::string interpolatorBuilder_name =
"Rythmos::Interpolator";
189 static std::string interpolatorBuilderType_name =
"Interpolator Type";
192 static std::string defaultIntegrator_name =
"Default Integrator";
193 static std::string defaultIntegrator_docs =
194 "This Integrator will accept an IntergationControlStrategy, and "
195 "can have an IntegrationObserver. The client can specify the "
196 "maximum number of time steps allowed. The Integrator will loop "
197 "over the Stepper until it reaches the requested time. For each "
198 "step, the step size will be determined through a couple "
199 "mechanisms/filters. If an Integration Control Strategy has "
200 "been specified, the step size and the step type (fixed or "
201 "variable) will be determined by it. Otherwise the step size "
202 "will be set to the maximum real value and the step type will "
203 "be variable. Next if the step size is beyond the final time "
204 "and the `"+landOnFinalTime_name+
"' is specified, the step size is "
205 "adjusted to advance the state to the final time. The Stepper "
206 "is passed this step size and type to advance the state. The "
207 "DefaultIntegrator determines the step size and type taken by "
208 "the Stepper, and if the step has failed. If the "
209 "IntegrationControlStrategy handles failures, it can suggest "
210 "another step size and retry with the Stepper. Otherwise, the "
211 "Integrator will fall through with a failure. With a successful "
212 "step of the Stepper, the Integrator repeats the above until it "
213 "reaches the requested time. Multiple requested times can be "
214 "passed to the Integrator.";
215 static std::string simpleIntegrationControl_name =
216 "Simple Integration Control Strategy";
217 static std::string simpleIntegrationControl_docs =
218 "This Integration Control Strategy is meant to be simple with "
219 "very few parameters controlling it. Basically the client can "
220 "select fixed step type (the Stepper can only take the requested "
221 "step size) or variable step type (the Stepper can adjust the step "
222 "size to meet accuracy, order, or other criteria). For fixed step "
223 "type, the client can specify the step size and number of steps. "
224 "For variable step type, the client can set the maximum step size "
226 static std::string rampingIntegrationControl_name =
227 "Ramping Integration Control Strategy";
228 static std::string rampingIntegrationControl_docs =
229 "This Integration Control Strategy is very similar to `"
230 +simpleIntegrationControl_name+
"' except for handling an initial "
231 "constant-sized steps followed by a ramped-fixed-sized steps, "
232 "and finally variable- or fixed-sized steps. The client needs to "
233 "additionally set the initial step size and the maximum number of "
234 "step failures allowed.";
235 static std::string rampErrIntegrationControl_name =
236 "Ramp and Error Integration Control Strategy";
237 static std::string fixedStepControl_name =
"Fixed Step Control Strategy";
238 static std::string fixedStepControl_docs =
239 "This Step Control Strategy can be used for Steppers setup for "
240 "variable step type (a stepper that can adjust its step size based "
241 "on accuracy, order or other criteria), but would like to make fixed "
242 "step sizes or used fixed step size as its default.\n";
243 static std::string simpleStepControl_name =
"Simple Step Control Strategy";
244 static std::string simpleStepControl_docs =
245 "This Step Control Strategy starts with the initial step size, "
246 "and simply increases or decreases the step size by the "
247 "appropriate factor which is based on the change in the "
248 "solution relative to the specified relative and absolute "
249 "tolerances (|dx| < r*|x| + a) and if solution status from the "
250 "solver passes. Additionally the step size is bounded by the "
251 "miminum and maximum step size, and the stepper will fail if "
252 "the step size fails more than the specified value.";
253 static std::string implicitBDFStepControl_name =
254 "Implicit BDF Stepper Step Control Strategy";
255 static std::string implicitBDFStepControl_docs =
256 "This Step Control Strategy is specifically for use with the `"
257 +ImplicitBDFStepper_name+
"' Stepper. The parameters in this list "
258 "and sublist are directly related to those available in SUNDAILS/IDA. "
259 "See Hindmarsh, `The PVODE and IDA Algorithms', 2000 for more details. ";
260 static std::string implicitBDFStepperErrWtVecCalc_name =
261 "Implicit BDF Stepper Error Weight Vector Calculator";
262 static std::string implicitBDFStepperErrWtVecCalc_docs =
263 "This Error Weight Vector Calculator is specifically for use with the `"
264 +ImplicitBDFStepper_name+
"' Stepper.";
265 static std::string firstOrderErrorStepControl_name =
266 "First Order Error Step Control Strategy";
267 static std::string firstOrderErrorStepControl_docs =
268 "This Step Control Strategy produces a step size based on a first-order "
269 "predictor (Forward Euler) and a first-order solution (Backward Euler) by "
270 "by using a weight norm of the difference between the predicted and "
271 "solution. See Gresho and Sani, `Incompressible Flow and the Finite "
272 "Element Method', Vol. 1, 1998, p. 268.";
273 static std::string implicitBDFRampingStepControl_name =
274 "Implicit BDF Stepper Ramping Step Control Strategy";
275 static std::string implicitBDFRampingStepControl_docs =
276 "This Step Control Strategy is specifically for use with the `"
277 +ImplicitBDFStepper_name+
"' Stepper, and has a two-phase approach: "
278 "constant step sizes and followed by variable step sizes. The step "
279 "size is adjusted based on the WRMS, see "
280 +implicitBDFStepperErrWtVecCalc_name;
281 static std::string defaultInterpolationBuffer_name =
"Interpolation Buffer";
282 static std::string defaultInterpolationBuffer_docs =
283 "Sets parameters for the Interpolation Buffer.";
284 static std::string pointwiseInterpolationBufferAppender_name =
285 "Pointwise Interpolation Buffer Appender";
286 static std::string pointwiseInterpolationBufferAppender_docs =
287 "Appender that just transfers nodes without any regard for accuracy or "
291 static std::string linearInterpolator_name =
"Linear Interpolator";
292 static std::string linearInterpolator_docs =
293 "This provides a simple linear interpolation between time nodes.";
294 static std::string hermiteInterpolator_name =
"Hermite Interpolator";
295 static std::string hermiteInterpolator_docs =
296 "This provides a piecewise cubic Hermite interpolation on each interval "
297 "where the data is the solution and its time derivatives at the end "
298 "points of the interval. It will match 3rd degree polynomials exactly "
299 "with both function values and derivatives.";
300 static std::string cubicSplineInterpolator_name =
"Cubic Spline Interpolator";
301 static std::string cubicSplineInterpolator_docs =
302 "This provides a cubic spline interpolation between time nodes.";
310template<
class Scalar>
313 this->initializeDefaults_();
317template<
class Scalar>
323template<
class Scalar>
325 const RCP<
const Teuchos::AbstractFactory<IntegratorBase<Scalar> > > &integratorFactory,
326 const std::string &integratorName
329 integratorBuilder_->setObjectFactory(integratorFactory, integratorName);
330 validPL_ = Teuchos::null;
334template<
class Scalar>
336 const RCP<
const Teuchos::AbstractFactory<IntegrationControlStrategyBase<Scalar> > > &integrationControlFactory,
337 const std::string &integrationControlName
340 integrationControlBuilder_->setObjectFactory(integrationControlFactory,
341 integrationControlName);
342 validPL_ = Teuchos::null;
346template<
class Scalar>
348 const RCP<StepperBuilder<Scalar> > &stepperBuilder
351 TEUCHOS_TEST_FOR_EXCEPT(is_null(stepperBuilder));
352 stepperBuilder_ = stepperBuilder;
353 validPL_ = Teuchos::null;
357template<
class Scalar>
360 return stepperBuilder_;
364template<
class Scalar>
366 const RCP<RKButcherTableauBuilder<Scalar> > & rkbtBuilder
369 TEUCHOS_TEST_FOR_EXCEPT(is_null(rkbtBuilder));
370 rkbtBuilder_ = rkbtBuilder;
371 validPL_ = Teuchos::null;
375template<
class Scalar>
377 const RCP<
const Teuchos::AbstractFactory<StepControlStrategyBase<Scalar> > > &
378 stepControlStrategyFactory,
379 const std::string &stepControlName
382 stepControlBuilder_->setObjectFactory(stepControlStrategyFactory,
384 validPL_ = Teuchos::null;
388template<
class Scalar>
390 const RCP<
const Teuchos::AbstractFactory<InterpolationBufferBase<Scalar> > > &interpolationBufferFactory,
391 const std::string &interpolationBufferName
394 interpolationBufferBuilder_->setObjectFactory(interpolationBufferFactory, interpolationBufferName);
395 validPL_ = Teuchos::null;
399template<
class Scalar>
401 const RCP<
const Teuchos::AbstractFactory<InterpolationBufferAppenderBase<Scalar> > > &interpolationBufferAppenderFactory,
402 const std::string &interpolationBufferAppenderName
405 interpolationBufferAppenderBuilder_->setObjectFactory(
406 interpolationBufferAppenderFactory, interpolationBufferAppenderName);
407 validPL_ = Teuchos::null;
411template<
class Scalar>
413 const RCP<
const Teuchos::AbstractFactory<ErrWtVecCalcBase<Scalar> > > &
415 const std::string &errWtVecCalcFactoryName
418 errWtVecCalcBuilder_->setObjectFactory(errWtVecCalcFactory,
419 errWtVecCalcFactoryName);
420 validPL_ = Teuchos::null;
424template<
class Scalar>
426 const RCP<
const Teuchos::AbstractFactory<InterpolatorBase<Scalar> > > &
428 const std::string &interpolatorFactoryName
431 interpolatorBuilder_->setObjectFactory(interpolatorFactory,
432 interpolatorFactoryName);
433 validPL_ = Teuchos::null;
437template<
class Scalar>
439 const RCP<Thyra::LinearOpWithSolveFactoryBase<Scalar> > &wFactoryObject
442 TEUCHOS_ASSERT( !is_null(wFactoryObject) );
443 wFactoryObject_ = wFactoryObject;
447template<
class Scalar>
449 RCP<Teuchos::ParameterList>
const& paramList
452 TEUCHOS_TEST_FOR_EXCEPT(is_null(paramList));
453 paramList->validateParameters(*this->getValidParameters());
454 paramList_ = paramList;
458template<
class Scalar>
459RCP<const Teuchos::ParameterList>
462 if (is_null(validPL_)) {
463 RCP<ParameterList> pl = Teuchos::parameterList();
466 ParameterList& integratorSettingsPL =
467 pl->sublist(integratorSettings_name,
false,integratorSettings_docs);
470 integratorSettingsPL.set(initialTime_name,
471 Teuchos::as<Scalar>(initialTime_default),
474 integratorSettingsPL.set(finalTimeRythmos_name,
475 Teuchos::as<Scalar>(finalTimeRythmos_default),
476 finalTimeRythmos_docs);
478 integratorSettingsPL.set(landOnFinalTime_name,landOnFinalTime_default,
479 landOnFinalTime_docs);
481 ParameterList& integratorSelectionPL =
482 integratorSettingsPL.sublist(integratorSelection_name,
false,
483 integratorSelection_docs)
484 .disableRecursiveValidation();
486 integratorSelectionPL.sublist(defaultIntegrator_name,
false,
487 defaultIntegrator_docs)
488 .disableRecursiveValidation();
489 integratorSelectionPL
490 .setParameters(*(integratorBuilder_->getValidParameters()));
494 ParameterList& integrationControlSelectionPL =
495 pl->sublist(integrationControlSelection_name,
false,
496 integrationControlSelection_docs)
497 .disableRecursiveValidation();
499 integrationControlSelectionPL.sublist(simpleIntegrationControl_name,
false,
500 simpleIntegrationControl_docs)
501 .disableRecursiveValidation();
503 integrationControlSelectionPL.sublist(rampingIntegrationControl_name,
505 rampingIntegrationControl_docs)
506 .disableRecursiveValidation();
507 integrationControlSelectionPL
508 .setParameters(*(integrationControlBuilder_->getValidParameters()));
511 ParameterList& stepperSettingsPL = pl->sublist(stepperSettings_name,
false,
512 stepperSettings_docs);
515 ParameterList& stepperSelectionPL =
516 stepperSettingsPL.sublist(stepperSelection_name,
false,
517 stepperSelection_docs)
518 .disableRecursiveValidation();
520 stepperSelectionPL.sublist(ForwardEulerStepper_name,
false,
521 ForwardEulerStepper_docs)
522 .disableRecursiveValidation();
524 stepperSelectionPL.sublist(BackwardEulerStepper_name,
false,
525 BackwardEulerStepper_docs)
526 .disableRecursiveValidation();
528 stepperSelectionPL.sublist(ImplicitBDFStepper_name,
false,
529 ImplicitBDFStepper_docs)
530 .disableRecursiveValidation();
532 stepperSelectionPL.sublist(ExplicitRKStepper_name,
false,
533 ExplicitRKStepper_docs)
534 .disableRecursiveValidation();
536 stepperSelectionPL.sublist(ImplicitRKStepper_name,
false,
537 ImplicitRKStepper_docs)
538 .disableRecursiveValidation();
540 .setParameters(*(stepperBuilder_->getValidParameters()));
542 ParameterList& stepControlSettingsPL =
543 stepperSettingsPL.sublist(stepControlSettings_name,
false,
544 stepControlSettings_docs);
547 ParameterList& stepControlSelectionPL =
548 stepControlSettingsPL.sublist(stepControlSelection_name,
false,
549 stepControlSelection_docs)
550 .disableRecursiveValidation();
552 stepControlSelectionPL.sublist(fixedStepControl_name,
false,
553 fixedStepControl_docs)
554 .disableRecursiveValidation();
556 stepControlSelectionPL.sublist(simpleStepControl_name,
false,
557 simpleStepControl_docs)
558 .disableRecursiveValidation();
560 stepControlSelectionPL.sublist(firstOrderErrorStepControl_name,
false,
561 firstOrderErrorStepControl_docs)
562 .disableRecursiveValidation();
564 stepControlSelectionPL.sublist(implicitBDFStepControl_name,
false,
565 implicitBDFStepControl_docs)
566 .disableRecursiveValidation();
568 stepControlSelectionPL.sublist(implicitBDFRampingStepControl_name,
570 implicitBDFRampingStepControl_docs)
571 .disableRecursiveValidation();
572 stepControlSelectionPL
573 .setParameters(*(stepControlBuilder_->getValidParameters()));
576 ParameterList& errWtVecSelectionPL =
577 stepControlSettingsPL.sublist(errWtVecSelection_name,
false,
578 errWtVecSelection_docs)
579 .disableRecursiveValidation();
581 errWtVecSelectionPL.sublist(implicitBDFStepperErrWtVecCalc_name,
583 implicitBDFStepperErrWtVecCalc_docs)
584 .disableRecursiveValidation();
586 .setParameters(*(errWtVecCalcBuilder_->getValidParameters()));
589 ParameterList& interpolatorSelectionPL =
590 stepperSettingsPL.sublist(interpolatorSelection_name,
false,
591 stepperInterpolatorSelection_docs)
592 .disableRecursiveValidation();
594 interpolatorSelectionPL.sublist(linearInterpolator_name,
false,
595 linearInterpolator_docs)
596 .disableRecursiveValidation();
598 interpolatorSelectionPL.sublist(hermiteInterpolator_name,
false,
599 hermiteInterpolator_docs)
600 .disableRecursiveValidation();
602 interpolatorSelectionPL.sublist(cubicSplineInterpolator_name,
false,
603 cubicSplineInterpolator_docs)
604 .disableRecursiveValidation();
605 interpolatorSelectionPL
606 .setParameters(*(interpolatorBuilder_->getValidParameters()));
609 ParameterList& rkbtSelectionPL =
610 stepperSettingsPL.sublist(rkButcherTableauSelection_name,
false,
611 rkButcherTableauSelection_docs)
612 .disableRecursiveValidation();
613 rkbtSelectionPL.setParameters(*(rkbtBuilder_->getValidParameters()));
618 ParameterList& interpolationBufferSettingsPL =
619 pl->sublist(interpolationBufferSettings_name,
false,
620 interpolationBufferSettings_docs);
623 ParameterList& interpolationBufferSelectionPL =
624 interpolationBufferSettingsPL.sublist(interpolationBufferSelection_name,
626 interpolationBufferSelection_docs)
627 .disableRecursiveValidation();
629 interpolationBufferSelectionPL
630 .sublist(defaultInterpolationBuffer_name,
false,
631 defaultInterpolationBuffer_docs)
632 .disableRecursiveValidation();
633 interpolationBufferSelectionPL
634 .setParameters(*(interpolationBufferBuilder_->getValidParameters()));
636 ParameterList& interpolationBufferAppenderSelectionPL =
637 interpolationBufferSettingsPL
638 .sublist(interpolationBufferAppenderSelection_name,
false,
639 interpolationBufferAppenderSelection_docs)
640 .disableRecursiveValidation();
642 interpolationBufferAppenderSelectionPL
643 .sublist(pointwiseInterpolationBufferAppender_name,
false,
644 pointwiseInterpolationBufferAppender_docs)
645 .disableRecursiveValidation();
646 interpolationBufferAppenderSelectionPL
647 .setParameters(*(interpolationBufferAppenderBuilder_->getValidParameters()));
649 ParameterList& interpolatorSelectionPL =
650 interpolationBufferSettingsPL.sublist(interpolatorSelection_name,
false,
651 interpolatorSelection_docs)
652 .disableRecursiveValidation();
654 interpolatorSelectionPL.sublist(linearInterpolator_name,
false,
655 linearInterpolator_docs)
656 .disableRecursiveValidation();
658 interpolatorSelectionPL.sublist(hermiteInterpolator_name,
false,
659 hermiteInterpolator_docs)
660 .disableRecursiveValidation();
662 interpolatorSelectionPL.sublist(cubicSplineInterpolator_name,
false,
663 cubicSplineInterpolator_docs)
664 .disableRecursiveValidation();
665 interpolatorSelectionPL
666 .setParameters(*(interpolatorBuilder_->getValidParameters()));
677template<
class Scalar>
684template<
class Scalar>
687 RCP<ParameterList> pl = paramList_;
688 paramList_ = Teuchos::null;
693template<
class Scalar>
711template<
class Scalar>
712RCP<IntegratorBase<Scalar> >
714 const RCP<
const Thyra::ModelEvaluator<Scalar> >& model,
715 const Thyra::ModelEvaluatorBase::InArgs<Scalar>& initialCondition,
716 const RCP<Thyra::NonlinearSolverBase<Scalar> >& nlSolver
719 TEUCHOS_TEST_FOR_EXCEPTION( is_null(model), std::logic_error,
720 "Error! IntegratorBuilder::create(...) The model passed in is null!"
722 TEUCHOS_TEST_FOR_EXCEPTION( is_null(paramList_), std::logic_error,
723 "Error! IntegratorBuilder::create(...) Please set a parameter "
724 "list on this class before calling create."
726 RCP<ParameterList> integratorSettingsPL = sublist(paramList_,
727 integratorSettings_name);
730 RCP<ParameterList> integratorSelectionPL = sublist(integratorSettingsPL,
731 integratorSelection_name);
732 integratorBuilder_->setParameterList(integratorSelectionPL);
733 RCP<IntegratorBase<Scalar> > integrator = integratorBuilder_->create();
734 TEUCHOS_TEST_FOR_EXCEPTION( is_null(integrator), std::logic_error,
735 "Error! IntegratorBuilder::create(...) The integrator came back "
736 "null from the ObjectBuilder!"
740 RCP<IntegrationControlStrategyAcceptingIntegratorBase<Scalar> >
742 Teuchos::rcp_dynamic_cast<IntegrationControlStrategyAcceptingIntegratorBase<Scalar> >(integrator,
false);
743 if (!is_null(icsaIntegrator)) {
744 RCP<ParameterList> integrationControlSelectionPL =
745 sublist(paramList_,integrationControlSelection_name);
746 integrationControlBuilder_->setParameterList(integrationControlSelectionPL);
747 RCP<IntegrationControlStrategyBase<Scalar> > integrationControl =
748 integrationControlBuilder_->create();
749 if (!is_null(integrationControl)) {
750 icsaIntegrator->setIntegrationControlStrategy(integrationControl);
753 RCP<ParameterList> interpolationBufferSettingsPL =
754 sublist(paramList_,interpolationBufferSettings_name);
757 RCP<TrailingInterpolationBufferAcceptingIntegratorBase<Scalar> >
759 Teuchos::rcp_dynamic_cast<TrailingInterpolationBufferAcceptingIntegratorBase<Scalar> >(integrator,
false);
760 if (!is_null(tibaIntegrator)) {
761 RCP<ParameterList> interpolationBufferSelectionPL =
762 sublist(interpolationBufferSettingsPL,interpolationBufferSelection_name);
763 interpolationBufferBuilder_->setParameterList(interpolationBufferSelectionPL);
764 RCP<InterpolationBufferBase<Scalar> > ib =
765 interpolationBufferBuilder_->create();
768 RCP<InterpolatorAcceptingObjectBase<Scalar> > iaobIB =
769 Teuchos::rcp_dynamic_cast<InterpolatorAcceptingObjectBase<Scalar> >(ib,
false);
770 if (!is_null(iaobIB)) {
771 RCP<ParameterList> interpolatorSelectionPL =
772 sublist(interpolationBufferSettingsPL,interpolatorSelection_name);
773 interpolatorBuilder_->setParameterList(interpolatorSelectionPL);
774 RCP<InterpolatorBase<Scalar> > interpolator =
775 interpolatorBuilder_->create();
776 if (!is_null(interpolator)) {
777 iaobIB->setInterpolator(interpolator);
780 tibaIntegrator->setTrailingInterpolationBuffer(ib);
785 RCP<InterpolationBufferAppenderAcceptingIntegratorBase<Scalar> > ibaaIntegrator =
786 Teuchos::rcp_dynamic_cast<InterpolationBufferAppenderAcceptingIntegratorBase<Scalar> >(integrator,
false);
787 if (!is_null(ibaaIntegrator)) {
788 RCP<ParameterList> interpolationBufferAppenderSelectionPL =
789 sublist(interpolationBufferSettingsPL,
790 interpolationBufferAppenderSelection_name);
791 interpolationBufferAppenderBuilder_->setParameterList(interpolationBufferAppenderSelectionPL);
792 RCP<InterpolationBufferAppenderBase<Scalar> > interpolationBufferAppender =
793 interpolationBufferAppenderBuilder_->create();
794 if (!is_null(interpolationBufferAppender)) {
795 ibaaIntegrator->setInterpolationBufferAppender(interpolationBufferAppender);
798 RCP<ParameterList> stepperSettingsPL =
799 sublist(paramList_,stepperSettings_name);
802 RCP<ParameterList> stepperSelectionPL = sublist(stepperSettingsPL,
803 stepperSelection_name);
804 stepperBuilder_->setParameterList(stepperSelectionPL);
805 RCP<StepperBase<Scalar> > stepper = stepperBuilder_->create();
806 TEUCHOS_TEST_FOR_EXCEPTION( is_null(stepper), std::logic_error,
807 "Error! IntegratorBuilder::create(...) The stepper came back "
808 "null from the StepperBuilder!");
811 RCP<ParameterList> stepControlSettingsPL =
812 sublist(stepperSettingsPL,stepControlSettings_name);
813 RCP<StepControlStrategyAcceptingStepperBase<Scalar> > scsaStepper =
814 Teuchos::rcp_dynamic_cast<StepControlStrategyAcceptingStepperBase<Scalar> >(stepper,
false);
815 if (!is_null(scsaStepper)) {
816 RCP<ParameterList> stepControlSelectionPL =
817 sublist(stepControlSettingsPL,stepControlSelection_name);
818 stepControlBuilder_->setParameterList(stepControlSelectionPL);
819 RCP<StepControlStrategyBase<Scalar> > stepControl =
820 stepControlBuilder_->create();
821 if (!is_null(stepControl)) {
823 RCP<ErrWtVecCalcAcceptingStepControlStrategyBase<Scalar> >
825 Teuchos::rcp_dynamic_cast<ErrWtVecCalcAcceptingStepControlStrategyBase<Scalar> >(stepControl,
false);
826 if (!is_null(ewvcaStepControl)) {
827 RCP<ParameterList> errWtVecSelectionPL =
828 sublist(stepControlSettingsPL,errWtVecSelection_name);
829 errWtVecCalcBuilder_->setParameterList(errWtVecSelectionPL);
830 RCP<ErrWtVecCalcBase<Scalar> > errWtVecCalc =
831 errWtVecCalcBuilder_->create();
832 if (!is_null(errWtVecCalc)) {
833 ewvcaStepControl->setErrWtVecCalc(errWtVecCalc);
836 scsaStepper->setStepControlStrategy(stepControl);
841 RCP<InterpolatorAcceptingObjectBase<Scalar> > iaobStepper =
842 Teuchos::rcp_dynamic_cast<InterpolatorAcceptingObjectBase<Scalar> >(stepper,
844 if (!is_null(iaobStepper)) {
845 RCP<ParameterList> interpolatorSelectionPL =
846 sublist(stepperSettingsPL,interpolatorSelection_name);
847 interpolatorBuilder_->setParameterList(interpolatorSelectionPL);
848 RCP<InterpolatorBase<Scalar> > interpolator =
849 interpolatorBuilder_->create();
850 if (!is_null(interpolator)) {
851 iaobStepper->setInterpolator(interpolator);
856 RCP<RKButcherTableauAcceptingStepperBase<Scalar> > rkbtaStepper =
857 Teuchos::rcp_dynamic_cast<RKButcherTableauAcceptingStepperBase<Scalar> >(stepper,
false);
858 if (!is_null(rkbtaStepper)) {
859 RCP<ParameterList> rkButcherTableauSelectionPL =
860 sublist(stepperSettingsPL,rkButcherTableauSelection_name);
861 rkbtBuilder_->setParameterList(rkButcherTableauSelectionPL);
862 RCP<RKButcherTableauBase<Scalar> > rkbt = rkbtBuilder_->create();
863 TEUCHOS_TEST_FOR_EXCEPTION( is_null(rkbt), std::logic_error,
864 "Error! IntegratorBuilder::create(...) The Stepper accepts a "
865 "RK Butcher Tableau, but none were specified!"
867 rkbtaStepper->setRKButcherTableau(rkbt);
871 RCP<ImplicitRKStepper<Scalar> > irkStepper =
872 Teuchos::rcp_dynamic_cast<ImplicitRKStepper<Scalar> >(stepper,
false);
873 if (!is_null(irkStepper)) {
874 if (!is_null(wFactoryObject_)) {
875 irkStepper->set_W_factory(wFactoryObject_);
881 stepper->setModel(model);
883 stepper->setInitialCondition(initialCondition);
885 RCP<SolverAcceptingStepperBase<Scalar> > saStepper =
886 Teuchos::rcp_dynamic_cast<SolverAcceptingStepperBase<Scalar> >(stepper,
888 if(!is_null(saStepper)) {
889 TEUCHOS_TEST_FOR_EXCEPTION( is_null(nlSolver), std::logic_error,
890 "Error! IntegratorBuilder::create(...) The nonlinear solver passed "
891 "in is null and the stepper is implicit!"
893 saStepper->setSolver(nlSolver);
895 Scalar finalTimeRythmos = integratorSettingsPL->get<Scalar>(
896 finalTimeRythmos_name, Teuchos::as<Scalar>(finalTimeRythmos_default));
897 bool landOnFinalTime = integratorSettingsPL->get<
bool>(
898 landOnFinalTime_name, landOnFinalTime_default);
899 integrator->setStepper(stepper,finalTimeRythmos,landOnFinalTime);
903template<
class Scalar>
907 using Teuchos::abstractFactoryStd;
910 integratorBuilder_ = Teuchos::objectBuilder<IntegratorBase<Scalar> >();
911 integratorBuilder_->setObjectName(integratorBuilder_name);
912 integratorBuilder_->setObjectTypeName(integratorBuilderType_name);
913 integratorBuilder_->setObjectFactory(
914 abstractFactoryStd< IntegratorBase<Scalar>, DefaultIntegrator<Scalar> >(),
915 defaultIntegrator_name);
918 integrationControlBuilder_ =
919 Teuchos::objectBuilder<IntegrationControlStrategyBase<Scalar> >();
920 integrationControlBuilder_->setObjectName(integrationControlBuilder_name);
921 integrationControlBuilder_->setObjectTypeName(integrationControlBuilderType_name);
922 integrationControlBuilder_->setObjectFactory(
923 abstractFactoryStd< IntegrationControlStrategyBase<Scalar>,
924 SimpleIntegrationControlStrategy<Scalar> >(),
925 simpleIntegrationControl_name);
926 integrationControlBuilder_->setObjectFactory(
927 abstractFactoryStd< IntegrationControlStrategyBase<Scalar>,
928 RampingIntegrationControlStrategy<Scalar> >(),
929 rampingIntegrationControl_name);
930 integrationControlBuilder_->setDefaultObject(
"None");
933 stepperBuilder_ = stepperBuilder<Scalar>();
936 rkbtBuilder_ = rKButcherTableauBuilder<Scalar>();
939 stepControlBuilder_ =
940 Teuchos::objectBuilder<StepControlStrategyBase<Scalar> >();
941 stepControlBuilder_->setObjectName(stepControlBuilder_name);
942 stepControlBuilder_->setObjectTypeName(stepControlBuilderType_name);
943 stepControlBuilder_->setObjectFactory(
944 abstractFactoryStd< StepControlStrategyBase<Scalar>,
945 FixedStepControlStrategy<Scalar> >(),
946 fixedStepControl_name);
947 stepControlBuilder_->setObjectFactory(
948 abstractFactoryStd< StepControlStrategyBase<Scalar>,
949 SimpleStepControlStrategy<Scalar> >(),
950 simpleStepControl_name);
951 stepControlBuilder_->setObjectFactory(
952 abstractFactoryStd< StepControlStrategyBase<Scalar>,
953 FirstOrderErrorStepControlStrategy<Scalar> >(),
954 firstOrderErrorStepControl_name);
955 stepControlBuilder_->setObjectFactory(
956 abstractFactoryStd< StepControlStrategyBase<Scalar>,
957 ImplicitBDFStepperStepControl<Scalar> >(),
958 implicitBDFStepControl_name);
959 stepControlBuilder_->setObjectFactory(
960 abstractFactoryStd< StepControlStrategyBase<Scalar>,
961 ImplicitBDFStepperRampingStepControl<Scalar> >(),
962 implicitBDFRampingStepControl_name);
963 stepControlBuilder_->setDefaultObject(
"None");
966 interpolationBufferBuilder_ =
967 Teuchos::objectBuilder<InterpolationBufferBase<Scalar> >();
968 interpolationBufferBuilder_->setObjectName(interpolationBufferBuilder_name);
969 interpolationBufferBuilder_->setObjectTypeName(
970 interpolationBufferBuilderType_name);
971 interpolationBufferBuilder_->setObjectFactory(
972 abstractFactoryStd< InterpolationBufferBase<Scalar>,
973 InterpolationBuffer<Scalar> >(),
974 defaultInterpolationBuffer_name);
975 interpolationBufferBuilder_->setDefaultObject(
"None");
978 interpolationBufferAppenderBuilder_ =
979 Teuchos::objectBuilder<InterpolationBufferAppenderBase<Scalar> >();
980 interpolationBufferAppenderBuilder_->setObjectName(
981 interpolationBufferAppenderBuilder_name);
982 interpolationBufferAppenderBuilder_->setObjectTypeName(
983 interpolationBufferAppenderBuilderType_name);
988 interpolationBufferAppenderBuilder_->setObjectFactory(
989 abstractFactoryStd< InterpolationBufferAppenderBase<Scalar>,
990 PointwiseInterpolationBufferAppender<Scalar> >(),
991 pointwiseInterpolationBufferAppender_name
993 interpolationBufferAppenderBuilder_->setDefaultObject(
"None");
996 errWtVecCalcBuilder_ = Teuchos::objectBuilder<ErrWtVecCalcBase<Scalar> >();
997 errWtVecCalcBuilder_->setObjectName(errWtVecCalcBuilder_name);
998 errWtVecCalcBuilder_->setObjectTypeName(errWtVecCalcBuilderType_name);
999 errWtVecCalcBuilder_->setObjectFactory(
1000 abstractFactoryStd< ErrWtVecCalcBase<Scalar>,
1001 ImplicitBDFStepperErrWtVecCalc<Scalar> >(),
1002 implicitBDFStepperErrWtVecCalc_name);
1003 errWtVecCalcBuilder_->setDefaultObject(
"None");
1006 interpolatorBuilder_ = Teuchos::objectBuilder<InterpolatorBase<Scalar> >();
1007 interpolatorBuilder_->setObjectName(interpolatorBuilder_name);
1008 interpolatorBuilder_->setObjectTypeName(interpolatorBuilderType_name);
1009 interpolatorBuilder_->setObjectFactory(
1010 abstractFactoryStd< InterpolatorBase<Scalar>,
1011 LinearInterpolator<Scalar> >(),
1012 linearInterpolator_name);
1013 interpolatorBuilder_->setObjectFactory(
1014 abstractFactoryStd< InterpolatorBase<Scalar>,
1015 HermiteInterpolator<Scalar> >(),
1016 hermiteInterpolator_name);
1017 interpolatorBuilder_->setObjectFactory(
1018 abstractFactoryStd< InterpolatorBase<Scalar>,
1019 CubicSplineInterpolator<Scalar> >(),
1020 cubicSplineInterpolator_name);
1021 interpolatorBuilder_->setDefaultObject(
"None");
1029template<
class Scalar>
1030Teuchos::RCP<Rythmos::IntegratorBuilder<Scalar> >
1031Rythmos::integratorBuilder()
1033 return rcp(
new IntegratorBuilder<Scalar>);
1037template<
class Scalar>
1038Teuchos::RCP<Rythmos::IntegratorBuilder<Scalar> >
1039Rythmos::integratorBuilder(
const RCP<ParameterList> ¶mList)
1041 const RCP<IntegratorBuilder<Scalar> > ib = integratorBuilder<Scalar>();
1042 ib->setParameterList(paramList);
1046template<
class Scalar>
1047Teuchos::RCP<Rythmos::IntegratorBase<Scalar> > Rythmos::createForwardSensitivityIntegrator(
1048 const RCP<
const Thyra::ModelEvaluator<Scalar> >& model,
1050 const Thyra::ModelEvaluatorBase::InArgs<Scalar>& model_ic,
1051 const RCP<Thyra::NonlinearSolverBase<Scalar> >& nlSolver,
1052 const RCP<Teuchos::ParameterList>& integratorBuilderPL
1055 RCP<IntegratorBuilder<Scalar> > ib = integratorBuilder<Scalar>(integratorBuilderPL);
1056 RCP<IntegratorBase<Scalar> > sensIntegrator = ib->create(model,model_ic,nlSolver);
1057 RCP<ForwardSensitivityStepper<Scalar> > stateAndSensStepper =
1058 forwardSensitivityStepper<Scalar>();
1059 stateAndSensStepper->initializeSyncedSteppers(
1060 model, p_index, model_ic, sensIntegrator->getNonconstStepper(), nlSolver
1062 typedef Thyra::ModelEvaluatorBase MEB;
1063 MEB::InArgs<Scalar> state_and_sens_ic =
1064 createStateAndSensInitialCondition(*stateAndSensStepper, model_ic);
1065 stateAndSensStepper->setInitialCondition(state_and_sens_ic);
1066 sensIntegrator->setStepper(stateAndSensStepper, sensIntegrator->getFwdTimeRange().upper());
1067 return sensIntegrator;
1078#define RYTHMOS_INTEGRATOR_BUILDER_INSTANT(SCALAR) \
1080 template class IntegratorBuilder< SCALAR >; \
1082 template RCP<IntegratorBuilder< SCALAR > > \
1083 integratorBuilder(); \
1085 template RCP<IntegratorBuilder< SCALAR > > \
1086 integratorBuilder(const RCP<ParameterList> ¶List); \
1088 template RCP<IntegratorBase< SCALAR > > \
1089 createForwardSensitivityIntegrator( \
1090 const RCP<const Thyra::ModelEvaluator< SCALAR > >& model, \
1091 const int& p_index, \
1092 const Thyra::ModelEvaluatorBase::InArgs< SCALAR >& model_ic, \
1093 const RCP<Thyra::NonlinearSolverBase< SCALAR > >& nlSolver, \
1094 const RCP<ParameterList>& integratorBuilderPL \
Concrete integrator builder class.