Changeset 3098 in Sophya for trunk/SophyaLib/NTools


Ignore:
Timestamp:
Nov 2, 2006, 3:32:37 PM (19 years ago)
Author:
ansari
Message:

correction bug lie au delete de ClassFunc ds Integrator / petite amelioration interface Integrator - Reza 02/11/2006

Location:
trunk/SophyaLib/NTools
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/NTools/classfunc.h

    r2283 r3098  
    1010namespace SOPHYA {
    1111
    12 //abstract class-function
     12//! Abstract interface definition for functions (double f(double)) viewed as classes
    1313class ClassFunc {
    1414public:
    15   virtual double operator()(double x)=0;
     15  virtual double operator()(double x) const =0;
    1616};
    1717
     
    2222 public:
    2323  Function(double (*g)(double)):f(g){}
    24   inline  double operator()(double x){ return f(x);}
     24  virtual  double operator()(double x) const { return f(x);}
    2525};
    2626
  • trunk/SophyaLib/NTools/integ.cc

    r2808 r3098  
    1717
    1818  On fournit une fonction double f(double) au constructeur, ou
     19  une classe-fonction (ClassFuc) ou
    1920  une GeneralFunction avec des paramètres définis.
    2021  L'objet Integrator est convertible en valeur double qui est la valeur
     
    2829//!  Constructeur par défaut. L'objet n'est pas utilisable en l'état.
    2930Integrator::Integrator()
    30 : mFunc(NULL), mGFF(NULL), mGFFParm(NULL),
     31: mFunc(NULL), mClFun(NULL), mGFF(NULL), mGFFParm(NULL),
    3132  mNStep(50), mDX(-1), mReqPrec(-1),
    3233  mXMin(0), mXMax(1)
     34{}
     35
     36//! Constructeur à partir d'une classe-fonction, et des bornes d'intégration.
     37Integrator::Integrator(ClassFunc const & f, double xmin, double xmax)
     38: mFunc(NULL), mClFun(&f), mGFF(NULL), mGFFParm(NULL),
     39  mNStep(50), mDX(-1), mReqPrec(-1),
     40  mXMin(xmin), mXMax(xmax)
    3341{}
    3442
    3543//! Constructeur à partir de la fonction double->double, et des bornes d'intégration.
    3644Integrator::Integrator(FUNC f, double xmin, double xmax)
    37 : mFunc(f), mGFF(NULL), mGFFParm(NULL),
     45: mFunc(f), mClFun(NULL), mGFF(NULL), mGFFParm(NULL),
    3846  mNStep(50), mDX(-1), mReqPrec(-1),
    3947  mXMin(xmin), mXMax(xmax)
    4048{}
    4149
    42 //! Constructeur à partir de la fonction double->double, et des bornes d'intégration.
    43 Integrator::Integrator(fun f, double xmin, double xmax)
    44 : mFunc(new Function(f)), mGFF(NULL), mGFFParm(NULL),
    45   mNStep(50), mDX(-1), mReqPrec(-1),
    46   mXMin(xmin), mXMax(xmax)
    47 {}
    48 
     50
     51/*!
     52  Constructeur a partir d'une classe-fonction
     53  sans spécifier les bornes. Elles sont positionnées
     54  à [0,1], et on pourra les modifier plus tard.
     55*/
     56Integrator::Integrator(ClassFunc const & f)
     57: mFunc(NULL), mClFun(&f), mGFF(NULL), mGFFParm(NULL),
     58  mNStep(50), mDX(-1), mReqPrec(-1),
     59  mXMin(0), mXMax(1)
     60{}
    4961
    5062/*!
     
    5365*/
    5466Integrator::Integrator(FUNC f)
    55 : mFunc(f), mGFF(NULL), mGFFParm(NULL),
    56   mNStep(50), mDX(-1), mReqPrec(-1),
    57   mXMin(0), mXMax(1)
    58 {}
    59 
    60 /*!
    61   Constructeur sans spécifier les bornes. Elles sont positionnées
    62   à [0,1], et on pourra les modifier plus tard.
    63 */
    64 Integrator::Integrator(fun f)
    65 : mFunc(new Function(f)), mGFF(NULL), mGFFParm(NULL),
     67: mFunc(f), mClFun(NULL), mGFF(NULL), mGFFParm(NULL),
    6668  mNStep(50), mDX(-1), mReqPrec(-1),
    6769  mXMin(0), mXMax(1)
     
    7476*/
    7577Integrator::Integrator(GeneralFunction* gff, double* par, double xmin, double xmax)
    76 : mFunc(NULL), mGFF(gff), mGFFParm(par),
     78: mFunc(NULL), mClFun(NULL), mGFF(gff), mGFFParm(par),
    7779  mNStep(50), mDX(-1), mReqPrec(-1),
    7880  mXMin(xmin), mXMax(xmax)
     
    8890*/
    8991Integrator::Integrator(GeneralFunction* gff, double* par)
    90 : mFunc(NULL), mGFF(gff), mGFFParm(par),
     92: mFunc(NULL), mClFun(NULL), mGFF(gff), mGFFParm(par),
    9193  mNStep(50), mDX(-1), mReqPrec(-1),
    9294  mXMin(0), mXMax(1)
     
    9698
    9799Integrator::~Integrator()
    98 {if(mFunc) delete mFunc;}
     100{
     101}
     102
    99103
    100104/*!
     
    121125{
    122126  mDX = d;
    123   mNStep = mReqPrec = -1;
     127  mNStep = -1;
     128  mReqPrec = -1.;
    124129  StepsChanged();
    125130  return *this;
     
    154159//! Spécifie la fonction à intégrer, sous forme double f(double).
    155160Integrator&
    156 Integrator::Func(FUNC f)
    157 {
    158   mFunc = f;
     161Integrator::SetFunc(ClassFunc const & f)
     162{
     163  mFunc = NULL;
     164  mClFun = &f;
    159165  mGFFParm = NULL;
    160166  mFunc = NULL;
     
    163169}
    164170
     171//! Spécifie la fonction à intégrer, sous forme double f(double).
     172Integrator&
     173Integrator::SetFunc(FUNC f)
     174{
     175  mFunc = f;
     176  mClFun = NULL;
     177  mGFFParm = NULL;
     178  mFunc = NULL;
     179  FuncChanged();
     180  return *this;
     181}
     182
    165183/*!
    166184  \brief Spécifie la fonction à intégrer, sous forme de GeneralFunction
     
    168186*/
    169187Integrator&
    170 Integrator::Func(GeneralFunction* gff, double* par)
     188Integrator::SetFunc(GeneralFunction* gff, double* par)
    171189{
    172190  mGFF = gff;
     
    181199Integrator::FVal(double x) const
    182200{
    183   DBASSERT( mFunc || (mGFF && mGFFParm) );
    184   return mFunc ? (*mFunc)(x) : mGFF->Value(&x, mGFFParm);
    185   }
     201  DBASSERT( mFunc || mClFun || (mGFF && mGFFParm) );
     202  if (mFunc) return mFunc(x);
     203  else return mClFun ? (*mClFun)(x) : mGFF->Value(&x, mGFFParm);
     204}
    186205
    187206double
     
    197216 cout<<"Integrator between "<<mXMin<<" and "<<mXMax
    198217     <<" in "<<mNStep<<" steps"<<endl;
    199  if(lp>1) cout<<"mFunc="<<mFunc<<"mGFF="<<mGFF
     218 if(lp>1) cout<<"mFunc="<<mFunc<<"mClFun="<<mClFun<<"mGFF="<<mGFF
    200219              <<"mReqPrec="<<mReqPrec<<"mDX="<<mDX<<endl;
    201220}
     
    220239{}
    221240
     241TrpzInteg::TrpzInteg(ClassFunc const & f, double xmin, double xmax)
     242: Integrator(f, xmin, xmax)
     243{}
     244
    222245TrpzInteg::TrpzInteg(FUNC f, double xmin, double xmax)
    223246: Integrator(f, xmin, xmax)
    224247{}
    225248
    226 TrpzInteg::TrpzInteg(fun f, double xmin, double xmax)
    227 : Integrator(f, xmin, xmax)
     249TrpzInteg::TrpzInteg(ClassFunc const & f)
     250: Integrator(f)
    228251{}
    229252
    230253TrpzInteg::TrpzInteg(FUNC f)
    231 : Integrator(f)
    232 {}
    233 
    234 TrpzInteg::TrpzInteg(fun f)
    235254: Integrator(f)
    236255{}
     
    301320
    302321
     322GLInteg::GLInteg(ClassFunc const & f, double xmin, double xmax)
     323: Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8)
     324{
     325  NStep(1);
     326}
     327
    303328GLInteg::GLInteg(FUNC f, double xmin, double xmax)
    304329: Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8)
     
    307332}
    308333
    309 GLInteg::GLInteg(fun f, double xmin, double xmax)
    310 : Integrator(f, xmin, xmax), mXPos(NULL), mWeights(NULL), mOrder(8)
     334GLInteg::GLInteg(ClassFunc const & f)
     335: Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8)
    311336{
    312337  NStep(1);
     
    314339
    315340GLInteg::GLInteg(FUNC f)
    316 : Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8)
    317 {
    318   NStep(1);
    319 }
    320 
    321 GLInteg::GLInteg(fun f)
    322341: Integrator(f), mXPos(NULL), mWeights(NULL), mOrder(8)
    323342{
  • trunk/SophyaLib/NTools/integ.h

    r2423 r3098  
    1818class Integrator {
    1919public:
    20   //typedef double(*FUNC)(double);
    21   typedef ClassFunc *FUNC;
    22   typedef double (*fun)(double);
     20  typedef double(*FUNC)(double);
    2321
    2422  Integrator();
     23  Integrator(ClassFunc const &, double xmin, double xmax);
     24  Integrator(ClassFunc const &);
     25
    2526  Integrator(FUNC, double xmin, double xmax);
    2627  Integrator(FUNC);
    27 
    28   Integrator(fun, double xmin, double xmax);
    29   Integrator(fun);
    3028
    3129  Integrator(GeneralFunction*, double* par, double xmin, double xmax);
     
    4139  virtual Integrator& ReqPrec(double);   // NOT YET !
    4240  virtual Integrator& Limits(double xmin, double xmax);
    43   virtual Integrator& Func(FUNC);
    44   virtual Integrator& Func(GeneralFunction*, double* par);
     41  virtual Integrator& SetFunc(ClassFunc const &);
     42  virtual Integrator& SetFunc(FUNC);
     43  virtual Integrator& SetFunc(GeneralFunction*, double* par);
    4544
    4645  virtual inline  int GetNStep(void) {return mNStep;}
     
    4948protected:
    5049  FUNC             mFunc;
     50  ClassFunc const* mClFun;
    5151  GeneralFunction* mGFF;
    5252  double*          mGFFParm;
     
    6868public:
    6969  TrpzInteg();
     70  TrpzInteg(ClassFunc const &, double xmin, double xmax);
     71  TrpzInteg(ClassFunc const &);
    7072  TrpzInteg(FUNC, double xmin, double xmax);
    7173  TrpzInteg(FUNC);
    72   TrpzInteg(fun, double xmin, double xmax);
    73   TrpzInteg(fun);
    7474  TrpzInteg(GeneralFunction*, double* par, double xmin, double xmax);
    7575  TrpzInteg(GeneralFunction*, double* par);
     
    8383public:
    8484  GLInteg();
     85  GLInteg(ClassFunc const &, double xmin, double xmax);
     86  GLInteg(ClassFunc const &);
    8587  GLInteg(FUNC, double xmin, double xmax);
    8688  GLInteg(FUNC);
    87   GLInteg(fun, double xmin, double xmax);
    88   GLInteg(fun);
    8989  GLInteg(GeneralFunction*, double* par, double xmin, double xmax);
    9090  GLInteg(GeneralFunction*, double* par);
Note: See TracChangeset for help on using the changeset viewer.