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