diff --git a/src/ksp/pc/interface/precon.c b/src/ksp/pc/interface/precon.c index 4c408e1..853d461 100644 --- a/src/ksp/pc/interface/precon.c +++ b/src/ksp/pc/interface/precon.c @@ -425,6 +425,7 @@ PetscErrorCode PCCreate(MPI_Comm comm,PC *newpc) PetscErrorCode PCApply(PC pc,Vec x,Vec y) { PetscErrorCode ierr; + PetscInt m,n,mv,nv; PetscFunctionBegin; PetscValidHeaderSpecific(pc,PC_CLASSID,1); @@ -432,6 +433,12 @@ PetscErrorCode PCApply(PC pc,Vec x,Vec y) PetscValidHeaderSpecific(y,VEC_CLASSID,3); if (x == y) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_IDN,"x and y must be different vectors"); ierr = VecValidValues(x,2,PETSC_TRUE);CHKERRQ(ierr); + ierr = MatGetLocalSize(pc->mat,&m,&n);CHKERRQ(ierr); + ierr = VecGetLocalSize(x,&nv);CHKERRQ(ierr); + ierr = VecGetLocalSize(y,&mv);CHKERRQ(ierr); + if (mv != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Preconditioner number of local rows %D does not equal resulting vector number of rows %D",m,mv);CHKERRQ(ierr); + if (nv != n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Preconditioner number of local columns %D does not equal resulting vector number of rows %D",n,nv);CHKERRQ(ierr); + if (pc->setupcalled < 2) { ierr = PCSetUp(pc);CHKERRQ(ierr); }