#include #include #include static float *upper, *middle, *lower; void initval( float *p[], float *rhs[], int nrows, int ncols, float pborder, float pinside, float rhsborder, float rhsinside ) { int i, j; /***/ for ( i = 0; i < nrows; i++ ) { for ( j = 0; j < ncols; j++ ) { if ( (i == 0) || (j == 0) || (i == (nrows-1)) || (j == (ncols-1)) ) { p[i][j] = pborder; rhs[i][j] = rhsborder; } else { p[i][j] = pinside; rhs[i][j] = rhsinside; } } } } void allocate( int nrows, int ncols, float **pcop, float **corhs ) { upper = emalloc( ncols*sizeof(*upper) ); middle = emalloc( ncols*sizeof(*middle) ); lower = emalloc( ncols*sizeof(*lower) ); if ( (!upper) || (!middle) || (!lower) ) { printf( "Cannot allocate\n" ); } } void upload( float *p[], float *rhs[], int nrows, int ncols, float *cop, float *corhs ) { } void download( float *p[], float *rhs[], int nrows, int ncols, float *cop, float *corhs ) { } void poissn( float *p[], float *rhs[], float **pcop, int icop, float *corhs, int nrows, int ncols, float delx, float dely, float addcoeff[] ) { int i, j, k; float rdx2, rdy2, beta2, result; /***/ rdx2 = 1./delx/delx; rdy2 = 1./dely/dely; beta2 = 1.0/(2.0*(rdx2+rdy2)); for ( j = 0; j < ncols; j++ ) { upper[j] = p[0][j]; middle[j] = p[1][j]; } for ( i = 2; i < nrows; i++ ) { for ( j = 0; j < ncols; j++ ) lower[j] = p[i][j]; for ( j = 1; j < (ncols-1); j++ ) { p[i-1][j] = beta2*( (upper[j]+lower[j])*rdx2 + (middle[j+1]+middle[j-1])*rdy2 - rhs[i-1][j]); } for ( j = 0; j < ncols; j++ ) { upper[j] = middle[j]; middle[j] = lower[j]; } } }