/usr/include/CLHEP/GenericFunctions/AdaptiveRKStepper.hh is in libclhep-dev 2.1.4.1+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | #ifndef _AdaptiveRKStepper_h_
#define _AdaptiveRKStepper_h_
#include "CLHEP/GenericFunctions/RKIntegrator.hh"
//
// This is the default RKStepper routine, used within the RKIntegrator
// when no other stepper is provided.
//
namespace Genfun {
class AdaptiveRKStepper:public RKIntegrator::RKStepper {
public:
class EEStepper;
// Constructor. A default stepper is created if none
// is specified--it is an Embedded Runge Kutta stepper
// using a Cash-Karp extended Butcher Tableau, which
// is fourth-order.
AdaptiveRKStepper(const EEStepper *eeStepper=NULL);
// Copy constructor:
AdaptiveRKStepper(const AdaptiveRKStepper & right);
// Destructor:
virtual ~AdaptiveRKStepper();
// Takes *multiple* steps if needed up to or exceeding the
// specified time. This called from the RKFunction and not
// by users. If a time limit is specified, only one step
// is taken--this mode is used to interpolate between cached
// meshpoints.
// Input: data contains diffEqn information and cache:
// sData a summary of starting point information
// timeLimit (if nonzero) time limit for step
// Output dData a summary of into at the ending point.
//
virtual void step (const RKIntegrator::RKData * data,
const RKIntegrator::RKData::Data & sdata,
RKIntegrator::RKData::Data & ddata,
double timeLimit) const ;
// Clone
virtual AdaptiveRKStepper *clone() const;
// Accessors and modifiers to algorithmic parameters. Roughly
// speaking these are ordered according to importance: the user
// will often wish to modify the tolerance and the starting
// stepsize, but rarely should need to touch any of the others.
// The tolerance:
double & tolerance();
const double & tolerance() const;
// The starting stepsize:
double & startingStepsize();
const double & startingStepsize() const;
// The safety factor. Step size increases are moderated by this
// factor:
double & safetyFactor();
const double & safetyFactor() const;
// The minimum amount by which a step size is decreased:
double & rmin();
const double & rmin() const;
// The maximum amount by which a step size is increased:
double & rmax();
const double & rmax() const;
private:
// It is illegal to assign an AdaptiveRKStepper:
AdaptiveRKStepper & operator=(const AdaptiveRKStepper & right);
const EEStepper *eeStepper;
double T;
double sStepsize;
double S;
double Rmin;
double Rmax;
mutable double stepsize;
};
//
// An abstract base class for steppers that return an error
// estimate at each step:
//
class AdaptiveRKStepper::EEStepper {
public:
virtual ~EEStepper();
virtual void step (const RKIntegrator::RKData * data,
const RKIntegrator::RKData::Data & sdata,
RKIntegrator::RKData::Data & ddata,
std::vector<double> & errors) const = 0;
virtual EEStepper *clone() const=0;
virtual unsigned int order() const=0;
};
}
#endif
|