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: PetscFunctionBegin;
14: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
15: if (iascii) {
16: PetscCall(PetscViewerGetFormat(viewer, &format));
17: if (format == PETSC_VIEWER_ASCII_INFO_DETAIL || format == PETSC_VIEWER_ASCII_INFO) {
18: if (a->inode.size) {
19: PetscCall(PetscViewerASCIIPrintf(viewer, "using I-node routines: found %" PetscInt_FMT " nodes, limit used is %" PetscInt_FMT "\n", a->inode.node_count, a->inode.limit));
20: } else {
21: PetscCall(PetscViewerASCIIPrintf(viewer, "not using I-node routines\n"));
22: }
23: }
24: }
25: PetscFunctionReturn(PETSC_SUCCESS);
26: }
28: PetscErrorCode MatAssemblyEnd_SeqAIJ_Inode(Mat A, MatAssemblyType mode)
29: {
30: Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
32: PetscFunctionBegin;
33: PetscCall(MatSeqAIJCheckInode(A));
34: a->inode.ibdiagvalid = PETSC_FALSE;
35: PetscFunctionReturn(PETSC_SUCCESS);
36: }
38: PetscErrorCode MatDestroy_SeqAIJ_Inode(Mat A)
39: {
40: Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
42: PetscFunctionBegin;
43: PetscCall(PetscFree(a->inode.size));
44: PetscCall(PetscFree3(a->inode.ibdiag, a->inode.bdiag, a->inode.ssor_work));
45: PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatInodeAdjustForInodes_C", NULL));
46: PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatInodeGetInodeSizes_C", NULL));
47: PetscFunctionReturn(PETSC_SUCCESS);
48: }
50: /* MatCreate_SeqAIJ_Inode is not DLLEXPORTed because it is not a constructor for a complete type. */
51: /* It is also not registered as a type for use within MatSetType. */
52: /* It is intended as a helper for the MATSEQAIJ class, so classes which desire Inodes should */
53: /* inherit off of MATSEQAIJ instead by calling MatSetType(MATSEQAIJ) in their constructor. */
54: /* Maybe this is a bad idea. (?) */
55: PetscErrorCode MatCreate_SeqAIJ_Inode(Mat B)
56: {
57: Mat_SeqAIJ *b = (Mat_SeqAIJ *)B->data;
58: PetscBool no_inode, no_unroll;
60: PetscFunctionBegin;
61: no_inode = PETSC_FALSE;
62: no_unroll = PETSC_FALSE;
63: b->inode.checked = PETSC_FALSE;
64: b->inode.node_count = 0;
65: b->inode.size = NULL;
66: b->inode.limit = 5;
67: b->inode.max_limit = 5;
68: b->inode.ibdiagvalid = PETSC_FALSE;
69: b->inode.ibdiag = NULL;
70: b->inode.bdiag = NULL;
72: PetscOptionsBegin(PetscObjectComm((PetscObject)B), ((PetscObject)B)->prefix, "Options for SEQAIJ matrix", "Mat");
73: PetscCall(PetscOptionsBool("-mat_no_unroll", "Do not optimize for inodes (slower)", NULL, no_unroll, &no_unroll, NULL));
74: if (no_unroll) PetscCall(PetscInfo(B, "Not using Inode routines due to -mat_no_unroll\n"));
75: PetscCall(PetscOptionsBool("-mat_no_inode", "Do not optimize for inodes -slower-", NULL, no_inode, &no_inode, NULL));
76: if (no_inode) PetscCall(PetscInfo(B, "Not using Inode routines due to -mat_no_inode\n"));
77: PetscCall(PetscOptionsInt("-mat_inode_limit", "Do not use inodes larger then this value", NULL, b->inode.limit, &b->inode.limit, NULL));
78: PetscOptionsEnd();
80: b->inode.use = (PetscBool)(!(no_unroll || no_inode));
81: if (b->inode.limit > b->inode.max_limit) b->inode.limit = b->inode.max_limit;
83: PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatInodeAdjustForInodes_C", MatInodeAdjustForInodes_SeqAIJ_Inode));
84: PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatInodeGetInodeSizes_C", MatInodeGetInodeSizes_SeqAIJ_Inode));
85: PetscFunctionReturn(PETSC_SUCCESS);
86: }
88: PetscErrorCode MatSetOption_SeqAIJ_Inode(Mat A, MatOption op, PetscBool flg)
89: {
90: Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
92: PetscFunctionBegin;
93: switch (op) {
94: case MAT_USE_INODES:
95: a->inode.use = flg;
96: break;
97: default:
98: break;
99: }
100: PetscFunctionReturn(PETSC_SUCCESS);
101: }