xref: /petsc/src/mat/impls/aij/seq/inode2.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
17d0a6c19SBarry Smith 
2c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h>
34c1414c8SBarry Smith 
47087cfbeSBarry Smith extern PetscErrorCode MatInodeAdjustForInodes_SeqAIJ_Inode(Mat, IS *, IS *);
57087cfbeSBarry Smith extern PetscErrorCode MatInodeGetInodeSizes_SeqAIJ_Inode(Mat, PetscInt *, PetscInt *[], PetscInt *);
64c1414c8SBarry Smith 
7d71ae5a4SJacob Faibussowitsch PetscErrorCode MatView_SeqAIJ_Inode(Mat A, PetscViewer viewer)
8d71ae5a4SJacob Faibussowitsch {
94c1414c8SBarry Smith   Mat_SeqAIJ       *a = (Mat_SeqAIJ *)A->data;
10ace3abfcSBarry Smith   PetscBool         iascii;
114c1414c8SBarry Smith   PetscViewerFormat format;
124c1414c8SBarry Smith 
134c1414c8SBarry Smith   PetscFunctionBegin;
149566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
154c1414c8SBarry Smith   if (iascii) {
169566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(viewer, &format));
174c1414c8SBarry Smith     if (format == PETSC_VIEWER_ASCII_INFO_DETAIL || format == PETSC_VIEWER_ASCII_INFO) {
184c1414c8SBarry Smith       if (a->inode.size) {
199566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(viewer, "using I-node routines: found %" PetscInt_FMT " nodes, limit used is %" PetscInt_FMT "\n", a->inode.node_count, a->inode.limit));
204c1414c8SBarry Smith       } else {
219566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(viewer, "not using I-node routines\n"));
224c1414c8SBarry Smith       }
234c1414c8SBarry Smith     }
244c1414c8SBarry Smith   }
25*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
264c1414c8SBarry Smith }
274c1414c8SBarry Smith 
28d71ae5a4SJacob Faibussowitsch PetscErrorCode MatAssemblyEnd_SeqAIJ_Inode(Mat A, MatAssemblyType mode)
29d71ae5a4SJacob Faibussowitsch {
3071f1c65dSBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
314c1414c8SBarry Smith 
324c1414c8SBarry Smith   PetscFunctionBegin;
339566063dSJacob Faibussowitsch   PetscCall(MatSeqAIJCheckInode(A));
3471f1c65dSBarry Smith   a->inode.ibdiagvalid = PETSC_FALSE;
35*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
364c1414c8SBarry Smith }
374c1414c8SBarry Smith 
38d71ae5a4SJacob Faibussowitsch PetscErrorCode MatDestroy_SeqAIJ_Inode(Mat A)
39d71ae5a4SJacob Faibussowitsch {
404c1414c8SBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
414c1414c8SBarry Smith 
424c1414c8SBarry Smith   PetscFunctionBegin;
439566063dSJacob Faibussowitsch   PetscCall(PetscFree(a->inode.size));
449566063dSJacob Faibussowitsch   PetscCall(PetscFree3(a->inode.ibdiag, a->inode.bdiag, a->inode.ssor_work));
459566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatInodeAdjustForInodes_C", NULL));
469566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatInodeGetInodeSizes_C", NULL));
47*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
484c1414c8SBarry Smith }
494c1414c8SBarry Smith 
504108e4d5SBarry Smith /* MatCreate_SeqAIJ_Inode is not DLLEXPORTed because it is not a constructor for a complete type.    */
514c1414c8SBarry Smith /* It is also not registered as a type for use within MatSetType.                             */
524c1414c8SBarry Smith /* It is intended as a helper for the MATSEQAIJ class, so classes which desire Inodes should  */
534c1414c8SBarry Smith /*    inherit off of MATSEQAIJ instead by calling MatSetType(MATSEQAIJ) in their constructor. */
544c1414c8SBarry Smith /* Maybe this is a bad idea. (?) */
55d71ae5a4SJacob Faibussowitsch PetscErrorCode MatCreate_SeqAIJ_Inode(Mat B)
56d71ae5a4SJacob Faibussowitsch {
574c1414c8SBarry Smith   Mat_SeqAIJ *b = (Mat_SeqAIJ *)B->data;
58ace3abfcSBarry Smith   PetscBool   no_inode, no_unroll;
594c1414c8SBarry Smith 
604c1414c8SBarry Smith   PetscFunctionBegin;
61da9f3051SSatish Balay   no_inode             = PETSC_FALSE;
62da9f3051SSatish Balay   no_unroll            = PETSC_FALSE;
63ec710b6aSStefano Zampini   b->inode.checked     = PETSC_FALSE;
644c1414c8SBarry Smith   b->inode.node_count  = 0;
65f4259b30SLisandro Dalcin   b->inode.size        = NULL;
664c1414c8SBarry Smith   b->inode.limit       = 5;
674c1414c8SBarry Smith   b->inode.max_limit   = 5;
6871f1c65dSBarry Smith   b->inode.ibdiagvalid = PETSC_FALSE;
69f4259b30SLisandro Dalcin   b->inode.ibdiag      = NULL;
70f4259b30SLisandro Dalcin   b->inode.bdiag       = NULL;
714c1414c8SBarry Smith 
72d0609cedSBarry Smith   PetscOptionsBegin(PetscObjectComm((PetscObject)B), ((PetscObject)B)->prefix, "Options for SEQAIJ matrix", "Mat");
739566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-mat_no_unroll", "Do not optimize for inodes (slower)", NULL, no_unroll, &no_unroll, NULL));
7448a46eb9SPierre Jolivet   if (no_unroll) PetscCall(PetscInfo(B, "Not using Inode routines due to -mat_no_unroll\n"));
759566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-mat_no_inode", "Do not optimize for inodes -slower-", NULL, no_inode, &no_inode, NULL));
7648a46eb9SPierre Jolivet   if (no_inode) PetscCall(PetscInfo(B, "Not using Inode routines due to -mat_no_inode\n"));
779566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-mat_inode_limit", "Do not use inodes larger then this value", NULL, b->inode.limit, &b->inode.limit, NULL));
78d0609cedSBarry Smith   PetscOptionsEnd();
7926fbe8dcSKarl Rupp 
80ace3abfcSBarry Smith   b->inode.use = (PetscBool)(!(no_unroll || no_inode));
81d74fe821SBarry Smith   if (b->inode.limit > b->inode.max_limit) b->inode.limit = b->inode.max_limit;
82d74fe821SBarry Smith 
839566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatInodeAdjustForInodes_C", MatInodeAdjustForInodes_SeqAIJ_Inode));
849566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatInodeGetInodeSizes_C", MatInodeGetInodeSizes_SeqAIJ_Inode));
85*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
864c1414c8SBarry Smith }
874c1414c8SBarry Smith 
88d71ae5a4SJacob Faibussowitsch PetscErrorCode MatSetOption_SeqAIJ_Inode(Mat A, MatOption op, PetscBool flg)
89d71ae5a4SJacob Faibussowitsch {
904c1414c8SBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
91d74fe821SBarry Smith 
924c1414c8SBarry Smith   PetscFunctionBegin;
934c1414c8SBarry Smith   switch (op) {
94d71ae5a4SJacob Faibussowitsch   case MAT_USE_INODES:
95d71ae5a4SJacob Faibussowitsch     a->inode.use = flg;
96d71ae5a4SJacob Faibussowitsch     break;
97d71ae5a4SJacob Faibussowitsch   default:
98d71ae5a4SJacob Faibussowitsch     break;
994c1414c8SBarry Smith   }
100*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1014c1414c8SBarry Smith }
102