/* ************************************************************************ * laplace.c: Solution of Laplace equation with finite differences * * * * comment: Output data is saved in 3D grid format used by gnuplot * ************************************************************************ */ #include <stdio.h> #include <math.h> #define maxx 40 /* number of grid points */ #define maxy 40 /* number of grid points */ main() { double p[maxx][maxy], pnew, dp, dpmax, omega; int i, j, iter; FILE *output; /* save data in laplace.dat */ FILE *file; /* save data in laplace_dp.dat */ output = fopen("laplace.dat","w"); file = fopen("laplace_dp.dat","w"); for(i=0; i<maxx; i++) /* clear the array */ { for (j=0; j<maxy; j++) p[i][j] = 0; } for(i=0; i<maxx; i++) p[i][0] = 100.0; /* p[i][0] = 100 V */ for(iter=0; iter<1000; iter++) /* iterations */ { dpmax=0.0; for(i=1; i<(maxx-1); i++) /* x-direction */ { for(j=1; j<(maxy-1); j++) /* y-direction */ { pnew = 0.25*(p[i+1][j]+p[i-1][j]+p[i][j+1]+p[i][j-1]); dp=pnew-p[i][j]; if(fabs(dp) > dpmax) dpmax=fabs(dp); p[i][j] = pnew; } } fprintf(file, "%d\t%f\n",iter,dpmax); } for (i=0; i<maxx ; i++) /* write data gnuplot 3D format */ { for (j=0; j<maxy; j++) { fprintf(output, "%f\n",p[i][j]); } fprintf(output, "\n"); /* empty line for gnuplot */ } printf("data stored in laplace.dat\n"); fclose(output); fclose(file); }