PetscErrorCode MatHeaderCopy(Mat A,Mat C) { PetscErrorCode ierr; PetscInt refct; PetscOps *Abops; MatOps Aops; char *mtype,*mname; void *spptr; PetscFunctionBegin; /* save the parts of A we need */ Abops = ((PetscObject)A)->bops; Aops = A->ops; refct = ((PetscObject)A)->refct; mtype = ((PetscObject)A)->type_name; mname = ((PetscObject)A)->name; spptr = A->spptr; /* zero these so the destroy below does not free them */ ((PetscObject)A)->type_name = 0; ((PetscObject)A)->name = 0; /* free all the interior data structures from mat */ ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); ierr = PetscFree(C->spptr);CHKERRQ(ierr); ierr = PetscLayoutDestroy(A->rmap);CHKERRQ(ierr); ierr = PetscLayoutDestroy(A->cmap);CHKERRQ(ierr); ierr = PetscFListDestroy(&((PetscObject)A)->qlist);CHKERRQ(ierr); ierr = PetscOListDestroy(((PetscObject)A)->olist);CHKERRQ(ierr); /* copy C over to A */ ierr = PetscMemcpy(A,C,sizeof(struct _p_Mat));CHKERRQ(ierr); /* return the parts of A we saved */ ((PetscObject)A)->bops = Abops; A->ops = Aops; ((PetscObject)A)->refct = refct; ((PetscObject)A)->type_name = mtype; ((PetscObject)A)->name = mname; A->spptr = spptr; /* since these two are copied into A we do not want them destroyed in C */ ((PetscObject)C)->qlist = 0; ((PetscObject)C)->olist = 0; ierr = PetscHeaderDestroy(C);CHKERRQ(ierr); PetscFunctionReturn(0); }
/* PetscHeaderDestroy_Private - Destroys a base PETSc object header. Called by the macro PetscHeaderDestroy(). */ PetscErrorCode PETSC_DLLEXPORT PetscHeaderDestroy_Private(PetscObject h) { PetscErrorCode ierr; PetscFunctionBegin; 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 = PetscOListDestroy(h->olist);CHKERRQ(ierr); ierr = PetscCommDestroy(&h->comm);CHKERRQ(ierr); /* next destroy other things */ h->cookie = PETSCFREEDHEADER; ierr = PetscFree(h->bops);CHKERRQ(ierr); ierr = PetscFListDestroy(&h->qlist);CHKERRQ(ierr); ierr = PetscStrfree(h->type_name);CHKERRQ(ierr); ierr = PetscStrfree(h->name);CHKERRQ(ierr); ierr = PetscStrfree(h->prefix);CHKERRQ(ierr); ierr = PetscFree(h->fortran_func_pointers);CHKERRQ(ierr); ierr = PetscFree(h->intcomposeddata);CHKERRQ(ierr); ierr = PetscFree(h->intcomposedstate);CHKERRQ(ierr); ierr = PetscFree(h->realcomposeddata);CHKERRQ(ierr); ierr = PetscFree(h->realcomposedstate);CHKERRQ(ierr); ierr = PetscFree(h->scalarcomposeddata);CHKERRQ(ierr); ierr = PetscFree(h->scalarcomposedstate);CHKERRQ(ierr); PetscFunctionReturn(0); }