/* fem_checke_la.c Galerkin FEM * solve u'(x)=e^x u(0)=1, u(1)=e 0 < x < 1 * initial try 10 points, then 20 * investigate gauss-legendre, adaptive, and trapezoidal integration * solve for Uj * sum j=0,9 int x=0,1 phip(x,j)*phi(x,i) dx = int x=0,1 f(x)*phi(x,i)dx * k(i,j) = int x=0,1 phip(x,j)*phi(x,i) dx (not i==0 or i==9, boundary) * f(i) = int x=0,1 exp(x)*phi(x,i) dx * k * U = f, solve simultaneous equations for U */ #include #include #include #include "laphi.h" #include "simeq.h" #include "gaulegf.h" #include "aquad3.h" #undef abs #define abs(x) ((x)<0.0?(-(x)):(x)) #undef min #define min(a,b) ((a)<(b)?(a):(b)) #undef max #define max(a,b) ((a)>(b)?(a):(b)) static double k[400]; /* i*n+j Gauss-Legendre integration */ static double ks[400]; /* simple trapazoidal integration */ static double kd[400]; /* adaptive integration */ static double xg[20]; static double f[20]; static double u[20]; static double fs[20]; static double us[20]; static double fd[20]; static double ud[20]; static double Ua[20]; double F(double x) /* forcing function */ { return exp(x); } double uana(double x) /* analytic solution and boundary */ { return exp(x); } /* needed by galk or galk, available at call */ int i, j, n; double galk(double x) /* Galerkin k stiffness function */ { return phip(x,j,n-1,xg)*phi(x,i,n-1,xg); } /* end galk used by aquad3 */ double galf(double x) /* Galerkin f function */ { return F(x)*phi(x,i,n-1,xg); } /* end galf used by aquad */ int main(int argc, char *argv[]) { /* i, j and n above, used by aquad3 */ double xmin = 0.0; double xmax = 1.0; double x, h; double a, b, sum; double xx[100], ww[100]; /* for Gauss-Legendre */ double val, err, avgerr, maxerr; double eps = 1.0e-7; int p, np; printf("fem_checke_la.c running \n"); printf("Given du/dx = exp(x) 0maxerr) maxerr = err; avgerr = avgerr + err; printf("u[%d]=%6.3f, Ua=%6.3f, err=%g \n", i, u[i], Ua[i], u[i]-Ua[i]); } printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)n); printf("\n"); printf("kd computed adaptive stiffness matrix \n"); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ud[%d]=%6.3f, Ua=%6.3f, err=%g \n", i, ud[i], Ua[i], ud[i]-Ua[i]); } printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)n); printf("\n"); printf("\n"); printf("ks computed simple stiffness matrix \n"); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("us[%d]=%6.3f, Ua=%6.3f, err=%g \n", i, us[i], Ua[i], us[i]-Ua[i]); } printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)n); printf("\n"); printf("\n"); printf("Try 20 points \n"); n = 20; h = (xmax-xmin)/(double)(n-1); printf("x grid and analytic solution \n"); for(i=0; i<=n; i++) /* need one extra */ { xg[i] = xmin+i*h; Ua[i] = uana(xg[i]); printf("i=%d, Ua(%6.3f)=%6.3f \n", i, xg[i], Ua[i]); } printf("\n"); /* initialize k and f */ for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("u[%d]=%6.3f, Ua=%6.3f, err=%g \n", i, u[i], Ua[i], u[i]-Ua[i]); } printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)n); printf("\n"); printf("kd computed adaptive stiffness matrix \n"); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("ud[%d]=%6.3f, Ua=%6.3f, err=%g \n", i, ud[i], Ua[i], ud[i]-Ua[i]); } printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)n); printf("\n"); printf("ks computed simple stiffness matrix \n"); for(i=0; imaxerr) maxerr = err; avgerr = avgerr + err; printf("us[%d]=%6.3f, Ua=%6.3f, err=%g \n", i, us[i], Ua[i], us[i]-Ua[i]); } printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)n); printf("\n"); return 0; } /* end main */ /* end fem_checke.c */