File indexing completed on 2026-08-06 09:24:28
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef HERWIG_Interpolator_H
0010 #define HERWIG_Interpolator_H
0011
0012
0013
0014
0015 #include "ThePEG/Interface/Interfaced.h"
0016 #include <cassert>
0017
0018 namespace Herwig {
0019
0020 using namespace ThePEG;
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 template <typename ValT, typename ArgT>
0031 class Interpolator: public Interfaced {
0032
0033 public:
0034
0035
0036
0037
0038 typedef typename Ptr<Interpolator<ValT,ArgT> >::pointer Ptr;
0039
0040
0041
0042
0043
0044
0045 Interpolator() : _order(3), _copyx(5),_copyfun(5) {}
0046
0047
0048
0049
0050 Interpolator(const vector<ValT> & f,
0051 const vector<ArgT> & x,
0052 unsigned int order)
0053 : _fun(f.size(),0.0),_xval(x.size(),0.0),_order(order),
0054 _funit(TypeTraits<ValT>::baseunit()),
0055 _xunit(TypeTraits<ArgT>::baseunit()),
0056 _copyx(order+2),_copyfun(order+2) {
0057 assert(_order>0);
0058 assert(x.size() == f.size());
0059 for (size_t i = 0; i < f.size(); ++i) {
0060 _fun [i] = f[i] / _funit;
0061 _xval[i] = x[i] / _xunit;
0062 }
0063 }
0064
0065
0066
0067
0068 template <size_t N>
0069 Interpolator(const array<ValT,N> & f,
0070 const array<ArgT,N> & x,
0071 unsigned int order)
0072 : _fun(N,0.0),_xval(N,0.0),_order(order),
0073 _funit(TypeTraits<ValT>::baseunit()),
0074 _xunit(TypeTraits<ArgT>::baseunit()),
0075 _copyx(order+2),_copyfun(order+2) {
0076 assert(_order>0);
0077 for (size_t i = 0; i < N; ++i) {
0078 _fun [i] = f[i] / _funit;
0079 _xval[i] = x[i] / _xunit;
0080 }
0081 }
0082
0083
0084
0085
0086
0087 Interpolator(size_t size,
0088 const double f[], ValT funit,
0089 const double x[], ArgT xunit,
0090 unsigned int order)
0091 : _fun(size,0.0),_xval(size,0.0),_order(order),
0092 _funit(funit),_xunit(xunit), _copyx(order+2),_copyfun(order+2) {
0093 assert(_order>0);
0094 for (size_t i = 0; i < size; ++i) {
0095 _fun [i] = f[i];
0096 _xval[i] = x[i];
0097 }
0098 }
0099
0100
0101
0102
0103
0104 ValT operator () (ArgT) const;
0105
0106 typedef ValT ValType;
0107
0108 typedef ArgT ArgType;
0109
0110 public:
0111
0112
0113
0114
0115
0116
0117
0118 void persistentOutput(PersistentOStream & os) const;
0119
0120
0121
0122
0123
0124
0125 void persistentInput(PersistentIStream & is, int version);
0126
0127
0128
0129
0130
0131
0132
0133
0134 static void Init();
0135
0136 protected:
0137
0138
0139
0140
0141
0142
0143
0144 virtual IBPtr clone() const { return new_ptr(*this); }
0145
0146
0147
0148
0149
0150 virtual IBPtr fullclone() const { return new_ptr(*this); }
0151
0152
0153 private:
0154
0155
0156
0157
0158
0159 Interpolator & operator=(const Interpolator &) = delete;
0160
0161 private:
0162
0163
0164
0165
0166 vector<double> _fun;
0167
0168
0169
0170
0171 vector<double> _xval;
0172
0173
0174
0175
0176 unsigned int _order;
0177
0178
0179
0180
0181 ValT _funit;
0182
0183
0184
0185
0186 ArgT _xunit;
0187
0188
0189
0190
0191 mutable vector<double> _copyx;
0192
0193
0194
0195
0196 mutable vector<double> _copyfun;
0197
0198 };
0199
0200
0201
0202
0203
0204 template <typename ValT, typename ArgT>
0205 inline typename Interpolator<ValT,ArgT>::Ptr
0206 make_InterpolatorPtr(size_t size,
0207 const double f[], ValT funit,
0208 const double x[], ArgT xunit,
0209 unsigned int order)
0210 {
0211 return new_ptr(Interpolator<ValT,ArgT>(size,
0212 f,funit,
0213 x,xunit,
0214 order));
0215 }
0216
0217
0218
0219
0220
0221 template <typename ValT, typename ArgT>
0222 inline typename Interpolator<ValT,ArgT>::Ptr
0223 make_InterpolatorPtr(const typename std::vector<ValT> & f,
0224 const typename std::vector<ArgT> & x,
0225 unsigned int order)
0226 {
0227 return new_ptr(Interpolator<ValT,ArgT>(f,x,order));
0228 }
0229
0230
0231
0232
0233
0234 template <typename ValT, typename ArgT, size_t N>
0235 inline typename Interpolator<ValT,ArgT>::Ptr
0236 make_InterpolatorPtr(const typename std::array<ValT,N> & f,
0237 const typename std::array<ArgT,N> & x,
0238 unsigned int order)
0239 {
0240 return new_ptr(Interpolator<ValT,ArgT>(f,x,order));
0241 }
0242
0243 }
0244
0245 #ifndef ThePEG_TEMPLATES_IN_CC_FILE
0246 #include "Interpolator.tcc"
0247 #endif
0248
0249 #endif