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 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 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 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. (?) */ 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 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