#include PetscErrorCode u_exact(DM da, Vec uexact) { DMDALocalInfo info; int i, j; double hx, hy, x, y, **auexact; DMDAGetLocalInfo(da, &info); DMDAVecGetArray(da, uexact, &auexact); hx = 1.0/(info.mx-1); hy = 1.0/(info.my-1); for (j = info.ys; j<(info.ys + info.ym); j++) { y = j*hy; for (i = info.xs; i<(info.xs + info.xm); i++) { x = i*hx; auexact[j][i] = (x*x-x*x*x*x)*(y*y*y*y-y*y); } } DMDAVecRestoreArray(da, uexact, &auexact); return 0; } PetscErrorCode formMatrix(DM da, Mat A) { DMDALocalInfo info; int i, j, ncols; double v[5]; MatStencil row, col[5]; DMDAGetLocalInfo(da, &info); for (j = info.ys; j<(info.ys + info.ym); j++) { for (i = info.xs; i<(info.xs + info.xm); i++) { row.j = j; row.i = i; col[0].j = j; col[0].i = i; ncols = 1; if (i == 0 || i == info.mx - 1 || j == 0 || j == info.my-1) { v[0] = 1.0; } else { v[0] = 4; if (i-1 >0) { col[ncols].j = j; col[ncols].i = i-1; v[ncols] = -1; ncols = ncols + 1; } if (i+10) { col[ncols].j = j-1; col[ncols].i = i; v[ncols] = -1; ncols = ncols + 1; } if (j+1