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

Last change on this file since 3999 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
Line 
1// This may look like C code, but it is really -*- C++ -*-
2// Simple integrator
3// E. Aubourg 1996-...
4// DAPNIA/SPP (Saclay) / CEA LAL - IN2P3/CNRS (Orsay)
5
6#ifndef INTEG_H_SEEN
7#define INTEG_H_SEEN
8
9#include "machdefs.h"
10#include "pexceptions.h"
11#include <set>
12#include "classfunc.h"
13
14namespace SOPHYA {
15
16class GeneralFunction;
17
18class Integrator {
19public:
20 typedef double(*FUNC)(double);
21
22 Integrator();
23 Integrator(ClassFunc &, double xmin, double xmax);
24 Integrator(ClassFunc &);
25
26 Integrator(FUNC, double xmin, double xmax);
27 Integrator(FUNC);
28
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);
41 virtual Integrator& SetFunc(ClassFunc &);
42 virtual Integrator& SetFunc(FUNC);
43 virtual Integrator& SetFunc(GeneralFunction*, double* par);
44
45 virtual inline int GetNStep(void) {return mNStep;}
46 virtual void Print(int lp=0);
47
48protected:
49 FUNC mFunc;
50 ClassFunc * mClFun;
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();
70 TrpzInteg(ClassFunc &, double xmin, double xmax);
71 TrpzInteg(ClassFunc &);
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();
85 GLInteg(ClassFunc &, double xmin, double xmax);
86 GLInteg(ClassFunc &);
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);
97 virtual inline int GetOrder(void) {return mOrder;}
98 virtual void Print(int lp=0);
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
113} // Fin du namespace
114
115#endif
Note: See TracBrowser for help on using the repository browser.