8 return f0*(1.0 -
x) + f1*x;
14 "In ConstantStepOdeSolver::getPeakTime: index out of range");
16 "In ConstantStepOdeSolver::getPeakTime: not enough data");
19 double maxval = hbuf[0];
22 if (hbuf[
dim_*
i] > maxval)
24 maxval = hbuf[
dim_*
i];
29 if (maxind == runLen_-1
U)
31 const double l = hbuf[
dim_*(maxind - 1
U)];
32 const double r = hbuf[
dim_*(maxind + 1
U)];
33 if (l < maxval || r < maxval)
34 return dt_*(maxind + (l -
r)/2.0/(l + r - 2.0*maxval));
40 const unsigned which,
const unsigned idx)
const 43 "In ConstantStepOdeSolver::getIntegrated: index out of range");
52 "In ConstantStepOdeSolver::integrateCoordinate: not enough data");
59 integ[1] = coord[
dim_*0]*(3.0/8.0) +
60 coord[
dim_*1]*(19.0/24.0) +
61 coord[
dim_*2]*(-5.0/24.0) +
62 coord[
dim_*3]*(1.0/24.0);
63 long double sum = integ[1];
64 const unsigned rlenm1 =
runLen_ - 1
U;
65 for (
unsigned i=2;
i<rlenm1; ++
i)
67 sum += (coord[
dim_*(
i-2
U)]*(-1.0/24.0) +
68 coord[
dim_*(
i-1
U)]*(13.0/24.0) +
69 coord[
dim_*
i] *(13.0/24.0) +
70 coord[
dim_*(
i+1
U)]*(-1.0/24.0));
73 sum += (coord[
dim_*rlenm1] *(3.0/8.0) +
74 coord[
dim_*(rlenm1-1
U)]*(19.0/24.0) +
75 coord[
dim_*(rlenm1-2
U)]*(-5.0/24.0) +
76 coord[
dim_*(rlenm1-3
U)]*(1.0/24.0));
86 const bool cubic)
const 93 for (
unsigned ipt=0; ipt<
runLen_; ++ipt)
104 for (
unsigned i=0; ; ++
i)
106 const double t =
i*
dt;
119 const unsigned which,
121 const bool cubic)
const 128 for (
unsigned ipt=0; ipt<
runLen_; ++ipt)
134 for (
unsigned i=0; ; ++
i)
136 const double t =
i*
dt;
181 "In ConstantStepOdeSolver::truncateCoordinate: index out of range");
183 "In ConstantStepOdeSolver::truncateCoordinate: invalid truncation range");
188 if (buf[
dim_*
i] < minValue)
190 else if (buf[
dim_*
i] > maxValue)
196 const unsigned which,
const double t,
const bool cubic)
const 199 "In ConstantStepOdeSolver::interpolateCoordinate: index out of range");
201 "In ConstantStepOdeSolver::interpolateCoordinate: not enough data");
204 "In ConstantStepOdeSolver::interpolateCoordinate: time out of range");
213 const double tSteps = t/
dt_;
214 unsigned nLow = tSteps;
217 double x = tSteps - nLow;
232 const double*
base = arr + (which +
dim_*i0);
242 const unsigned which,
const double t,
const bool cubic)
const 245 "In ConstantStepOdeSolver::interpolateIntegrated: index out of range");
247 "In ConstantStepOdeSolver::interpolateIntegrated: not enough data");
250 "In ConstantStepOdeSolver::interpolateIntegrated: time out of range");
261 const double tSteps = t/
dt_;
262 unsigned nLow = tSteps;
265 double x = tSteps - nLow;
280 const double*
base = buf + i0;
290 const unsigned dim,
const unsigned runLen)
292 const unsigned len = dim*runLen;
296 "In ConstantStepOdeSolver::setHistory: can not run backwards in time");
298 const unsigned sz = dim*(runLen + 1
U);
306 for (
unsigned i=0;
i<len; ++
i)
308 for (
unsigned i=0;
i<dim; ++
i)
313 const unsigned lenInitialConditions,
314 const double dt,
const unsigned nSteps)
316 if (!nSteps || !lenInitialConditions)
319 "In ConstantStepOdeSolver::run: ODE right hand side has not been set");
321 "In ConstantStepOdeSolver::run: can not run backwards in time");
322 assert(initialConditions);
324 dim_ = lenInitialConditions;
331 for (
unsigned i=0;
i<lenInitialConditions; ++
i)
332 arr[
i] = initialConditions[
i];
335 for (
unsigned i = 0;
i < nSteps; ++
i, arr += lenInitialConditions)
337 const double t =
i*
dt;
338 this->
step(t, dt, arr, lenInitialConditions, stepBuffer);
339 double*
next = arr + lenInitialConditions;
340 for (
unsigned i=0;
i<lenInitialConditions; ++
i)
341 next[
i] = arr[
i] + stepBuffer[
i];
346 const double*
x,
const unsigned lenX,
347 double* coordIncrement)
const 349 rhs_->
calc(t, x, lenX, coordIncrement);
350 for (
unsigned i=0;
i<lenX; ++
i)
351 coordIncrement[
i] *= dt;
355 const double*
x,
const unsigned lenX,
356 double* coordIncrement)
const 358 const double halfstep = dt/2.0;
359 if (buf_.size() < lenX)
361 double* midpoint = &buf_[0];
363 for (
unsigned i=0;
i<lenX; ++
i)
365 midpoint[
i] *= halfstep;
368 rhs_->
calc(t + halfstep, midpoint, lenX, coordIncrement);
369 for (
unsigned i=0;
i<lenX; ++
i)
370 coordIncrement[
i] *= dt;
374 const double*
x,
const unsigned lenX,
375 double* coordIncrement)
const 377 const double halfstep = dt/2.0;
378 if (buf_.size() < 4*lenX)
380 double* k1x = &buf_[0];
381 double* k2x = k1x + lenX;
382 double* k3x = k2x + lenX;
383 double* k4x = k3x + lenX;
385 for (
unsigned i=0;
i<lenX; ++
i)
386 coordIncrement[
i] = x[
i] + halfstep*k1x[
i];
387 rhs_->
calc(t + halfstep, coordIncrement, lenX, k2x);
388 for (
unsigned i=0;
i<lenX; ++
i)
389 coordIncrement[
i] = x[
i] + halfstep*k2x[
i];
390 rhs_->
calc(t + halfstep, coordIncrement, lenX, k3x);
391 for (
unsigned i=0;
i<lenX; ++
i)
392 coordIncrement[
i] = x[
i] + dt*k3x[
i];
393 rhs_->
calc(t + dt, coordIncrement, lenX, k4x);
394 for (
unsigned i=0;
i<lenX; ++
i)
395 coordIncrement[
i] = dt/6.0*(k1x[
i] + 2.0*(k2x[
i] + k3x[
i]) + k4x[i]);
static double interpolateLinear(const double x, const double f0, const double f1)
double getCoordinate(const unsigned which, const unsigned idx) const
double interpolateIntegrated(unsigned which, double t, bool cubic=false) const
double getTime(const unsigned idx) const
std::vector< double > chargeBuffer_
virtual AbsODERHS * clone() const =0
double getPeakTime(unsigned which) const
void step(double t, double dt, const double *x, unsigned lenX, double *coordIncrement) const
T x() const
Cartesian x coordinate.
double getIntegrated(unsigned which, unsigned idx) const
void writeIntegrated(std::ostream &os, unsigned which, double dt, bool cubic=false) const
base
Make Sure CMSSW is Setup ##.
void integrateCoordinate(const unsigned which)
virtual void calc(double t, const double *x, unsigned lenX, double *derivative)=0
static const double tmax[3]
ConstantStepOdeSolver & operator=(const ConstantStepOdeSolver &r)
double interpolateCoordinate(unsigned which, double t, bool cubic=false) const
std::vector< double > historyBuffer_
void step(double t, double dt, const double *x, unsigned lenX, double *coordIncrement) const
void step(double t, double dt, const double *x, unsigned lenX, double *coordIncrement) const
void run(const double *initialConditions, unsigned lenConditions, double dt, unsigned nSteps)
char data[epos_bytes_allocation]
void truncateCoordinate(unsigned which, double minValue, double maxValue)
virtual const char * methodName() const =0
void writeHistory(std::ostream &os, double dt, bool cubic=false) const
void setHistory(double dt, const double *data, unsigned dim, unsigned runLen)
virtual void step(double t, double dt, const double *x, unsigned lenX, double *coordIncrement) const =0