20 #define REPEAT 1000000
22 #define PI 3.1415926535897932384626433832795028841971693993751058209749445923
55 double x = (rand()/(double)RAND_MAX)*2-1;
57 int j = -1 + m - 1 - (int) (acos(x) * (m-1) /
PI);
58 double f = (x - cos((m-1-j)*
PI/(m-1))) /
59 (cos((m-1-(j+1))*
PI/(m-1)) - cos((m-1-j)*
PI/(m-1)));
62 for(i=0;i<NY*
N;++
i) p[i]=rand()/(double)RAND_MAX;
68 printf(
"%g <= %g <= %g, f = %g\n",
69 cos((m-1-j)*
PI/(m-1)), x, cos((m-1-(j+1))*
PI/(m-1)), f);
70 lag_N(ld_N,ld_N+N,N,0,x);
72 double lo = (1-f)*lb[(i*m+j)*2 ] + f*lb[(i*m+j+1)*2 ],
73 up = (1-f)*lb[(i*m+j)*2+1] + f*lb[(i*m+j+1)*2+1],
75 if(r<3 || px < lo || up < px)
76 printf(
"p_%02d(%g) = %g in [%g,%g]\n",i,x,px,lo,up);
77 if(px<lo || up<px) {failure=1;
break;}
84 int j##x = -1 + m##x - 1 - (int) (acos(x) * (m##x-1) / PI); \
85 double f##x = (x - cos((m##x-1-j##x)*PI/(m##x-1))) / \
86 (cos((m##x-1-(j##x+1))*PI/(m##x-1)) \
87 - cos((m##x-1-j##x)*PI/(m##x-1)))
92 double x = (rand()/(double)RAND_MAX)*2-1,
93 y = (rand()/(double)RAND_MAX)*2-1;
97 for(i=0;i<NZ*NY*
N;++
i) p[i]=rand()/(double)RAND_MAX;
103 printf(
"x: %g <= %g <= %g, f = %g\n",
104 cos((mx-1-jx)*
PI/(mx-1)), x, cos((mx-1-(jx+1))*
PI/(mx-1)), fx),
105 printf(
"y: %g <= %g <= %g, f = %g\n",
106 cos((my-1-jy)*
PI/(my-1)),
y, cos((my-1-(jy+1))*
PI/(my-1)), fy);
107 lag_N (ld_N ,ld_N +N ,N ,0,x);
108 lag_NY(ld_NY,ld_NY+NY,NY,0,
y);
111 double lo = (1-fx)*(1-fy)*lb[((i*mx+jx )*my+jy )*2 ]
112 + fx *(1-fy)*lb[((i*mx+jx+1)*my+jy )*2 ]
113 + (1-fx)* fy *lb[((i*mx+jx )*my+jy+1)*2 ]
114 + fx * fy *lb[((i*mx+jx+1)*my+jy+1)*2 ],
115 up = (1-fx)*(1-fy)*lb[((i*mx+jx )*my+jy )*2+1]
116 + fx *(1-fy)*lb[((i*mx+jx+1)*my+jy )*2+1]
117 + (1-fx)* fy *lb[((i*mx+jx )*my+jy+1)*2+1]
118 + fx * fy *lb[((i*mx+jx+1)*my+jy+1)*2+1],
120 if(r<3 || pxy < lo || up < pxy)
121 printf(
"p_%02d(%g,%g) = %g in [%g,%g]\n",i,x,
y,pxy,lo,up);
122 if(pxy<lo || up<pxy) {failure=1;
break;}
131 double x = (rand()/(double)RAND_MAX)*2-1,
132 y = (rand()/(double)RAND_MAX)*2-1,
133 z = (rand()/(double)RAND_MAX)*2-1;
136 for(i=0;i<NZ*NY*
N;++
i) p[i]=rand()/(double)RAND_MAX;
138 lob_bnd_lin_3(lb, lb_N,N,mx, lb_NY,NY,my, lb_NZ,NZ,mz, p,1,
work);
142 printf(
"x: %g <= %g <= %g, f = %g\n",
143 cos((mx-1-jx)*
PI/(mx-1)), x, cos((mx-1-(jx+1))*
PI/(mx-1)), fx),
144 printf(
"y: %g <= %g <= %g, f = %g\n",
145 cos((my-1-jy)*
PI/(my-1)),
y, cos((my-1-(jy+1))*
PI/(my-1)), fy),
146 printf(
"z: %g <= %g <= %g, f = %g\n",
147 cos((mz-1-jz)*
PI/(mz-1)),
z, cos((mz-1-(jz+1))*
PI/(mz-1)), fz);
148 lag_N (ld_N ,ld_N +N ,N ,0,x);
149 lag_NY(ld_NY,ld_NY+NY,NY,0,
y);
150 lag_NZ(ld_NZ,ld_NZ+NZ,NZ,0,
z);
154 + (1-fx)*(1-fy)*(1-fz)*lb[(((jx )*my+jy )*mz+jz )*2 ]
155 + fx *(1-fy)*(1-fz)*lb[(((jx+1)*my+jy )*mz+jz )*2 ]
156 + (1-fx)* fy *(1-fz)*lb[(((jx )*my+jy+1)*mz+jz )*2 ]
157 + fx * fy *(1-fz)*lb[(((jx+1)*my+jy+1)*mz+jz )*2 ]
158 + (1-fx)*(1-fy)* fz *lb[(((jx )*my+jy )*mz+jz+1)*2 ]
159 + fx *(1-fy)* fz *lb[(((jx+1)*my+jy )*mz+jz+1)*2 ]
160 + (1-fx)* fy * fz *lb[(((jx )*my+jy+1)*mz+jz+1)*2 ]
161 + fx * fy * fz *lb[(((jx+1)*my+jy+1)*mz+jz+1)*2 ],
163 + (1-fx)*(1-fy)*(1-fz)*lb[(((jx )*my+jy )*mz+jz )*2+1]
164 + fx *(1-fy)*(1-fz)*lb[(((jx+1)*my+jy )*mz+jz )*2+1]
165 + (1-fx)* fy *(1-fz)*lb[(((jx )*my+jy+1)*mz+jz )*2+1]
166 + fx * fy *(1-fz)*lb[(((jx+1)*my+jy+1)*mz+jz )*2+1]
167 + (1-fx)*(1-fy)* fz *lb[(((jx )*my+jy )*mz+jz+1)*2+1]
168 + fx *(1-fy)* fz *lb[(((jx+1)*my+jy )*mz+jz+1)*2+1]
169 + (1-fx)* fy * fz *lb[(((jx )*my+jy+1)*mz+jz+1)*2+1]
170 + fx * fy * fz *lb[(((jx+1)*my+jy+1)*mz+jz+1)*2+1],
172 if(r<3 || pxyz < lo || up < pxyz)
173 printf(
"p(%g,%g,%g) = %g in [%g,%g]\n",x,
y,
z,pxyz,lo,up);
174 if(pxyz<lo || up<pxyz) failure=1;
180 free(lb_NZ), free(lb_NY), free(lb_N), free(ld_NZ), free(ld_NY), free(ld_N);
182 printf(
"Tests %s\n", failure?
"failed":
"successful");
static double tensor_i2(const double *Jr, uint nr, const double *Js, uint ns, const double *u, double *work)
#define tmalloc(type, count)
void lagrange_fun(double *restrict p, double *restrict data, unsigned n, int d, double x)
static unsigned lob_bnd_size(unsigned n, unsigned m)
static double tensor_i3(const double *Jr, uint nr, const double *Js, uint ns, const double *Jt, uint nt, const double *u, double *work)
static double work[TNR *NS]
establishes some macros to establish naming conventions
static double y[NR *NS *NT *N]
static double z[NR *NS *NT *N]