xref: /petsc/src/mat/impls/aij/seq/inode2.c (revision 609bdbee21ea3be08735c64dbe00a9ab27759925)
1 
2 #include <../src/mat/impls/aij/seq/aij.h>
3 
4 extern PetscErrorCode MatSeqAIJCheckInode(Mat);
5 extern PetscErrorCode MatInodeAdjustForInodes_SeqAIJ_Inode(Mat,IS*,IS*);
6 extern PetscErrorCode MatInodeGetInodeSizes_SeqAIJ_Inode(Mat,PetscInt*,PetscInt*[],PetscInt*);
7 
8 PetscErrorCode MatView_SeqAIJ_Inode(Mat A,PetscViewer viewer)
9 {
10   Mat_SeqAIJ        *a=(Mat_SeqAIJ*)A->data;
11   PetscErrorCode    ierr;
12   PetscBool         iascii;
13   PetscViewerFormat format;
14 
15   PetscFunctionBegin;
16   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
17   if (iascii) {
18     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
19     if (format == PETSC_VIEWER_ASCII_INFO_DETAIL || format == PETSC_VIEWER_ASCII_INFO) {
20       if (a->inode.size) {
21         ierr = PetscViewerASCIIPrintf(viewer,"using I-node routines: found %D nodes, limit used is %D\n",a->inode.node_count,a->inode.limit);CHKERRQ(ierr);
22       } else {
23         ierr = PetscViewerASCIIPrintf(viewer,"not using I-node routines\n");CHKERRQ(ierr);
24       }
25     }
26   }
27   PetscFunctionReturn(0);
28 }
29 
30 PetscErrorCode MatAssemblyEnd_SeqAIJ_Inode(Mat A, MatAssemblyType mode)
31 {
32   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
33   PetscErrorCode ierr;
34 
35   PetscFunctionBegin;
36   ierr = MatSeqAIJCheckInode(A);CHKERRQ(ierr);
37   a->inode.ibdiagvalid = PETSC_FALSE;
38   PetscFunctionReturn(0);
39 }
40 
41 PetscErrorCode MatDestroy_SeqAIJ_Inode(Mat A)
42 {
43   PetscErrorCode ierr;
44   Mat_SeqAIJ     *a=(Mat_SeqAIJ*)A->data;
45 
46   PetscFunctionBegin;
47   ierr = PetscFree(a->inode.size);CHKERRQ(ierr);
48   ierr = PetscFree3(a->inode.ibdiag,a->inode.bdiag,a->inode.ssor_work);CHKERRQ(ierr);
49   ierr = PetscObjectComposeFunction((PetscObject)A,"MatInodeAdjustForInodes_C",NULL);CHKERRQ(ierr);
50   ierr = PetscObjectComposeFunction((PetscObject)A,"MatInodeGetInodeSizes_C",NULL);CHKERRQ(ierr);
51   PetscFunctionReturn(0);
52 }
53 
54 /* MatCreate_SeqAIJ_Inode is not DLLEXPORTed because it is not a constructor for a complete type.    */
55 /* It is also not registered as a type for use within MatSetType.                             */
56 /* It is intended as a helper for the MATSEQAIJ class, so classes which desire Inodes should  */
57 /*    inherit off of MATSEQAIJ instead by calling MatSetType(MATSEQAIJ) in their constructor. */
58 /* Maybe this is a bad idea. (?) */
59 PetscErrorCode MatCreate_SeqAIJ_Inode(Mat B)
60 {
61   Mat_SeqAIJ     *b=(Mat_SeqAIJ*)B->data;
62   PetscErrorCode ierr;
63   PetscBool      no_inode,no_unroll;
64 
65   PetscFunctionBegin;
66   no_inode             = PETSC_FALSE;
67   no_unroll            = PETSC_FALSE;
68   b->inode.node_count  = 0;
69   b->inode.size        = 0;
70   b->inode.limit       = 5;
71   b->inode.max_limit   = 5;
72   b->inode.ibdiagvalid = PETSC_FALSE;
73   b->inode.ibdiag      = 0;
74   b->inode.bdiag       = 0;
75 
76   ierr = PetscOptionsBegin(PetscObjectComm((PetscObject)B),((PetscObject)B)->prefix,"Options for SEQAIJ matrix","Mat");CHKERRQ(ierr);
77   ierr = PetscOptionsBool("-mat_no_unroll","Do not optimize for inodes (slower)",NULL,no_unroll,&no_unroll,NULL);CHKERRQ(ierr);
78   if (no_unroll) {
79     ierr = PetscInfo(B,"Not using Inode routines due to -mat_no_unroll\n");CHKERRQ(ierr);
80   }
81   ierr = PetscOptionsBool("-mat_no_inode","Do not optimize for inodes -slower-",NULL,no_inode,&no_inode,NULL);CHKERRQ(ierr);
82   if (no_inode) {
83     ierr = PetscInfo(B,"Not using Inode routines due to -mat_no_inode\n");CHKERRQ(ierr);
84   }
85   ierr = PetscOptionsInt("-mat_inode_limit","Do not use inodes larger then this value",NULL,b->inode.limit,&b->inode.limit,NULL);CHKERRQ(ierr);
86   ierr = PetscOptionsEnd();CHKERRQ(ierr);
87 
88   b->inode.use = (PetscBool)(!(no_unroll || no_inode));
89   if (b->inode.limit > b->inode.max_limit) b->inode.limit = b->inode.max_limit;
90 
91   ierr = PetscObjectComposeFunction((PetscObject)B,"MatInodeAdjustForInodes_C",MatInodeAdjustForInodes_SeqAIJ_Inode);CHKERRQ(ierr);
92   ierr = PetscObjectComposeFunction((PetscObject)B,"MatInodeGetInodeSizes_C",MatInodeGetInodeSizes_SeqAIJ_Inode);CHKERRQ(ierr);
93   PetscFunctionReturn(0);
94 }
95 
96 PetscErrorCode MatSetOption_SeqAIJ_Inode(Mat A,MatOption op,PetscBool flg)
97 {
98   Mat_SeqAIJ *a=(Mat_SeqAIJ*)A->data;
99 
100   PetscFunctionBegin;
101   switch (op) {
102   case MAT_USE_INODES:
103     a->inode.use = flg;
104     break;
105   default:
106     break;
107   }
108   PetscFunctionReturn(0);
109 }
110 
111 
112 
113 
114 
115