46 const EGS_Float *values) : n(0), own_data(true) {
51 EGS_InterpolatorFuncion func,
void *data) : n(0), own_data(true) {
56 EGS_Float *a, EGS_Float *b) : n(0), own_data(true) {
61 EGS_InterpolatorFuncion func,
void *data,
62 int nmax, EGS_Float accu) : n(0), own_data(true) {
66 void EGS_Interpolator::clear() {
67 if (n > 0 && own_data) {
78 void EGS_Interpolator::check(
int nbin, EGS_Float Xmin, EGS_Float Xmax) {
79 if (nbin < 2)
egsFatal(
"EGS_Interpolator::initialize: \n"
80 " attempt to initialize the interpolator with %d bins\n",nbin);
81 if (Xmin >= Xmax)
egsFatal(
"EGS_Interpolator::initialize: \n"
82 " Xmin must be > Xmax, I got Xmin=%g Xmax=%g\n",Xmin,Xmax);
86 const EGS_Float *values) {
87 check(nbin,Xmin,Xmax);
91 a =
new EGS_Float [nbin], b =
new EGS_Float [nbin];
96 EGS_Float dx = (xmax-xmin)/n;
99 for (
int j=0; j<n; j++) {
100 b[j] = (values[j+1]-values[j])*bx;
101 a[j] = values[j] - b[j]*(xmin + dx*j);
113 EGS_InterpolatorFuncion func,
void *data) {
114 EGS_Float *aux =
new EGS_Float [nbin];
115 EGS_Float dx = (Xmax - Xmin)/(nbin-1);
116 for (
int j=0; j<nbin; j++) {
117 aux[j] = func(Xmin + dx*j, data);
124 EGS_Float *A, EGS_Float *B) {
125 check(nbin,Xmin,Xmax);
131 EGS_Float dx = (xmax-xmin)/n;
136 fmin = a[0] + b[0]*xmin;
137 fmax = a[n-1]+b[n-1]*xmax;
141 EGS_InterpolatorFuncion func,
void *data,
142 int nmax, EGS_Float accu) {
143 check(nmax,Xmin,Xmax);
150 EGS_Float *tmp =
new EGS_Float [nnow];
152 EGS_Float ddx = (Xmax-Xmin)/(nnow-1);
153 for (j=0; j<nnow; j++) {
154 tmp[j] = func(Xmin + ddx*j, data);
156 for (EGS_I64 loopCount=0; loopCount<=
loopMax; ++loopCount) {
158 egsFatal(
"EGS_Interpolator::initialize: Too many iterations were required! Input may be invalid, or consider increasing loopMax.");
161 EGS_Float *tmp1 =
new EGS_Float [nnow-1];
162 for (j=0; j<nnow-1; j++) {
163 tmp1[j] = func(Xmin + ddx*(0.5+j),data);
166 for (j=0; j<nnow-1; j++) {
167 EGS_Float fint = 0.5*(tmp[j] + tmp[j+1]);
168 EGS_Float err = fabs(fint/tmp1[j]-1);
180 if (2*nnow-1 > nmax) {
185 EGS_Float *aux =
new EGS_Float [2*nnow-1];
188 for (j=1; j<nnow; j++) {
189 aux[i++] = tmp1[j-1];
196 ddx = (Xmax-Xmin)/(nnow-1);
void initialize(int nbin, EGS_Float Xmin, EGS_Float Xmax, const EGS_Float *values)
Initialize the interpolator.
EGS_Interpolator()
Create an empty (unitialized) interpolator.
~EGS_Interpolator()
Destructor.
Global egspp functions header file.
EGS_Interpolator class header file.
EGS_InfoFunction EGS_EXPORT egsFatal
Always use this function for reporting fatal errors.
const EGS_I64 loopMax
The maximum number of iterations for near-infinite loops.