00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef RYTHMOS_DEFAULT_INTEGRATOR_DECL_HPP
00030 #define RYTHMOS_DEFAULT_INTEGRATOR_DECL_HPP
00031
00032
00033 #include "Rythmos_IntegrationControlStrategyAcceptingIntegratorBase.hpp"
00034 #include "Rythmos_InterpolationBufferAppenderAcceptingIntegratorBase.hpp"
00035 #include "Rythmos_TrailingInterpolationBufferAcceptingIntegratorBase.hpp"
00036 #include "Rythmos_IntegrationObserverBase.hpp"
00037 #include "Rythmos_StepControlInfo.hpp"
00038 #include "Teuchos_ParameterListAcceptorDefaultBase.hpp"
00039
00040
00041
00042
00043 namespace Rythmos {
00044
00045
00049 template<class Scalar>
00050 class DefaultIntegrator
00051 : virtual public IntegrationControlStrategyAcceptingIntegratorBase<Scalar>,
00052 virtual public InterpolationBufferAppenderAcceptingIntegratorBase<Scalar>,
00053 virtual public TrailingInterpolationBufferAcceptingIntegratorBase<Scalar>,
00054 virtual public Teuchos::ParameterListAcceptorDefaultBase
00055 {
00056 public:
00057
00059 typedef typename ScalarTraits<Scalar>::magnitudeType ScalarMag;
00060
00063
00065 DefaultIntegrator();
00066
00068 void setIntegrationObserver(
00069 const RCP<IntegrationObserverBase<Scalar> > &integrationObserver
00070 );
00071
00074
00076 void setInterpolationBufferAppender(
00077 const RCP<InterpolationBufferAppenderBase<Scalar> > &interpBufferAppender
00078 );
00079
00081 RCP<const InterpolationBufferAppenderBase<Scalar> >
00082 getInterpolationBufferAppender();
00083
00085 RCP<InterpolationBufferAppenderBase<Scalar> >
00086 getNonconstInterpolationBufferAppender();
00087
00089 RCP<InterpolationBufferAppenderBase<Scalar> >
00090 unSetInterpolationBufferAppender();
00091
00093
00096
00098 void setIntegrationControlStrategy(
00099 const RCP<IntegrationControlStrategyBase<Scalar> > &integrationControlStrategy
00100 );
00101
00103 RCP<IntegrationControlStrategyBase<Scalar> >
00104 getNonconstIntegrationControlStrategy();
00105
00107 RCP<const IntegrationControlStrategyBase<Scalar> >
00108 getIntegrationControlStrategy() const;
00109
00111
00114
00116 void setParameterList(RCP<ParameterList> const& paramList);
00117
00119 RCP<const ParameterList> getValidParameters() const;
00120
00122
00125
00127 RCP<IntegratorBase<Scalar> > cloneIntegrator() const;
00128
00130 void setStepper(
00131 const RCP<StepperBase<Scalar> > &stepper,
00132 const Scalar &finalTime,
00133 const bool landOnFinalTime = true
00134 );
00135
00137 RCP<StepperBase<Scalar> > unSetStepper();
00138
00140 RCP<const StepperBase<Scalar> > getStepper() const;
00141
00143 RCP<StepperBase<Scalar> > getNonconstStepper() const;
00144
00147
00149 void setTrailingInterpolationBuffer(
00150 const RCP<InterpolationBufferBase<Scalar> > &trailingInterpBuffer
00151 );
00152
00154 RCP<InterpolationBufferBase<Scalar> >
00155 getNonconstTrailingInterpolationBuffer();
00156
00158 RCP<const InterpolationBufferBase<Scalar> >
00159 getTrailingInterpolationBuffer() const;
00160
00162 RCP<InterpolationBufferBase<Scalar> >
00163 unSetTrailingInterpolationBuffer();
00164
00166
00168 void getFwdPoints(
00169 const Array<Scalar>& time_vec,
00170 Array<RCP<const Thyra::VectorBase<Scalar> > >* x_vec,
00171 Array<RCP<const Thyra::VectorBase<Scalar> > >* xdot_vec,
00172 Array<ScalarMag>* accuracy_vec
00173 );
00174
00176 TimeRange<Scalar> getFwdTimeRange() const;
00177
00179
00182
00184 RCP<const Thyra::VectorSpaceBase<Scalar> > get_x_space() const;
00185
00187 void addPoints(
00188 const Array<Scalar>& time_vec,
00189 const Array<RCP<const Thyra::VectorBase<Scalar> > >& x_vec,
00190 const Array<RCP<const Thyra::VectorBase<Scalar> > >& xdot_vec
00191 );
00192
00194 void getPoints(
00195 const Array<Scalar>& time_vec,
00196 Array<RCP<const Thyra::VectorBase<Scalar> > >* x_vec,
00197 Array<RCP<const Thyra::VectorBase<Scalar> > >* xdot_vec,
00198 Array<ScalarMag>* accuracy_vec
00199 ) const;
00200
00202 TimeRange<Scalar> getTimeRange() const;
00203
00205 void getNodes(Array<Scalar>* time_vec) const;
00206
00208 void removeNodes(Array<Scalar>& time_vec);
00209
00211 int getOrder() const;
00212
00214
00215 private:
00216
00217
00218
00219
00220 RCP<IntegrationControlStrategyBase<Scalar> > integrationControlStrategy_;
00221 RCP<IntegrationObserverBase<Scalar> > integrationObserver_;
00222
00223 RCP<InterpolationBufferBase<Scalar> > trailingInterpBuffer_;
00224 RCP<InterpolationBufferAppenderBase<Scalar> > interpBufferAppender_;
00225
00226 RCP<StepperBase<Scalar> > stepper_;
00227 TimeRange<Scalar> integrationTimeDomain_;
00228 bool landOnFinalTime_;
00229
00230 int maxNumTimeSteps_;
00231
00232 int currTimeStepIndex_;
00233 StepControlInfo<Scalar> stepCtrlInfoLast_;
00234
00235 static const std::string maxNumTimeSteps_name_;
00236 static const int maxNumTimeSteps_default_;
00237
00238
00239
00240
00241 void finalizeSetup();
00242
00243 bool advanceStepperToTime( const Scalar& t );
00244
00245 };
00246
00247
00252 template<class Scalar>
00253 RCP<DefaultIntegrator<Scalar> >
00254 defaultIntegrator();
00255
00256
00261 template<class Scalar>
00262 RCP<DefaultIntegrator<Scalar> >
00263 defaultIntegrator(
00264 const RCP<IntegrationControlStrategyBase<Scalar> > &integrationControlStrategy,
00265 const RCP<IntegrationObserverBase<Scalar> > &integrationObserver
00266 );
00267
00268
00273 template<class Scalar>
00274 RCP<DefaultIntegrator<Scalar> >
00275 controlledDefaultIntegrator(
00276 const RCP<IntegrationControlStrategyBase<Scalar> > &integrationControlStrategy
00277 );
00278
00279
00284 template<class Scalar>
00285 RCP<DefaultIntegrator<Scalar> >
00286 observedDefaultIntegrator(
00287 const RCP<IntegrationObserverBase<Scalar> > &integrationObserver
00288 );
00289
00290
00291
00292
00293
00294
00295
00296 }
00297
00298
00299 #endif //RYTHMOS_DEFAULT_INTEGRATOR_DECL_HPP