Actual source code: inode2.c


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

  4: extern PetscErrorCode MatInodeAdjustForInodes_SeqAIJ_Inode(Mat,IS*,IS*);
  5: extern PetscErrorCode MatInodeGetInodeSizes_SeqAIJ_Inode(Mat,PetscInt*,PetscInt*[],PetscInt*);

  7: PetscErrorCode MatView_SeqAIJ_Inode(Mat A,PetscViewer viewer)
  8: {
  9:   Mat_SeqAIJ        *a=(Mat_SeqAIJ*)A->data;
 10:   PetscBool         iascii;
 11:   PetscViewerFormat format;

 13:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
 14:   if (iascii) {
 15:     PetscViewerGetFormat(viewer,&format);
 16:     if (format == PETSC_VIEWER_ASCII_INFO_DETAIL || format == PETSC_VIEWER_ASCII_INFO) {
 17:       if (a->inode.size) {
 18:         PetscViewerASCIIPrintf(viewer,"using I-node routines: found %" PetscInt_FMT " nodes, limit used is %" PetscInt_FMT "\n",a->inode.node_count,a->inode.limit);
 19:       } else {
 20:         PetscViewerASCIIPrintf(viewer,"not using I-node routines\n");
 21:       }
 22:     }
 23:   }
 24:   return 0;
 25: }

 27: PetscErrorCode MatAssemblyEnd_SeqAIJ_Inode(Mat A, MatAssemblyType mode)
 28: {
 29:   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;

 31:   MatSeqAIJCheckInode(A);
 32:   a->inode.ibdiagvalid = PETSC_FALSE;
 33:   return 0;
 34: }

 36: PetscErrorCode MatDestroy_SeqAIJ_Inode(Mat A)
 37: {
 38:   Mat_SeqAIJ     *a=(Mat_SeqAIJ*)A->data;

 40:   PetscFree(a->inode.size);
 41:   PetscFree3(a->inode.ibdiag,a->inode.bdiag,a->inode.ssor_work);
 42:   PetscObjectComposeFunction((PetscObject)A,"MatInodeAdjustForInodes_C",NULL);
 43:   PetscObjectComposeFunction((PetscObject)A,"MatInodeGetInodeSizes_C",NULL);
 44:   return 0;
 45: }

 47: /* MatCreate_SeqAIJ_Inode is not DLLEXPORTed because it is not a constructor for a complete type.    */
 48: /* It is also not registered as a type for use within MatSetType.                             */
 49: /* It is intended as a helper for the MATSEQAIJ class, so classes which desire Inodes should  */
 50: /*    inherit off of MATSEQAIJ instead by calling MatSetType(MATSEQAIJ) in their constructor. */
 51: /* Maybe this is a bad idea. (?) */
 52: PetscErrorCode MatCreate_SeqAIJ_Inode(Mat B)
 53: {
 54:   Mat_SeqAIJ     *b=(Mat_SeqAIJ*)B->data;
 56:   PetscBool      no_inode,no_unroll;

 58:   no_inode             = PETSC_FALSE;
 59:   no_unroll            = PETSC_FALSE;
 60:   b->inode.checked     = PETSC_FALSE;
 61:   b->inode.node_count  = 0;
 62:   b->inode.size        = NULL;
 63:   b->inode.limit       = 5;
 64:   b->inode.max_limit   = 5;
 65:   b->inode.ibdiagvalid = PETSC_FALSE;
 66:   b->inode.ibdiag      = NULL;
 67:   b->inode.bdiag       = NULL;

 69:   PetscOptionsBegin(PetscObjectComm((PetscObject)B),((PetscObject)B)->prefix,"Options for SEQAIJ matrix","Mat");
 70:   PetscOptionsBool("-mat_no_unroll","Do not optimize for inodes (slower)",NULL,no_unroll,&no_unroll,NULL);
 71:   if (no_unroll) {
 72:     PetscInfo(B,"Not using Inode routines due to -mat_no_unroll\n");
 73:   }
 74:   PetscOptionsBool("-mat_no_inode","Do not optimize for inodes -slower-",NULL,no_inode,&no_inode,NULL);
 75:   if (no_inode) {
 76:     PetscInfo(B,"Not using Inode routines due to -mat_no_inode\n");
 77:   }
 78:   PetscOptionsInt("-mat_inode_limit","Do not use inodes larger then this value",NULL,b->inode.limit,&b->inode.limit,NULL);
 79:   PetscOptionsEnd();

 81:   b->inode.use = (PetscBool)(!(no_unroll || no_inode));
 82:   if (b->inode.limit > b->inode.max_limit) b->inode.limit = b->inode.max_limit;

 84:   PetscObjectComposeFunction((PetscObject)B,"MatInodeAdjustForInodes_C",MatInodeAdjustForInodes_SeqAIJ_Inode);
 85:   PetscObjectComposeFunction((PetscObject)B,"MatInodeGetInodeSizes_C",MatInodeGetInodeSizes_SeqAIJ_Inode);
 86:   return 0;
 87: }

 89: PetscErrorCode MatSetOption_SeqAIJ_Inode(Mat A,MatOption op,PetscBool flg)
 90: {
 91:   Mat_SeqAIJ *a=(Mat_SeqAIJ*)A->data;

 93:   switch (op) {
 94:   case MAT_USE_INODES:
 95:     a->inode.use = flg;
 96:     break;
 97:   default:
 98:     break;
 99:   }
100:   return 0;
101: }