diff --git a/src/ksp/pc/impls/mg/mg.c b/src/ksp/pc/impls/mg/mg.c index 68aa78d972d..231272efaf8 100644 --- a/src/ksp/pc/impls/mg/mg.c +++ b/src/ksp/pc/impls/mg/mg.c @@ -1125,11 +1125,18 @@ PetscErrorCode PCSetUp_MG(PC pc) } for (i=0; ib) { - Vec *vec; - PetscCall(KSPCreateVecs(mglevels[i]->smoothd,1,&vec,0,NULL)); - PetscCall(PCMGSetRhs(pc,i,*vec)); - PetscCall(VecDestroy(vec)); - PetscCall(PetscFree(vec)); + Vec vec; + Mat restrct = mglevels[i+1]->restrct; + PetscInt m,n; + + /* + Previously this used PetscCall(KSPCreateVecs(mglevels[i]->smoothd,1,&vec,0,NULL)); but the smoothd may not be able to produce a vector + */ + PetscCall(MatGetSize(restrct,&m,&n)); + if (m > n) PetscCall(MatCreateVecs(mglevels[i+1]->restrct,&vec,NULL)); + else PetscCall(MatCreateVecs(mglevels[i+1]->restrct,NULL,&vec)); + PetscCall(PCMGSetRhs(pc,i,vec)); + PetscCall(VecDestroy(&vec)); } if (!mglevels[i]->r && i) { PetscCall(VecDuplicate(mglevels[i]->b,&tvec)); @@ -1156,7 +1163,7 @@ PetscErrorCode PCSetUp_MG(PC pc) PetscCall(PetscFree(vec)); } if (doCR) { - PetscCall(VecDuplicate(mglevels[n-1]->r, &mglevels[n-1]->crx)); + PetscCall(VecDuplicate(mglevels[n-1]->r, &mglevels[n-1]->crx)); PetscCall(VecDuplicate(mglevels[n-1]->r, &mglevels[n-1]->crb)); PetscCall(VecZeroEntries(mglevels[n-1]->crb)); }