static char help[] = "Parallel vector layout.\n\n"; #include #include #include #include DM da_sc; KSP ksp; PetscErrorCode ierr; struct UserContext { Vec rhs; }; int N = 10; #undef __FUNCT__ #define __FUNCT__ "ComputeRHS" PetscErrorCode ComputeRHS(KSP ksp, Vec b, void *ctx) { UserContext* user = (UserContext*) ctx; DM da; PetscInt mx, my; PetscScalar Hx, Hy; ierr = KSPGetDM(ksp,&da);CHKERRQ(ierr); ierr = DMDAGetInfo(da, 0, &mx, &my, 0,0,0,0,0,0,0,0,0,0);CHKERRQ(ierr); Hx = 1. / (PetscReal) (mx); Hy = 1. / (PetscReal) (my); ierr = VecScale(user->rhs, Hx * Hy); CHKERRQ(ierr); ierr = VecCopy(user->rhs, b); CHKERRQ(ierr); MatNullSpace nullspace; ierr = MatNullSpaceCreate(PETSC_COMM_WORLD,PETSC_TRUE,0,0,&nullspace); CHKERRQ(ierr); ierr = MatNullSpaceRemove(nullspace, b); CHKERRQ(ierr); ierr = MatNullSpaceDestroy(&nullspace); CHKERRQ(ierr); ierr = VecAssemblyBegin(b);CHKERRQ(ierr); ierr = VecAssemblyEnd(b);CHKERRQ(ierr); return 0; } #undef __FUNCT__ #define __FUNCT__ "ComputeMatrix" PetscErrorCode ComputeMatrix(KSP ksp, Mat J, Mat jac, void *ctx) { PetscInt mx, my, xm, ym, xs, ys; PetscScalar Hx, Hy; DM da; MatStencil row; PetscScalar HydHx, HxdHy; PetscScalar v_c; PetscInt ncols; ierr = KSPGetDM(ksp, &da);CHKERRQ(ierr); ierr = DMDAGetInfo(da, 0, &mx, &my, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); CHKERRQ(ierr); Hx = 1. / (PetscReal) (mx); Hy = 1. / (PetscReal) (my); ierr = MatSetOption(jac, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE); CHKERRQ(ierr); // ierr = MatSetOption(jac, MAT_SYMMETRIC, PETSC_TRUE); CHKERRQ(ierr); HxdHy = Hx/Hy; HydHx = Hy/Hx; ierr = DMDAGetCorners(da, &xs, &ys, 0, &xm, &ym, 0); CHKERRQ(ierr); PetscScalar v[5]; int k = 0; for (int j=ys; j