|
Rythmos - Transient Integration for Differential Equations
Version of the Day
|
00001 //@HEADER 00002 // *********************************************************************** 00003 // 00004 // Rythmos Package 00005 // Copyright (2006) Sandia Corporation 00006 // 00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00008 // license for use of this work by or on behalf of the U.S. Government. 00009 // 00010 // This library is free software; you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as 00012 // published by the Free Software Foundation; either version 2.1 of the 00013 // License, or (at your option) any later version. 00014 // 00015 // This library is distributed in the hope that it will be useful, but 00016 // WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 // Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public 00021 // License along with this library; if not, write to the Free Software 00022 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 00023 // USA 00024 // Questions? Contact Todd S. Coffey (tscoffe@sandia.gov) 00025 // 00026 // *********************************************************************** 00027 //@HEADER 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 // Private data members 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 // Private member functions 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 // 2007/08/30: rabartl: Above, note that I had to name the nonmember 00291 // constructors taking an single RCP argument different names from each other 00292 // in order to get around the classic ambiguity problem with implicit 00293 // conversions of smart pointers. 00294 00295 00296 } // namespace Rythmos 00297 00298 00299 #endif //RYTHMOS_DEFAULT_INTEGRATOR_DECL_HPP
1.7.6.1