Actual source code: sbaijspooles.c

petsc-3.3-p7 2013-05-11
  2: /* 
  3:    Provides an interface to the Spooles serial sparse solver
  4: */

  6: #include <../src/mat/impls/aij/seq/spooles/spooles.h>

  8: extern PetscErrorCode MatDestroy_SeqSBAIJ(Mat);

 12: PetscErrorCode MatDestroy_SeqSBAIJSpooles(Mat A)
 13: {
 14:   Mat_Spooles    *lu = (Mat_Spooles*)A->spptr;

 18:   if (lu && lu->CleanUpSpooles) {
 19:     FrontMtx_free(lu->frontmtx);
 20:     IV_free(lu->newToOldIV);
 21:     IV_free(lu->oldToNewIV);
 22:     InpMtx_free(lu->mtxA);
 23:     ETree_free(lu->frontETree);
 24:     IVL_free(lu->symbfacIVL);
 25:     SubMtxManager_free(lu->mtxmanager);
 26:     Graph_free(lu->graph);
 27:   }
 28:   PetscFree(A->spptr);
 29:   MatDestroy_SeqSBAIJ(A);
 30:   return(0);
 31: }

 33: #if !defined(PETSC_USE_COMPLEX)
 34: /* 
 35:   input:
 36:    F:                 numeric factor
 37:   output:
 38:    nneg, nzero, npos: matrix inertia 
 39: */

 43: PetscErrorCode MatGetInertia_SeqSBAIJSpooles(Mat F,int *nneg,int *nzero,int *npos)
 44: {
 45:   Mat_Spooles *lu = (Mat_Spooles*)F->spptr;
 46:   int         neg,zero,pos;

 49:   FrontMtx_inertia(lu->frontmtx, &neg, &zero, &pos);
 50:   if(nneg)  *nneg  = neg;
 51:   if(nzero) *nzero = zero;
 52:   if(npos)  *npos  = pos;
 53:   return(0);
 54: }
 55: #endif /* !defined(PETSC_USE_COMPLEX) */

 57: /* Note the Petsc r permutation is ignored */
 60: PetscErrorCode MatCholeskyFactorSymbolic_SeqSBAIJSpooles(Mat B,Mat A,IS r,const MatFactorInfo *info)
 61: {
 63:   B->ops->choleskyfactornumeric  = MatFactorNumeric_SeqSpooles;
 64: #if !defined(PETSC_USE_COMPLEX)
 65:   B->ops->getinertia             = MatGetInertia_SeqSBAIJSpooles;
 66: #endif

 68:   return(0);
 69: }

 71: EXTERN_C_BEGIN
 74: PetscErrorCode MatFactorGetSolverPackage_seqsbaij_spooles(Mat A,const MatSolverPackage *type)
 75: {
 77:   *type = MATSOLVERSPOOLES;
 78:   return(0);
 79: }
 80: EXTERN_C_END

 82: EXTERN_C_BEGIN
 85: PetscErrorCode MatGetFactor_seqsbaij_spooles(Mat A,MatFactorType ftype,Mat *F)
 86: {
 87:   Mat            B;
 89:   Mat_Spooles    *lu;

 92:   if (ftype != MAT_FACTOR_CHOLESKY) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only Cholesky factorization is support for Spooles from SBAIJ matrix");
 93:   MatCreate(((PetscObject)A)->comm,&B);
 94:   MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);
 95:   MatSetType(B,((PetscObject)A)->type_name);
 96:   MatSeqSBAIJSetPreallocation(B,1,PETSC_NULL,PETSC_NULL);
 97:   PetscNewLog(B,Mat_Spooles,&lu);
 98:   B->spptr = lu;
 99:   lu->options.pivotingflag  = SPOOLES_NO_PIVOTING;
100:   lu->options.symflag       = SPOOLES_SYMMETRIC;   /* default */
101:   lu->flg                   = DIFFERENT_NONZERO_PATTERN;
102:   lu->options.useQR         = PETSC_FALSE;

104:   B->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqSBAIJSpooles;
105:   B->ops->destroy                = MatDestroy_SeqSBAIJSpooles;
106:   PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_seqsbaij_spooles",MatFactorGetSolverPackage_seqsbaij_spooles);
107:   B->factortype                  = ftype;
108:   *F = B;
109:   return(0);
110: }
111: EXTERN_C_END