| [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]; | 
|---|
| [3572] | 55 | for(uint_4 i=0;i<NTab+2;i++) Tabul[i] = 0.; | 
|---|
| [2618] | 56 | PInterpL = PInterpP[0] = PInterpP[1] = NULL; | 
|---|
|  | 57 | if(!Tabul) return; | 
|---|
| [3572] | 58 | for(uint_4 i=0;i<NTab;i++) Tabul[i+1] = func(XMin + i*Dx); | 
|---|
| [2618] | 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]; | 
|---|
| [3572] | 108 | for(uint_4 i=0;i<NTab+1;i++) | 
|---|
| [2618] | 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]; | 
|---|
| [3572] | 118 | for(uint_4 i=1;i<=NTab;i++) { | 
|---|
| [2618] | 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 | } | 
|---|