/* 1d multigrid simple test from More C Tools for Scientists and Engineers by L. Baker*/ /* dimension to two times n */ float x[100],v[100],u[100],f[100]; /* x=grid v=answer f=drive A for Laplacian, i.e Poisson Ay=f */ /*problem size, coarsest grid allowed*/ #define n 32 #define ncoarsest 4 /*relaxtion parameters*/ #define n0 1 #define n1 2 #define n2 2 #define dx .1 float bc0=1.,bc1=2.;/*boundary conditions*/ float av(i,m,y) int i,m; float *y; {/* evaluate Av. use Av-f for residual*/ if(!i) return y[0]; if(i==(m-1))return y[m-1]; return (y[i+1]+y[i-1]-2.*y[i])/(dx*dx); } float residual(i,m,f,v) int i,m;float *f,*v; { float av(); return f[i]-av(i,m,v); } correct(m,v,v2h) int m; float *v,*v2h; {/*coarse to fine*/ int i,mfine; mfine=m<<1; for(i=0;i>=1; h<<=1; restrict(m,nextgridf,f,v); for(i=0;i>1; h<<=1; nextgridf= &(f[nn]); nextgridv= &(v[nn]); restrict(m,nextgridf,f,v); for(i=0;i