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

Last change on this file since 2988 was 2423, checked in by cmv, 22 years ago

Quelques ameliorations mineures cmv 28/8/2003

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 typedef ClassFunc *FUNC;
22 typedef double (*fun)(double);
23
24 Integrator();
25 Integrator(FUNC, double xmin, double xmax);
26 Integrator(FUNC);
27
28 Integrator(fun, double xmin, double xmax);
29 Integrator(fun);
30
31 Integrator(GeneralFunction*, double* par, double xmin, double xmax);
32 Integrator(GeneralFunction*, double* par);
33 virtual ~Integrator();
34
35 virtual double Value() = 0;
36 virtual double ValueBetween(double xmin, double xmax);
37 virtual operator double() {return Value();}
38
39 virtual Integrator& NStep(int);
40 virtual Integrator& DX(double);
41 virtual Integrator& ReqPrec(double); // NOT YET !
42 virtual Integrator& Limits(double xmin, double xmax);
43 virtual Integrator& Func(FUNC);
44 virtual Integrator& Func(GeneralFunction*, double* par);
45
46 virtual inline int GetNStep(void) {return mNStep;}
47 virtual void Print(int lp=0);
48
49protected:
50 FUNC mFunc;
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(FUNC, double xmin, double xmax);
71 TrpzInteg(FUNC);
72 TrpzInteg(fun, double xmin, double xmax);
73 TrpzInteg(fun);
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(FUNC, double xmin, double xmax);
86 GLInteg(FUNC);
87 GLInteg(fun, double xmin, double xmax);
88 GLInteg(fun);
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.