11 #define lagrange_size PREFIXED_NAME(lagrange_size )
12 #define lagrange_setup PREFIXED_NAME(lagrange_setup)
13 #define gauss_nodes PREFIXED_NAME(gauss_nodes )
14 #define gauss_quad PREFIXED_NAME(gauss_quad )
15 #define lobatto_nodes PREFIXED_NAME(lobatto_nodes )
16 #define lobatto_quad PREFIXED_NAME(lobatto_quad )
17 #define gll_lag_size PREFIXED_NAME(gll_lag_size )
18 #define gll_lag_setup PREFIXED_NAME(gll_lag_setup )
21 double *
restrict data,
unsigned n,
int d,
double x);
26 double *
restrict data,
unsigned n,
int der,
double x)
31 for(i=0;i<
n;++
i) d[i]=2*(x-z[i]);
32 u0[0 ]=1;
for(i=0 ;i<n-1;++
i) u0[i+1]=u0[i]*d[i];
33 v0[n-1]=1;
for(i=n-1;
i ;--
i) v0[i-1]=d[i]*v0[i];
34 for(i=0;i<
n;++
i) p[i]=w[i]*u0[i]*v0[i];
37 u1[0 ]=0;
for(i=0 ;i<n-1;++
i) u1[i+1]=u1[i]*d[i]+u0[i];
38 v1[n-1]=0;
for(i=n-1;
i ;--
i) v1[i-1]=d[i]*v1[i]+v0[i];
39 for(i=0;i<
n;++
i) p1[i]=2*w[i]*(u1[i]*v0[i]+u0[i]*v1[i]);
42 u2[0 ]=0;
for(i=0 ;i<n-1;++
i) u2[i+1]=u2[i]*d[i]+2*u1[i];
43 v2[n-1]=0;
for(i=n-1;
i ;--
i) v2[i-1]=d[i]*v2[i]+2*v1[i];
45 p2[i]=4*w[i]*(u2[i]*v0[i]+2*u1[i]*v1[i]+u0[i]*v2[i]);
51 double *
restrict p,
double *data,
double *w,
const double *
z,
55 for(i=0;i<
n;++
i) w[i]=1;
56 for(i=0;i<
n;++
i) lag_eval(p,data,n,0,z[i]), w[
i]=1/p[
i];
68 memcpy(data,z,n*
sizeof(
double));
74 #define EPS (128*DBL_EPSILON)
75 #define PI 3.1415926535897932384626433832795028841971693993751058209749445923
99 for(i=1; i<nn; i+=2) {
100 p[0] = ((2*i+1)*x*p[1]- i *p[0])/(i+1);
101 p[1] = ((2*i+3)*x*p[0]-(i+1)*p[1])/(i+2);
112 for(i=2; i<nn; i+=2) {
113 p[1] = ((2*i+1)*x*p[0]-(i+1)*p[1])/i;
114 p[0] = ((2*i+3)*x*p[1]-(i+2)*p[0])/(i+1);
125 for(i=3; i<nn; i+=2) {
126 p[0] = ((2*i+1)*x*p[1]-(i+2)*p[0])/(i-1);
127 p[1] = ((2*i+3)*x*p[0]-(i+3)*p[1])/i;
142 for(i=0; i<=n/2-1; ++
i) {
143 double ox,
x = cos( (2*n-2*i-1)*(
PI/2)/n );
147 }
while(fabs(x-ox)>-x*
EPS);
151 for(j=(n+1)/2,i=n/2-1; j<
n; ++j,--
i) z[j]=-z[i];
158 for(i=0; i<=n/2-1; ++
i) {
159 double ox,
x = cos( (n-i)*
PI/np );
163 }
while(fabs(x-ox)>-x*
EPS);
167 for(j=(n+1)/2,i=n/2-1; j<
n; ++j,--
i) z[j]=-z[i];
173 z[0] = -1, z[n-1] = 1;
179 z[0] = -1, z[n-1] = 1;
184 for(i=1;i<=n/2-1;++
i) z[i] = -gllz[i-1];
185 for(j=(n+1)/2,i=n/2-1; j<n-1; ++j,--
i) z[j] = gllz[i-1];
199 for(i=0; i<=(n-1)/2; ++
i) {
200 double d = (n+1)*
legendre(n+1,z[i]);
201 w[
i] = 2*(1-z[
i]*z[
i])/(d*d);
203 for(j=(n+1)/2,i=n/2-1; j<
n; ++j,--
i) w[j]=w[i];
210 for(i=0; i<=(n-1)/2; ++
i) {
212 w[
i] = 2/((n-1)*n*d*d);
214 for(j=(n+1)/2,i=n/2-1; j<
n; ++j,--
i) w[j]=w[i];
#define tmalloc(type, count)
void lagrange_fun(double *restrict p, double *restrict data, unsigned n, int d, double x)
static double legendre(int n, double x)
static const double *const gllz_table[21]
static void lobatto_nodes_n(double *restrict z, int n)
static void lobatto_nodes_fix(double *restrict z, int n)
static lagrange_fun *const gll_lag_table[23]
static double legendre_d2(int n, double x)
static void lagrange_coef(double *restrict p, double *data, double *w, const double *z, unsigned n, lagrange_fun *lag_eval)
static void lobatto_nodes_aux(double *restrict z, int n)
establishes some macros to establish naming conventions
static double legendre_d1(int n, double x)
static void lagrange_eval(double *restrict p, double *restrict data, unsigned n, int der, double x)
static double z[NR *NS *NT *N]