1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
#include <math.h>
#include "tbl.h"
#include <cassert>
namespace Lorene {
double* jacobi(int , double) ;
double* pointsgausslobatto(int n) {
int nmax = 10 ;
int ndiv = (n+1)*(n+1)+5 ;
double pas = double(2)/double(ndiv-1) ;
double eps = 2.5E-12 ;
Tbl subdiv(ndiv) ;
subdiv.set_etat_qcq();
Tbl cs(n-1,2) ;
cs.set_etat_qcq() ;
double* xx = new double[nmax] ;
double* yy ;
double* zz ;
int i,k,l ;
for (i = 0 ; i < ndiv ; i++) {
subdiv.set(i) = double(-1) + pas * double(i) ;
}
double a = (2*double(n)+3)/double((n+1)*(n+1)) ;
double b = - 1 - a ;
int j=0;
for (i = 1 ; i < ndiv-3 ; i++) {
yy = jacobi(n+1 , subdiv(i)) ;
zz = jacobi(n+1 , subdiv(i+1)) ;
double omega1 = yy[n+1] + a * yy[n] + b * yy[n-1] ;
double omega2 = zz[n+1] + a * zz[n] + b * zz[n-1] ;
if (omega1*omega2 <= 0) {
cs.set(j,0) = subdiv(i) ;
cs.set(j,1) = subdiv(i+1) ;
j++;
}
delete [] yy ;
delete [] zz ;
}
double* pointsgl = new double[j+2];
assert(j==n-1) ;
pointsgl[0] = -1;
for (l = 0 ; l < j ; l++) {
xx[0] = cs(l,0) ;
xx[1] = cs(l,1) ;
for (k = 2 ; k < nmax ; k++) {
yy = jacobi(n+1 , xx[k-2]) ;
zz = jacobi(n+1 , xx[k-1]) ;
double omega1 = yy[n+1] + a * yy[n] + b * yy[n-1] ;
double omega2 = zz[n+1] + a * zz[n] + b * zz[n-1] ;
if (( fabs(xx[k-2]-xx[k-1])>=eps )&&(fabs(omega2)>=eps )) {
xx[k]=(xx[k-2]*omega2 -xx[k-1]*omega1)/(omega2-omega1) ;
}
else {
xx[k]=xx[k-1];
}
delete [] yy ;
delete [] zz ;
}
pointsgl[l+1] = xx[nmax-1] ;
}
delete [] xx ;
pointsgl[n] = 1 ;
return pointsgl ;
}
}
|