PetscErrorCode MatDestroy_LUSOL(Mat A) { PetscErrorCode ierr; Mat_LUSOL *lusol=(Mat_LUSOL*)A->spptr; PetscFunctionBegin; if (lusol && lusol->CleanUpLUSOL) { ierr = PetscFree(lusol->ip);CHKERRQ(ierr); ierr = PetscFree(lusol->iq);CHKERRQ(ierr); ierr = PetscFree(lusol->lenc);CHKERRQ(ierr); ierr = PetscFree(lusol->lenr);CHKERRQ(ierr); ierr = PetscFree(lusol->locc);CHKERRQ(ierr); ierr = PetscFree(lusol->locr);CHKERRQ(ierr); ierr = PetscFree(lusol->iploc);CHKERRQ(ierr); ierr = PetscFree(lusol->iqloc);CHKERRQ(ierr); ierr = PetscFree(lusol->ipinv);CHKERRQ(ierr); ierr = PetscFree(lusol->iqinv);CHKERRQ(ierr); ierr = PetscFree(lusol->mnsw);CHKERRQ(ierr); ierr = PetscFree(lusol->mnsv);CHKERRQ(ierr); ierr = PetscFree3(lusol->data,lusol->indc,lusol->indr);CHKERRQ(ierr); } ierr = PetscFree(A->spptr);CHKERRQ(ierr); ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); PetscFunctionReturn(0); }
EXTERN_C_END #undef __FUNCT__ #define __FUNCT__ "MatDestroy_SeqCSRPERM" PetscErrorCode MatDestroy_SeqCSRPERM(Mat A) { PetscErrorCode ierr; Mat_SeqCSRPERM *csrperm = (Mat_SeqCSRPERM *) A->spptr; PetscFunctionBegin; /* Free everything in the Mat_SeqCSRPERM data structure. * Note that we don't need to free the Mat_SeqCSRPERM struct * itself, as MatDestroy() will do so. */ if(csrperm->CleanUpCSRPERM) { ierr = PetscFree(csrperm->xgroup);CHKERRQ(ierr); ierr = PetscFree(csrperm->nzgroup);CHKERRQ(ierr); ierr = PetscFree(csrperm->iperm);CHKERRQ(ierr); } /* Change the type of A back to SEQAIJ and use MatDestroy_SeqAIJ() * to destroy everything that remains. */ ierr = PetscObjectChangeTypeName( (PetscObject)A, MATSEQAIJ);CHKERRQ(ierr); /* Note that I don't call MatSetType(). I believe this is because that * is only to be called when *building* a matrix. I could be wrong, but * that is how things work for the SuperLU matrix class. */ ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatDestroy_SuperLU(Mat A) { PetscErrorCode ierr; Mat_SuperLU *lu=(Mat_SuperLU*)A->spptr; PetscFunctionBegin; if (lu && lu->CleanUpSuperLU) { /* Free the SuperLU datastructures */ Destroy_SuperMatrix_Store(&lu->A); Destroy_SuperMatrix_Store(&lu->B); Destroy_SuperMatrix_Store(&lu->X); StatFree(&lu->stat); if (lu->lwork >= 0) { Destroy_SuperNode_Matrix(&lu->L); Destroy_CompCol_Matrix(&lu->U); } } if (lu) { ierr = PetscFree(lu->etree);CHKERRQ(ierr); ierr = PetscFree(lu->perm_r);CHKERRQ(ierr); ierr = PetscFree(lu->perm_c);CHKERRQ(ierr); ierr = PetscFree(lu->R);CHKERRQ(ierr); ierr = PetscFree(lu->C);CHKERRQ(ierr); ierr = PetscFree(lu->rhs_dup);CHKERRQ(ierr); ierr = MatDestroy(&lu->A_dup);CHKERRQ(ierr); } ierr = PetscFree(A->spptr);CHKERRQ(ierr); /* clear composed functions */ ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatFactorGetSolverPackage_C","",PETSC_NULL);CHKERRQ(ierr); ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatSuperluSetILUDropTol_C","",PETSC_NULL);CHKERRQ(ierr); ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatDestroy_Essl(Mat A) { PetscErrorCode ierr; Mat_Essl *essl=(Mat_Essl*)A->spptr; PetscFunctionBegin; if (essl && essl->CleanUpESSL) { ierr = PetscFree4(essl->a,essl->aux,essl->ia,essl->ja);CHKERRQ(ierr); } ierr = PetscFree(A->spptr);CHKERRQ(ierr); ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatDestroy_SeqCRL(Mat A) { PetscErrorCode ierr; Mat_CRL *crl = (Mat_CRL *) A->spptr; /* Free everything in the Mat_CRL data structure. */ ierr = PetscFree2(crl->acols,crl->icols);CHKERRQ(ierr); ierr = PetscFree(crl);CHKERRQ(ierr); A->spptr = 0; ierr = PetscObjectChangeTypeName( (PetscObject)A, MATSEQAIJ);CHKERRQ(ierr); ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode MatDestroy_KLU(Mat A) { PetscErrorCode ierr; Mat_KLU *lu=(Mat_KLU*)A->spptr; PetscFunctionBegin; if (lu && lu->CleanUpKLU) { klu_K_free_symbolic(&lu->Symbolic,&lu->Common); klu_K_free_numeric(&lu->Numeric,&lu->Common); ierr = PetscFree2(lu->perm_r,lu->perm_c);CHKERRQ(ierr); } ierr = PetscFree(A->spptr);CHKERRQ(ierr); ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode MatDestroy_UMFPACK(Mat A) { PetscErrorCode ierr; Mat_UMFPACK *lu=(Mat_UMFPACK*)A->spptr; PetscFunctionBegin; if (lu && lu->CleanUpUMFPACK) { umfpack_UMF_free_symbolic(&lu->Symbolic); umfpack_UMF_free_numeric(&lu->Numeric); ierr = PetscFree(lu->Wi);CHKERRQ(ierr); ierr = PetscFree(lu->W);CHKERRQ(ierr); ierr = PetscFree(lu->perm_c);CHKERRQ(ierr); } ierr = MatDestroy(&lu->A);CHKERRQ(ierr); ierr = PetscFree(A->spptr);CHKERRQ(ierr); ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatDestroy_SeqAIJSpooles(Mat A) { Mat_Spooles *lu = (Mat_Spooles*)A->spptr; PetscErrorCode ierr; PetscFunctionBegin; if (lu && lu->CleanUpSpooles) { FrontMtx_free(lu->frontmtx); IV_free(lu->newToOldIV); IV_free(lu->oldToNewIV); InpMtx_free(lu->mtxA); ETree_free(lu->frontETree); IVL_free(lu->symbfacIVL); SubMtxManager_free(lu->mtxmanager); Graph_free(lu->graph); } ierr = PetscFree(A->spptr);CHKERRQ(ierr); ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode MatDestroy_SuperLU_DIST(Mat A) { PetscErrorCode ierr; Mat_SuperLU_DIST *lu = (Mat_SuperLU_DIST*)A->spptr; PetscBool flg; PetscFunctionBegin; if (lu && lu->CleanUpSuperLU_Dist) { /* Deallocate SuperLU_DIST storage */ if (lu->MatInputMode == GLOBAL) { Destroy_CompCol_Matrix_dist(&lu->A_sup); } else { Destroy_CompRowLoc_Matrix_dist(&lu->A_sup); if ( lu->options.SolveInitialized ) { #if defined(PETSC_USE_COMPLEX) zSolveFinalize(&lu->options, &lu->SOLVEstruct); #else dSolveFinalize(&lu->options, &lu->SOLVEstruct); #endif } } Destroy_LU(A->cmap->N, &lu->grid, &lu->LUstruct); ScalePermstructFree(&lu->ScalePermstruct); LUstructFree(&lu->LUstruct); /* Release the SuperLU_DIST process grid. */ superlu_gridexit(&lu->grid); ierr = MPI_Comm_free(&(lu->comm_superlu));CHKERRQ(ierr); } ierr = PetscFree(A->spptr);CHKERRQ(ierr); ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); if (flg) { ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); } else { ierr = MatDestroy_MPIAIJ(A);CHKERRQ(ierr); } PetscFunctionReturn(0); }