source: Sophya/trunk/SophyaLib/NTools/integ.h@ 3685

Last change on this file since 3685 was 3409, checked in by cmv, 18 years ago

operator(double) de ClassFunc et GenericFunc n'est plus const , cmv 25/11/2007

File size: 2.8 KB
RevLine 
[220]1// This may look like C code, but it is really -*- C++ -*-
[1371]2// Simple integrator
3// E. Aubourg 1996-...
4// DAPNIA/SPP (Saclay) / CEA LAL - IN2P3/CNRS (Orsay)
[220]5
6#ifndef INTEG_H_SEEN
7#define INTEG_H_SEEN
8
[244]9#include "machdefs.h"
10#include "pexceptions.h"
[220]11#include <set>
[2283]12#include "classfunc.h"
[220]13
[552]14namespace SOPHYA {
[220]15
[514]16class GeneralFunction;
17
[1371]18class Integrator {
[220]19public:
[3098]20 typedef double(*FUNC)(double);
[220]21
22 Integrator();
[3409]23 Integrator(ClassFunc &, double xmin, double xmax);
24 Integrator(ClassFunc &);
[3098]25
[220]26 Integrator(FUNC, double xmin, double xmax);
27 Integrator(FUNC);
[2283]28
[220]29 Integrator(GeneralFunction*, double* par, double xmin, double xmax);
30 Integrator(GeneralFunction*, double* par);
31 virtual ~Integrator();
32
33 virtual double Value() = 0;
34 virtual double ValueBetween(double xmin, double xmax);
35 virtual operator double() {return Value();}
36
37 virtual Integrator& NStep(int);
38 virtual Integrator& DX(double);
39 virtual Integrator& ReqPrec(double); // NOT YET !
40 virtual Integrator& Limits(double xmin, double xmax);
[3409]41 virtual Integrator& SetFunc(ClassFunc &);
[3098]42 virtual Integrator& SetFunc(FUNC);
43 virtual Integrator& SetFunc(GeneralFunction*, double* par);
[220]44
[2423]45 virtual inline int GetNStep(void) {return mNStep;}
46 virtual void Print(int lp=0);
47
[220]48protected:
49 FUNC mFunc;
[3409]50 ClassFunc * mClFun;
[220]51 GeneralFunction* mGFF;
52 double* mGFFParm;
53
54 int mNStep; // -1 si pas fixe
55 double mDX;
56 double mReqPrec;
57 double mXMin, mXMax;
58
59 double FVal(double x) const;
60 virtual void LimitsChanged() {}
61 virtual void StepsChanged() {}
62 virtual void FuncChanged() {}
63};
64
65
66
67class TrpzInteg : public Integrator {
68public:
69 TrpzInteg();
[3409]70 TrpzInteg(ClassFunc &, double xmin, double xmax);
71 TrpzInteg(ClassFunc &);
[220]72 TrpzInteg(FUNC, double xmin, double xmax);
73 TrpzInteg(FUNC);
74 TrpzInteg(GeneralFunction*, double* par, double xmin, double xmax);
75 TrpzInteg(GeneralFunction*, double* par);
76
77 ~TrpzInteg();
78
79 virtual double Value();
80};
81
82class GLInteg : public Integrator {
83public:
84 GLInteg();
[3409]85 GLInteg(ClassFunc &, double xmin, double xmax);
86 GLInteg(ClassFunc &);
[220]87 GLInteg(FUNC, double xmin, double xmax);
88 GLInteg(FUNC);
89 GLInteg(GeneralFunction*, double* par, double xmin, double xmax);
90 GLInteg(GeneralFunction*, double* par);
91
92 ~GLInteg();
93
94 virtual double Value();
95 virtual GLInteg& AddBound(double x);
96 virtual GLInteg& SetOrder(int order);
[2423]97 virtual inline int GetOrder(void) {return mOrder;}
98 virtual void Print(int lp=0);
[220]99protected:
100
101 double* mXPos; // integration entre 0 et 1
102 double* mWeights; // integration entre 0 et 1
103 int mOrder; // ordre GL
104 set<double> mBounds; // limites des intervalles d'integration
105
106 void ComputeWeights();
107 void LimitsChanged();
108 void StepsChanged();
109 void InvalWeights();
110 void ComputeBounds();
111};
112
[514]113} // Fin du namespace
[220]114
115#endif
Note: See TracBrowser for help on using the repository browser.