17d0a6c19SBarry Smith 2c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h> 34c1414c8SBarry Smith 4*a02bda8eSBarry Smith extern PetscErrorCode MatSeqAIJCheckInode(Mat); 57087cfbeSBarry Smith extern PetscErrorCode MatInodeAdjustForInodes_SeqAIJ_Inode(Mat,IS*,IS*); 67087cfbeSBarry Smith extern PetscErrorCode MatInodeGetInodeSizes_SeqAIJ_Inode(Mat,PetscInt*,PetscInt*[],PetscInt*); 74c1414c8SBarry Smith 84c1414c8SBarry Smith #undef __FUNCT__ 94108e4d5SBarry Smith #define __FUNCT__ "MatView_SeqAIJ_Inode" 104108e4d5SBarry Smith PetscErrorCode MatView_SeqAIJ_Inode(Mat A,PetscViewer viewer) 114c1414c8SBarry Smith { 124c1414c8SBarry Smith Mat_SeqAIJ *a=(Mat_SeqAIJ*)A->data; 134c1414c8SBarry Smith PetscErrorCode ierr; 14ace3abfcSBarry Smith PetscBool iascii; 154c1414c8SBarry Smith PetscViewerFormat format; 164c1414c8SBarry Smith 174c1414c8SBarry Smith PetscFunctionBegin; 18251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 194c1414c8SBarry Smith if (iascii) { 204c1414c8SBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 214c1414c8SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO_DETAIL || format == PETSC_VIEWER_ASCII_INFO) { 224c1414c8SBarry Smith if (a->inode.size) { 234c1414c8SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"using I-node routines: found %D nodes, limit used is %D\n", 244c1414c8SBarry Smith a->inode.node_count,a->inode.limit);CHKERRQ(ierr); 254c1414c8SBarry Smith } else { 264c1414c8SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"not using I-node routines\n");CHKERRQ(ierr); 274c1414c8SBarry Smith } 284c1414c8SBarry Smith } 294c1414c8SBarry Smith } 304c1414c8SBarry Smith PetscFunctionReturn(0); 314c1414c8SBarry Smith } 324c1414c8SBarry Smith 334c1414c8SBarry Smith #undef __FUNCT__ 344108e4d5SBarry Smith #define __FUNCT__ "MatAssemblyEnd_SeqAIJ_Inode" 354108e4d5SBarry Smith PetscErrorCode MatAssemblyEnd_SeqAIJ_Inode(Mat A, MatAssemblyType mode) 364c1414c8SBarry Smith { 3771f1c65dSBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 384c1414c8SBarry Smith PetscErrorCode ierr; 394c1414c8SBarry Smith 404c1414c8SBarry Smith PetscFunctionBegin; 41*a02bda8eSBarry Smith ierr = MatSeqAIJCheckInode(A);CHKERRQ(ierr); 4271f1c65dSBarry Smith a->inode.ibdiagvalid = PETSC_FALSE; 434c1414c8SBarry Smith PetscFunctionReturn(0); 444c1414c8SBarry Smith } 454c1414c8SBarry Smith 464c1414c8SBarry Smith #undef __FUNCT__ 474108e4d5SBarry Smith #define __FUNCT__ "MatDestroy_SeqAIJ_Inode" 484108e4d5SBarry Smith PetscErrorCode MatDestroy_SeqAIJ_Inode(Mat A) 494c1414c8SBarry Smith { 504c1414c8SBarry Smith PetscErrorCode ierr; 514c1414c8SBarry Smith Mat_SeqAIJ *a=(Mat_SeqAIJ*)A->data; 524c1414c8SBarry Smith 534c1414c8SBarry Smith PetscFunctionBegin; 544c1414c8SBarry Smith ierr = PetscFree(a->inode.size);CHKERRQ(ierr); 5589c6957cSBarry Smith ierr = PetscFree3(a->inode.ibdiag,a->inode.bdiag,a->inode.ssor_work);CHKERRQ(ierr); 56bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)A,"MatInodeAdjustForInodes_C",NULL);CHKERRQ(ierr); 57bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)A,"MatInodeGetInodeSizes_C",NULL);CHKERRQ(ierr); 584c1414c8SBarry Smith PetscFunctionReturn(0); 594c1414c8SBarry Smith } 604c1414c8SBarry Smith 614108e4d5SBarry Smith /* MatCreate_SeqAIJ_Inode is not DLLEXPORTed because it is not a constructor for a complete type. */ 624c1414c8SBarry Smith /* It is also not registered as a type for use within MatSetType. */ 634c1414c8SBarry Smith /* It is intended as a helper for the MATSEQAIJ class, so classes which desire Inodes should */ 644c1414c8SBarry Smith /* inherit off of MATSEQAIJ instead by calling MatSetType(MATSEQAIJ) in their constructor. */ 654c1414c8SBarry Smith /* Maybe this is a bad idea. (?) */ 664c1414c8SBarry Smith #undef __FUNCT__ 674108e4d5SBarry Smith #define __FUNCT__ "MatCreate_SeqAIJ_Inode" 684108e4d5SBarry Smith PetscErrorCode MatCreate_SeqAIJ_Inode(Mat B) 694c1414c8SBarry Smith { 704c1414c8SBarry Smith Mat_SeqAIJ *b=(Mat_SeqAIJ*)B->data; 714c1414c8SBarry Smith PetscErrorCode ierr; 72ace3abfcSBarry Smith PetscBool no_inode,no_unroll; 734c1414c8SBarry Smith 744c1414c8SBarry Smith PetscFunctionBegin; 75da9f3051SSatish Balay no_inode = PETSC_FALSE; 76da9f3051SSatish Balay no_unroll = PETSC_FALSE; 774c1414c8SBarry Smith b->inode.node_count = 0; 784c1414c8SBarry Smith b->inode.size = 0; 794c1414c8SBarry Smith b->inode.limit = 5; 804c1414c8SBarry Smith b->inode.max_limit = 5; 8171f1c65dSBarry Smith b->inode.ibdiagvalid = PETSC_FALSE; 8271f1c65dSBarry Smith b->inode.ibdiag = 0; 8371f1c65dSBarry Smith b->inode.bdiag = 0; 844c1414c8SBarry Smith 85ce94432eSBarry Smith ierr = PetscOptionsBegin(PetscObjectComm((PetscObject)B),((PetscObject)B)->prefix,"Options for SEQAIJ matrix","Mat");CHKERRQ(ierr); 860298fd71SBarry Smith ierr = PetscOptionsBool("-mat_no_unroll","Do not optimize for inodes (slower)",NULL,no_unroll,&no_unroll,NULL);CHKERRQ(ierr); 872205254eSKarl Rupp if (no_unroll) { 882205254eSKarl Rupp ierr = PetscInfo(B,"Not using Inode routines due to -mat_no_unroll\n");CHKERRQ(ierr); 892205254eSKarl Rupp } 900298fd71SBarry Smith ierr = PetscOptionsBool("-mat_no_inode","Do not optimize for inodes -slower-",NULL,no_inode,&no_inode,NULL);CHKERRQ(ierr); 912205254eSKarl Rupp if (no_inode) { 922205254eSKarl Rupp ierr = PetscInfo(B,"Not using Inode routines due to -mat_no_inode\n");CHKERRQ(ierr); 932205254eSKarl Rupp } 940298fd71SBarry Smith ierr = PetscOptionsInt("-mat_inode_limit","Do not use inodes larger then this value",NULL,b->inode.limit,&b->inode.limit,NULL);CHKERRQ(ierr); 95d74fe821SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 9626fbe8dcSKarl Rupp 97ace3abfcSBarry Smith b->inode.use = (PetscBool)(!(no_unroll || no_inode)); 98d74fe821SBarry Smith if (b->inode.limit > b->inode.max_limit) b->inode.limit = b->inode.max_limit; 99d74fe821SBarry Smith 100bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatInodeAdjustForInodes_C",MatInodeAdjustForInodes_SeqAIJ_Inode);CHKERRQ(ierr); 101bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatInodeGetInodeSizes_C",MatInodeGetInodeSizes_SeqAIJ_Inode);CHKERRQ(ierr); 1024c1414c8SBarry Smith PetscFunctionReturn(0); 1034c1414c8SBarry Smith } 1044c1414c8SBarry Smith 1054c1414c8SBarry Smith #undef __FUNCT__ 1064108e4d5SBarry Smith #define __FUNCT__ "MatSetOption_SeqAIJ_Inode" 107ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqAIJ_Inode(Mat A,MatOption op,PetscBool flg) 1084c1414c8SBarry Smith { 1094c1414c8SBarry Smith Mat_SeqAIJ *a=(Mat_SeqAIJ*)A->data; 110d74fe821SBarry Smith 1114c1414c8SBarry Smith PetscFunctionBegin; 1124c1414c8SBarry Smith switch (op) { 1134c1414c8SBarry Smith case MAT_USE_INODES: 1144e0d8c25SBarry Smith a->inode.use = flg; 1154c1414c8SBarry Smith break; 1164c1414c8SBarry Smith default: 1174c1414c8SBarry Smith break; 1184c1414c8SBarry Smith } 1194c1414c8SBarry Smith PetscFunctionReturn(0); 1204c1414c8SBarry Smith } 1214c1414c8SBarry Smith 1224c1414c8SBarry Smith 1234c1414c8SBarry Smith 1244c1414c8SBarry Smith 1254c1414c8SBarry Smith 126