Satish Balay <[email protected]> writes: > Perhaps the following is the fix [with proper comments, more error > checks?]. But someone more familiar with this code should check this.. > > Satish > > -------------- > $ git diff |cat > diff --git a/src/ksp/pc/impls/is/pcis.c b/src/ksp/pc/impls/is/pcis.c > index dab5836..0fa0217 100644 > --- a/src/ksp/pc/impls/is/pcis.c > +++ b/src/ksp/pc/impls/is/pcis.c > @@ -140,6 +140,8 @@ PetscErrorCode PCISSetUp(PC pc) > ierr = > PetscObjectTypeCompare((PetscObject)pc->pmat,MATIS,&flg);CHKERRQ(ierr); > if (!flg) > SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONG,"Preconditioner > type of Neumann Neumman requires matrix of type MATIS"); > matis = (Mat_IS*)pc->pmat->data; > + PetscObjectReference((PetscObject)pc->pmat); > + pcis->pmat = pc->pmat;
Uh, PCISSetUp can be called more than once?
And simply destroying the pcis->pmat reference is not enough because
that extra reference could significantly increase the peak memory usage.
The right solution is to not hold that reference and not hold the info.
> pcis->pure_neumann = matis->pure_neumann;
>
> @@ -378,8 +380,9 @@ PetscErrorCode PCISDestroy(PC pc)
> ierr = VecScatterDestroy(&pcis->global_to_B);CHKERRQ(ierr);
> ierr = PetscFree(pcis->work_N);CHKERRQ(ierr);
> if (pcis->ISLocalToGlobalMappingGetInfoWasCalled) {
> - ierr =
> ISLocalToGlobalMappingRestoreInfo((ISLocalToGlobalMapping)0,&(pcis->n_neigh),&(pcis->neigh),&(pcis->n_shared),&(pcis->shared));CHKERRQ(ierr);
> + ierr =
> ISLocalToGlobalMappingRestoreInfo(((Mat_IS*)pcis->pmat->data)->mapping,&(pcis->n_neigh),&(pcis->neigh),&(pcis->n_shared),&(pcis->shared));CHKERRQ(ierr);
> }
Why not restore the info at the place it is gotten, like we do with
every other accessor?
> + ierr = MatDestroy(&pcis->pmat);CHKERRQ(ierr);
> ierr =
> PetscObjectComposeFunction((PetscObject)pc,"PCISSetUseStiffnessScaling_C",NULL);CHKERRQ(ierr);
> ierr =
> PetscObjectComposeFunction((PetscObject)pc,"PCISSetSubdomainScalingFactor_C",NULL);CHKERRQ(ierr);
> ierr =
> PetscObjectComposeFunction((PetscObject)pc,"PCISSetSubdomainDiagonalScaling_C",NULL);CHKERRQ(ierr);
> diff --git a/src/ksp/pc/impls/is/pcis.h b/src/ksp/pc/impls/is/pcis.h
> index 4a42cf9..736ea8c 100644
> --- a/src/ksp/pc/impls/is/pcis.h
> +++ b/src/ksp/pc/impls/is/pcis.h
> @@ -73,6 +73,7 @@ typedef struct {
> /* We need:
> */
> /* proc[k].loc_to_glob(proc[k].shared[i][m]) ==
> proc[l].loc_to_glob(proc[l].shared[j][m]) */
> /* for all 0 <= m < proc[k].n_shared[i], or equiv'ly, for all 0 <= m <
> proc[l].n_shared[j] */
> + Mat pmat;
> } PC_IS;
>
> PETSC_EXTERN PetscErrorCode PCISSetUp(PC pc);
pgpP4PQxow50x.pgp
Description: PGP signature
