[2618] | 1 | #include "sopnamsp.h"
|
---|
| 2 | #include "machdefs.h"
|
---|
| 3 | #include <stdlib.h>
|
---|
| 4 | #include <stdio.h>
|
---|
| 5 | #include <iostream>
|
---|
| 6 | #include <math.h>
|
---|
| 7 | #include <string.h>
|
---|
| 8 | #include <string>
|
---|
| 9 |
|
---|
| 10 | #include "pexceptions.h"
|
---|
| 11 | #include "functab.h"
|
---|
| 12 |
|
---|
| 13 | /*!
|
---|
| 14 | \class SOPHYA::FuncTab
|
---|
| 15 | \ingroup NTools
|
---|
| 16 | Function tabulation
|
---|
| 17 | */
|
---|
| 18 |
|
---|
| 19 | /* --Methode-- */
|
---|
| 20 | //! Constructor
|
---|
| 21 | /*!
|
---|
| 22 | \param func : function to be tabulated
|
---|
| 23 | \param ntab : number of tabulated points
|
---|
| 24 | \param xmin xmax : tabulate from xmin to max
|
---|
| 25 | \verbatim
|
---|
| 26 | - Tabul[1] contient func(xmin), Tabul[NTab] contient func(xmax)
|
---|
| 27 | - ATTENTION: Tabul[i] contient func(xmin + (i-1)*Dx)
|
---|
| 28 | Tabul[i+1] contient func(xmin + i*Dx)
|
---|
| 29 | - Tabul[0] et Tabul[NTab+1] servent pour interpoler rapidement
|
---|
| 30 | Par defaut Tabul[0] contient Tabul[1] (=func(xmin))
|
---|
| 31 | Tabul[NTab+1] contient Tabul[NTab] (=func(xmax))
|
---|
| 32 | Ces valeurs peuvent etre changees avec les methodes SetLimVal
|
---|
| 33 | Si la fonction existe pour x<xmin et x>xmax alors le mieux est
|
---|
| 34 | d'utiliser la methode SetLimVal(void):
|
---|
| 35 | Tabul[0] = func(xmin-dx)
|
---|
| 36 | Tabul[NTab+1] = func(xmax+dx)
|
---|
| 37 | Si la fonction n'existe pas pour x<xmin et x>xmax utiliser
|
---|
| 38 | la methode SetLimVal(val0,valn):
|
---|
| 39 | Tabul[0] = val0
|
---|
| 40 | Tabul[NTab+1] = valn
|
---|
| 41 | \endverbatim
|
---|
| 42 |
|
---|
| 43 | */
|
---|
| 44 | FuncTab::FuncTab(double (*func)(double const),uint_4 ntab,r_8 xmin,r_8 xmax)
|
---|
| 45 | {
|
---|
| 46 | cout<<"func="<<func<<endl;
|
---|
| 47 | if(ntab<=1) ntab = 10;
|
---|
| 48 | if(xmin>=xmax) {xmin=0.; xmax=1.;}
|
---|
| 49 | NTab = ntab;
|
---|
| 50 | XMin = xmin;
|
---|
| 51 | XMax = xmax;
|
---|
| 52 | Func = func;
|
---|
| 53 | Dx = (r_8)(XMax-XMin)/(r_8)(NTab-1);
|
---|
| 54 | Tabul = new r_8[NTab+2];
|
---|
| 55 | for(int_4 i=0;i<NTab+2;i++) Tabul[i] = 0.;
|
---|
| 56 | PInterpL = PInterpP[0] = PInterpP[1] = NULL;
|
---|
| 57 | if(!Tabul) return;
|
---|
| 58 | for(int_4 i=0;i<NTab;i++) Tabul[i+1] = func(XMin + i*Dx);
|
---|
| 59 | Tabul[0] = Tabul[1];
|
---|
| 60 | Tabul[NTab+1] = Tabul[NTab];
|
---|
| 61 | }
|
---|
| 62 |
|
---|
| 63 | /* --Methode-- */
|
---|
| 64 | //! Destructor
|
---|
| 65 | FuncTab::~FuncTab(void)
|
---|
| 66 | {
|
---|
| 67 | if(Tabul) {delete [] Tabul; Tabul=NULL;}
|
---|
| 68 | if(PInterpL) {delete [] PInterpL; PInterpL=NULL;}
|
---|
| 69 | }
|
---|
| 70 |
|
---|
| 71 | /* --Methode-- */
|
---|
| 72 | //! Set automatically values for the index [0] and [NTab+1]
|
---|
| 73 | /*! Set automatically values for the index [0] and [NTab+1]
|
---|
| 74 | That is needed for fast interpolation
|
---|
| 75 | Value are set for xmin-dx and xmax+dx
|
---|
| 76 | */
|
---|
| 77 | void FuncTab::SetLimVal(void)
|
---|
| 78 | {
|
---|
| 79 | Tabul[0] = Func(XMin-Dx);
|
---|
| 80 | Tabul[NTab+1] = Func(XMax+Dx);
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 |
|
---|
| 84 | /* --Methode-- */
|
---|
| 85 | //! Give values for the index [0] and [NTab+1]
|
---|
| 86 | /*! Set automatically values for the index [0] and [NTab+1]
|
---|
| 87 | That is needed for fast interpolation
|
---|
| 88 | */
|
---|
| 89 | void FuncTab::SetLimVal(r_8 val0,r_8 valn)
|
---|
| 90 | {
|
---|
| 91 | Tabul[0] = val0;
|
---|
| 92 | Tabul[NTab+1] = valn;
|
---|
| 93 | }
|
---|
| 94 |
|
---|
| 95 | /* --Methode-- */
|
---|
| 96 | //! Construc table for linear and parabolic interpolation
|
---|
| 97 | /*!
|
---|
| 98 | \param typ : 0=nearest tabulated value, 1=linear, 2=parabolic
|
---|
| 99 | \warning For speed consideration, no protection is done
|
---|
| 100 | in the corresponding Value?() inline routine.
|
---|
| 101 | */
|
---|
| 102 | void FuncTab::SetInterp(uint_2 typ)
|
---|
| 103 | {
|
---|
| 104 | if(typ==1) { // Linear Interpolation between two consecutive values
|
---|
| 105 |
|
---|
| 106 | if(PInterpL) delete [] PInterpL;
|
---|
| 107 | PInterpL = new r_8[NTab+2];
|
---|
| 108 | for(int_4 i=0;i<NTab+1;i++)
|
---|
| 109 | PInterpL[i] = (Tabul[i+1]-Tabul[i])/Dx;
|
---|
| 110 | PInterpL[NTab+1] = 0.;
|
---|
| 111 |
|
---|
| 112 | } else if(typ==2) {
|
---|
| 113 |
|
---|
| 114 | if(PInterpP[0]) delete [] PInterpP[0];
|
---|
| 115 | if(PInterpP[1]) delete [] PInterpP[1];
|
---|
| 116 | PInterpP[0] = new r_8[NTab+2];
|
---|
| 117 | PInterpP[1] = new r_8[NTab+2];
|
---|
| 118 | for(int_4 i=1;i<=NTab;i++) {
|
---|
| 119 | PInterpP[0][i] = (Tabul[i+1]+Tabul[i-1]-2.*Tabul[i])/(2.*Dx*Dx);
|
---|
| 120 | PInterpP[1][i] = (Tabul[i+1]-Tabul[i-1])/(2.*Dx);
|
---|
| 121 | }
|
---|
| 122 | PInterpP[0][0]=PInterpP[0][NTab+1]=PInterpP[1][0]=PInterpP[1][NTab+1]=0.;
|
---|
| 123 |
|
---|
| 124 | }
|
---|
| 125 | }
|
---|