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