PETSC_EXTERN PetscErrorCode MatHeaderReplace(Mat A,Mat C) { PetscErrorCode ierr; PetscInt refct; PetscFunctionBegin; PetscValidHeaderSpecific(A,MAT_CLASSID,1); PetscValidHeaderSpecific(C,MAT_CLASSID,2); if (A == C) PetscFunctionReturn(0); PetscCheckSameComm(A,1,C,2); if (((PetscObject)C)->refct != 1) SETERRQ1(PetscObjectComm((PetscObject)C),PETSC_ERR_ARG_WRONGSTATE,"Object C has refct %D > 1, would leave hanging reference",((PetscObject)C)->refct); /* free all the interior data structures from mat */ ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); ierr = PetscHeaderDestroy_Private((PetscObject)A);CHKERRQ(ierr); ierr = PetscFree(A->ops);CHKERRQ(ierr); ierr = PetscLayoutDestroy(&A->rmap);CHKERRQ(ierr); ierr = PetscLayoutDestroy(&A->cmap);CHKERRQ(ierr); ierr = PetscFree(A->spptr);CHKERRQ(ierr); /* copy C over to A */ refct = ((PetscObject)A)->refct; ierr = PetscMemcpy(A,C,sizeof(struct _p_Mat));CHKERRQ(ierr); ((PetscObject)A)->refct = refct; ierr = PetscFree(C);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatHeaderReplace(Mat A,Mat C) { PetscErrorCode ierr; PetscFunctionBegin; if (A == C) PetscFunctionReturn(0); /* free all the interior data structures from mat */ ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); ierr = PetscHeaderDestroy_Private((PetscObject)A);CHKERRQ(ierr); ierr = PetscFree(A->ops);CHKERRQ(ierr); ierr = PetscLayoutDestroy(A->rmap);CHKERRQ(ierr); ierr = PetscLayoutDestroy(A->cmap);CHKERRQ(ierr); ierr = PetscFree(A->spptr);CHKERRQ(ierr); /* copy C over to A */ if (C) { ierr = PetscMemcpy(A,C,sizeof(struct _p_Mat));CHKERRQ(ierr); ierr = PetscLogObjectDestroy((PetscObject)C);CHKERRQ(ierr); ierr = PetscFree(C);CHKERRQ(ierr); } PetscFunctionReturn(0); }