sandbox/Antoonvh/lineintegral.c
Evaluate a line integral on a 2D grid.
#include "grid/quadtree.h"
#define func(a,b) (sin(a)*cos(b))
#define funcint(a,b) (sin(a)*(sin(Y0+L0)-sin(y-(Delta/2))))
scalar s[],ints[];
int startlevel = 2;
int main(){
L0=2.*M_PI;
X0=Y0=-L0/2;
for (int i=1;i<7;i++){
// Test to function on several grids
init_grid(1<<(startlevel+i));
refine(level<=startlevel+i && (x+y)<-1.);
unrefine(level>=startlevel+i-1 && (x+y)>1.);
// Define the function (2nd-order accurate)
foreach()
s[]=func(x,y);
boundary({s}); //<- This is important
// Integrate to the top
foreach(){
//Store height of this cell;
double yt=y;
double yh=y;
double integral=0.;
while(yh<(Y0+L0)){
Point point = locate(x,yh);
integral +=interpolate(s,x,y)*Delta;
yh+=Delta;
}
Point point = locate(x,yt);
ints[]=integral;
}
double err=0;
foreach()
err+=fabs(ints[]-funcint(x,y))*sq(Delta);
static FILE * fp = fopen("err.dat","w");
fprintf(fp,"%d\t%g\n",i,err);
}
}
Results
The function appears to be first-order accurate:
set xr [ 0.5:6.5]
set logscale y
plot 'err.dat' u 1:2 ,\
2**(-x)