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(((PetscObject)C)->comm,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 = PetscLogObjectDestroy((PetscObject)C);CHKERRQ(ierr); ierr = PetscFree(C);CHKERRQ(ierr); PetscFunctionReturn(0); }
/* PetscHeaderDestroy_Private - Destroys a base PETSc object header. Called by the macro PetscHeaderDestroy(). */ PetscErrorCode PetscHeaderDestroy_Private(PetscObject h) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(h,1); ierr = PetscLogObjectDestroy(h);CHKERRQ(ierr); ierr = PetscComposedQuantitiesDestroy(h);CHKERRQ(ierr); if (PetscMemoryCollectMaximumUsage) { PetscLogDouble usage; ierr = PetscMemoryGetCurrentUsage(&usage);CHKERRQ(ierr); if (usage > PetscMemoryMaximumUsage) PetscMemoryMaximumUsage = usage; } /* first destroy things that could execute arbitrary code */ if (h->python_destroy) { void *python_context = h->python_context; PetscErrorCode (*python_destroy)(void*) = h->python_destroy; h->python_context = 0; h->python_destroy = 0; ierr = (*python_destroy)(python_context);CHKERRQ(ierr); } ierr = PetscObjectDestroyOptionsHandlers(h);CHKERRQ(ierr); ierr = PetscObjectListDestroy(&h->olist);CHKERRQ(ierr); ierr = PetscCommDestroy(&h->comm);CHKERRQ(ierr); /* next destroy other things */ h->classid = PETSCFREEDHEADER; ierr = PetscFunctionListDestroy(&h->qlist);CHKERRQ(ierr); ierr = PetscFree(h->type_name);CHKERRQ(ierr); ierr = PetscFree(h->name);CHKERRQ(ierr); ierr = PetscFree(h->prefix);CHKERRQ(ierr); ierr = PetscFree(h->fortran_func_pointers);CHKERRQ(ierr); ierr = PetscFree(h->fortrancallback[PETSC_FORTRAN_CALLBACK_CLASS]);CHKERRQ(ierr); ierr = PetscFree(h->fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE]);CHKERRQ(ierr); #if defined(PETSC_USE_LOG) if (PetscObjectsLog) { PetscInt i; /* Record object removal from list of all objects */ for (i=0; i<PetscObjectsMaxCounts; i++) { if (PetscObjects[i] == h) { PetscObjects[i] = 0; PetscObjectsCounts--; break; } } if (!PetscObjectsCounts) { ierr = PetscFree(PetscObjects);CHKERRQ(ierr); PetscObjectsMaxCounts = 0; } } #endif 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); }