xref: /petsc/src/mat/impls/aij/seq/inode2.c (revision e8c0849ab8fe171bed529bea27238c9b402db591)
1c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h>
24c1414c8SBarry Smith 
37087cfbeSBarry Smith extern PetscErrorCode MatInodeAdjustForInodes_SeqAIJ_Inode(Mat, IS *, IS *);
47087cfbeSBarry Smith extern PetscErrorCode MatInodeGetInodeSizes_SeqAIJ_Inode(Mat, PetscInt *, PetscInt *[], PetscInt *);
54c1414c8SBarry Smith 
MatView_SeqAIJ_Inode(Mat A,PetscViewer viewer)6d71ae5a4SJacob Faibussowitsch PetscErrorCode MatView_SeqAIJ_Inode(Mat A, PetscViewer viewer)
7d71ae5a4SJacob Faibussowitsch {
84c1414c8SBarry Smith   Mat_SeqAIJ       *a = (Mat_SeqAIJ *)A->data;
99f196a02SMartin Diehl   PetscBool         isascii;
104c1414c8SBarry Smith   PetscViewerFormat format;
114c1414c8SBarry Smith 
124c1414c8SBarry Smith   PetscFunctionBegin;
139f196a02SMartin Diehl   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
149f196a02SMartin Diehl   if (isascii) {
159566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(viewer, &format));
164c1414c8SBarry Smith     if (format == PETSC_VIEWER_ASCII_INFO_DETAIL || format == PETSC_VIEWER_ASCII_INFO) {
174d12350bSJunchao Zhang       if (a->inode.size_csr) {
189566063dSJacob 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));
194c1414c8SBarry Smith       } else {
209566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(viewer, "not using I-node routines\n"));
214c1414c8SBarry Smith       }
224c1414c8SBarry Smith     }
234c1414c8SBarry Smith   }
243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
254c1414c8SBarry Smith }
264c1414c8SBarry Smith 
MatAssemblyEnd_SeqAIJ_Inode(Mat A,MatAssemblyType mode)27d71ae5a4SJacob Faibussowitsch PetscErrorCode MatAssemblyEnd_SeqAIJ_Inode(Mat A, MatAssemblyType mode)
28d71ae5a4SJacob Faibussowitsch {
294c1414c8SBarry Smith   PetscFunctionBegin;
309566063dSJacob Faibussowitsch   PetscCall(MatSeqAIJCheckInode(A));
313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
324c1414c8SBarry Smith }
334c1414c8SBarry Smith 
MatDestroy_SeqAIJ_Inode(Mat A)34d71ae5a4SJacob Faibussowitsch PetscErrorCode MatDestroy_SeqAIJ_Inode(Mat A)
35d71ae5a4SJacob Faibussowitsch {
364c1414c8SBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
374c1414c8SBarry Smith 
384c1414c8SBarry Smith   PetscFunctionBegin;
394d12350bSJunchao Zhang   PetscCall(PetscFree(a->inode.size_csr));
409566063dSJacob Faibussowitsch   PetscCall(PetscFree3(a->inode.ibdiag, a->inode.bdiag, a->inode.ssor_work));
419566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatInodeAdjustForInodes_C", NULL));
429566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)A, "MatInodeGetInodeSizes_C", NULL));
433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
444c1414c8SBarry Smith }
454c1414c8SBarry Smith 
464108e4d5SBarry Smith /* MatCreate_SeqAIJ_Inode is not DLLEXPORTed because it is not a constructor for a complete type.    */
474c1414c8SBarry Smith /* It is also not registered as a type for use within MatSetType.                             */
48*10e18b2aSBarry Smith /* It is intended as a helper for the MATSEQAIJ class, so classes which desire inodes should  */
494c1414c8SBarry Smith /*    inherit off of MATSEQAIJ instead by calling MatSetType(MATSEQAIJ) in their constructor. */
504c1414c8SBarry Smith /* Maybe this is a bad idea. (?) */
MatCreate_SeqAIJ_Inode(Mat B)51d71ae5a4SJacob Faibussowitsch PetscErrorCode MatCreate_SeqAIJ_Inode(Mat B)
52d71ae5a4SJacob Faibussowitsch {
534c1414c8SBarry Smith   Mat_SeqAIJ *b = (Mat_SeqAIJ *)B->data;
54ace3abfcSBarry Smith   PetscBool   no_inode, no_unroll;
554c1414c8SBarry Smith 
564c1414c8SBarry Smith   PetscFunctionBegin;
57da9f3051SSatish Balay   no_inode            = PETSC_FALSE;
58da9f3051SSatish Balay   no_unroll           = PETSC_FALSE;
59ec710b6aSStefano Zampini   b->inode.checked    = PETSC_FALSE;
604c1414c8SBarry Smith   b->inode.node_count = 0;
614d12350bSJunchao Zhang   b->inode.size_csr   = NULL;
624c1414c8SBarry Smith   b->inode.limit      = 5;
634c1414c8SBarry Smith   b->inode.max_limit  = 5;
64f4259b30SLisandro Dalcin   b->inode.ibdiag     = NULL;
65f4259b30SLisandro Dalcin   b->inode.bdiag      = NULL;
664c1414c8SBarry Smith 
67d0609cedSBarry Smith   PetscOptionsBegin(PetscObjectComm((PetscObject)B), ((PetscObject)B)->prefix, "Options for SEQAIJ matrix", "Mat");
689566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-mat_no_unroll", "Do not optimize for inodes (slower)", NULL, no_unroll, &no_unroll, NULL));
6948a46eb9SPierre Jolivet   if (no_unroll) PetscCall(PetscInfo(B, "Not using Inode routines due to -mat_no_unroll\n"));
709566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-mat_no_inode", "Do not optimize for inodes -slower-", NULL, no_inode, &no_inode, NULL));
7148a46eb9SPierre Jolivet   if (no_inode) PetscCall(PetscInfo(B, "Not using Inode routines due to -mat_no_inode\n"));
72e87b5d96SPierre Jolivet   PetscCall(PetscOptionsInt("-mat_inode_limit", "Do not use inodes larger than this value", NULL, b->inode.limit, &b->inode.limit, NULL));
73d0609cedSBarry Smith   PetscOptionsEnd();
7426fbe8dcSKarl Rupp 
75ace3abfcSBarry Smith   b->inode.use = (PetscBool)(!(no_unroll || no_inode));
76d74fe821SBarry Smith   if (b->inode.limit > b->inode.max_limit) b->inode.limit = b->inode.max_limit;
77d74fe821SBarry Smith 
789566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatInodeAdjustForInodes_C", MatInodeAdjustForInodes_SeqAIJ_Inode));
799566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)B, "MatInodeGetInodeSizes_C", MatInodeGetInodeSizes_SeqAIJ_Inode));
803ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
814c1414c8SBarry Smith }
824c1414c8SBarry Smith 
MatSetOption_SeqAIJ_Inode(Mat A,MatOption op,PetscBool flg)83d71ae5a4SJacob Faibussowitsch PetscErrorCode MatSetOption_SeqAIJ_Inode(Mat A, MatOption op, PetscBool flg)
84d71ae5a4SJacob Faibussowitsch {
854c1414c8SBarry Smith   Mat_SeqAIJ *a = (Mat_SeqAIJ *)A->data;
86d74fe821SBarry Smith 
874c1414c8SBarry Smith   PetscFunctionBegin;
884c1414c8SBarry Smith   switch (op) {
89d71ae5a4SJacob Faibussowitsch   case MAT_USE_INODES:
90d71ae5a4SJacob Faibussowitsch     a->inode.use = flg;
91d71ae5a4SJacob Faibussowitsch     break;
92d71ae5a4SJacob Faibussowitsch   default:
93d71ae5a4SJacob Faibussowitsch     break;
944c1414c8SBarry Smith   }
953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
964c1414c8SBarry Smith }
97