1be1d678aSKris Buschelman #define PETSCMAT_DLL 2be1d678aSKris Buschelman 3b4319ba4SBarry Smith /* 4b4319ba4SBarry Smith Creates a matrix class for using the Neumann-Neumann type preconditioners. 5b4319ba4SBarry Smith This stores the matrices in globally unassembled form. Each processor 6b4319ba4SBarry Smith assembles only its local Neumann problem and the parallel matrix vector 7b4319ba4SBarry Smith product is handled "implicitly". 8b4319ba4SBarry Smith 9b4319ba4SBarry Smith We provide: 10b4319ba4SBarry Smith MatMult() 11b4319ba4SBarry Smith 12b4319ba4SBarry Smith Currently this allows for only one subdomain per processor. 13b4319ba4SBarry Smith 14b4319ba4SBarry Smith */ 15b4319ba4SBarry Smith 16b4319ba4SBarry Smith #include "src/mat/impls/is/matis.h" /*I "petscmat.h" I*/ 17b4319ba4SBarry Smith 18b4319ba4SBarry Smith #undef __FUNCT__ 19b4319ba4SBarry Smith #define __FUNCT__ "MatDestroy_IS" 20dfbe8321SBarry Smith PetscErrorCode MatDestroy_IS(Mat A) 21b4319ba4SBarry Smith { 22dfbe8321SBarry Smith PetscErrorCode ierr; 23b4319ba4SBarry Smith Mat_IS *b = (Mat_IS*)A->data; 24b4319ba4SBarry Smith 25b4319ba4SBarry Smith PetscFunctionBegin; 26b4319ba4SBarry Smith if (b->A) { 27b4319ba4SBarry Smith ierr = MatDestroy(b->A);CHKERRQ(ierr); 28b4319ba4SBarry Smith } 29b4319ba4SBarry Smith if (b->ctx) { 30b4319ba4SBarry Smith ierr = VecScatterDestroy(b->ctx);CHKERRQ(ierr); 31b4319ba4SBarry Smith } 32b4319ba4SBarry Smith if (b->x) { 33b4319ba4SBarry Smith ierr = VecDestroy(b->x);CHKERRQ(ierr); 34b4319ba4SBarry Smith } 35b4319ba4SBarry Smith if (b->y) { 36b4319ba4SBarry Smith ierr = VecDestroy(b->y);CHKERRQ(ierr); 37b4319ba4SBarry Smith } 38b4319ba4SBarry Smith if (b->mapping) { 39b4319ba4SBarry Smith ierr = ISLocalToGlobalMappingDestroy(b->mapping);CHKERRQ(ierr); 40b4319ba4SBarry Smith } 41b4319ba4SBarry Smith ierr = PetscFree(b);CHKERRQ(ierr); 42901853e0SKris Buschelman ierr = PetscObjectComposeFunction((PetscObject)A,"MatISGetLocalMat_C","",PETSC_NULL);CHKERRQ(ierr); 43b4319ba4SBarry Smith PetscFunctionReturn(0); 44b4319ba4SBarry Smith } 45b4319ba4SBarry Smith 46b4319ba4SBarry Smith #undef __FUNCT__ 47b4319ba4SBarry Smith #define __FUNCT__ "MatMult_IS" 48dfbe8321SBarry Smith PetscErrorCode MatMult_IS(Mat A,Vec x,Vec y) 49b4319ba4SBarry Smith { 50dfbe8321SBarry Smith PetscErrorCode ierr; 51b4319ba4SBarry Smith Mat_IS *is = (Mat_IS*)A->data; 52b4319ba4SBarry Smith PetscScalar zero = 0.0; 53b4319ba4SBarry Smith 54b4319ba4SBarry Smith PetscFunctionBegin; 55b4319ba4SBarry Smith /* scatter the global vector x into the local work vector */ 56b4319ba4SBarry Smith ierr = VecScatterBegin(x,is->x,INSERT_VALUES,SCATTER_FORWARD,is->ctx);CHKERRQ(ierr); 57b4319ba4SBarry Smith ierr = VecScatterEnd(x,is->x,INSERT_VALUES,SCATTER_FORWARD,is->ctx);CHKERRQ(ierr); 58b4319ba4SBarry Smith 59b4319ba4SBarry Smith /* multiply the local matrix */ 60b4319ba4SBarry Smith ierr = MatMult(is->A,is->x,is->y);CHKERRQ(ierr); 61b4319ba4SBarry Smith 62b4319ba4SBarry Smith /* scatter product back into global memory */ 632dcb1b2aSMatthew Knepley ierr = VecSet(y,zero);CHKERRQ(ierr); 64b4319ba4SBarry Smith ierr = VecScatterBegin(is->y,y,ADD_VALUES,SCATTER_REVERSE,is->ctx);CHKERRQ(ierr); 65b4319ba4SBarry Smith ierr = VecScatterEnd(is->y,y,ADD_VALUES,SCATTER_REVERSE,is->ctx);CHKERRQ(ierr); 66b4319ba4SBarry Smith 67b4319ba4SBarry Smith PetscFunctionReturn(0); 68b4319ba4SBarry Smith } 69b4319ba4SBarry Smith 70b4319ba4SBarry Smith #undef __FUNCT__ 71b4319ba4SBarry Smith #define __FUNCT__ "MatView_IS" 72dfbe8321SBarry Smith PetscErrorCode MatView_IS(Mat A,PetscViewer viewer) 73b4319ba4SBarry Smith { 74b4319ba4SBarry Smith Mat_IS *a = (Mat_IS*)A->data; 75dfbe8321SBarry Smith PetscErrorCode ierr; 76b4319ba4SBarry Smith PetscViewer sviewer; 77b4319ba4SBarry Smith 78b4319ba4SBarry Smith PetscFunctionBegin; 79b4319ba4SBarry Smith ierr = PetscViewerGetSingleton(viewer,&sviewer);CHKERRQ(ierr); 80b4319ba4SBarry Smith ierr = MatView(a->A,sviewer);CHKERRQ(ierr); 81b4319ba4SBarry Smith ierr = PetscViewerRestoreSingleton(viewer,&sviewer);CHKERRQ(ierr); 82b4319ba4SBarry Smith PetscFunctionReturn(0); 83b4319ba4SBarry Smith } 84b4319ba4SBarry Smith 85b4319ba4SBarry Smith #undef __FUNCT__ 86b4319ba4SBarry Smith #define __FUNCT__ "MatSetLocalToGlobalMapping_IS" 87dfbe8321SBarry Smith PetscErrorCode MatSetLocalToGlobalMapping_IS(Mat A,ISLocalToGlobalMapping mapping) 88b4319ba4SBarry Smith { 89dfbe8321SBarry Smith PetscErrorCode ierr; 9013f74950SBarry Smith PetscInt n; 91b4319ba4SBarry Smith Mat_IS *is = (Mat_IS*)A->data; 92b4319ba4SBarry Smith IS from,to; 93b4319ba4SBarry Smith Vec global; 94b4319ba4SBarry Smith 95b4319ba4SBarry Smith PetscFunctionBegin; 96b4319ba4SBarry Smith is->mapping = mapping; 97b4319ba4SBarry Smith ierr = PetscObjectReference((PetscObject)mapping);CHKERRQ(ierr); 98b4319ba4SBarry Smith 99b4319ba4SBarry Smith /* Create the local matrix A */ 100b4319ba4SBarry Smith ierr = ISLocalToGlobalMappingGetSize(mapping,&n);CHKERRQ(ierr); 101f69a0ea3SMatthew Knepley ierr = MatCreate(PETSC_COMM_SELF,&is->A);CHKERRQ(ierr); 102f69a0ea3SMatthew Knepley ierr = MatSetSizes(is->A,n,n,n,n);CHKERRQ(ierr); 103b4319ba4SBarry Smith ierr = PetscObjectSetOptionsPrefix((PetscObject)is->A,"is");CHKERRQ(ierr); 104b4319ba4SBarry Smith ierr = MatSetFromOptions(is->A);CHKERRQ(ierr); 105b4319ba4SBarry Smith 106b4319ba4SBarry Smith /* Create the local work vectors */ 107b4319ba4SBarry Smith ierr = VecCreateSeq(PETSC_COMM_SELF,n,&is->x);CHKERRQ(ierr); 108b4319ba4SBarry Smith ierr = VecDuplicate(is->x,&is->y);CHKERRQ(ierr); 109b4319ba4SBarry Smith 110b4319ba4SBarry Smith /* setup the global to local scatter */ 111b4319ba4SBarry Smith ierr = ISCreateStride(PETSC_COMM_SELF,n,0,1,&to);CHKERRQ(ierr); 112b4319ba4SBarry Smith ierr = ISLocalToGlobalMappingApplyIS(mapping,to,&from);CHKERRQ(ierr); 113899cda47SBarry Smith ierr = VecCreateMPI(A->comm,A->cmap.n,A->cmap.N,&global);CHKERRQ(ierr); 114b4319ba4SBarry Smith ierr = VecScatterCreate(global,from,is->x,to,&is->ctx);CHKERRQ(ierr); 115b4319ba4SBarry Smith ierr = VecDestroy(global);CHKERRQ(ierr); 116b4319ba4SBarry Smith ierr = ISDestroy(to);CHKERRQ(ierr); 117b4319ba4SBarry Smith ierr = ISDestroy(from);CHKERRQ(ierr); 118b4319ba4SBarry Smith PetscFunctionReturn(0); 119b4319ba4SBarry Smith } 120b4319ba4SBarry Smith 121b4319ba4SBarry Smith 122b4319ba4SBarry Smith #undef __FUNCT__ 123b4319ba4SBarry Smith #define __FUNCT__ "MatSetValuesLocal_IS" 12413f74950SBarry Smith PetscErrorCode MatSetValuesLocal_IS(Mat A,PetscInt m,const PetscInt *rows, PetscInt n,const PetscInt *cols,const PetscScalar *values,InsertMode addv) 125b4319ba4SBarry Smith { 126dfbe8321SBarry Smith PetscErrorCode ierr; 127b4319ba4SBarry Smith Mat_IS *is = (Mat_IS*)A->data; 128b4319ba4SBarry Smith 129b4319ba4SBarry Smith PetscFunctionBegin; 130b4319ba4SBarry Smith ierr = MatSetValues(is->A,m,rows,n,cols,values,addv);CHKERRQ(ierr); 131b4319ba4SBarry Smith PetscFunctionReturn(0); 132b4319ba4SBarry Smith } 133b4319ba4SBarry Smith 134b4319ba4SBarry Smith #undef __FUNCT__ 135b4319ba4SBarry Smith #define __FUNCT__ "MatZeroRowsLocal_IS" 136f4df32b1SMatthew Knepley PetscErrorCode MatZeroRowsLocal_IS(Mat A,PetscInt n,const PetscInt rows[],PetscScalar diag) 137b4319ba4SBarry Smith { 138b4319ba4SBarry Smith Mat_IS *is = (Mat_IS*)A->data; 139dfbe8321SBarry Smith PetscErrorCode ierr; 140f4df32b1SMatthew Knepley PetscInt i; 141b4319ba4SBarry Smith PetscScalar *array; 142b4319ba4SBarry Smith 143b4319ba4SBarry Smith PetscFunctionBegin; 144b4319ba4SBarry Smith { 145b4319ba4SBarry Smith /* 146b4319ba4SBarry Smith Set up is->x as a "counting vector". This is in order to MatMult_IS 147b4319ba4SBarry Smith work properly in the interface nodes. 148b4319ba4SBarry Smith */ 149b4319ba4SBarry Smith Vec counter; 150b4319ba4SBarry Smith PetscScalar one=1.0, zero=0.0; 151899cda47SBarry Smith ierr = VecCreateMPI(A->comm,A->cmap.n,A->cmap.N,&counter);CHKERRQ(ierr); 1522dcb1b2aSMatthew Knepley ierr = VecSet(counter,zero);CHKERRQ(ierr); 1532dcb1b2aSMatthew Knepley ierr = VecSet(is->x,one);CHKERRQ(ierr); 154b4319ba4SBarry Smith ierr = VecScatterBegin(is->x,counter,ADD_VALUES,SCATTER_REVERSE,is->ctx);CHKERRQ(ierr); 155b4319ba4SBarry Smith ierr = VecScatterEnd (is->x,counter,ADD_VALUES,SCATTER_REVERSE,is->ctx);CHKERRQ(ierr); 156b4319ba4SBarry Smith ierr = VecScatterBegin(counter,is->x,INSERT_VALUES,SCATTER_FORWARD,is->ctx);CHKERRQ(ierr); 157b4319ba4SBarry Smith ierr = VecScatterEnd (counter,is->x,INSERT_VALUES,SCATTER_FORWARD,is->ctx);CHKERRQ(ierr); 158b4319ba4SBarry Smith ierr = VecDestroy(counter);CHKERRQ(ierr); 159b4319ba4SBarry Smith } 160958c9bccSBarry Smith if (!n) { 161b4319ba4SBarry Smith is->pure_neumann = PETSC_TRUE; 162b4319ba4SBarry Smith } else { 163b4319ba4SBarry Smith is->pure_neumann = PETSC_FALSE; 164b4319ba4SBarry Smith ierr = VecGetArray(is->x,&array);CHKERRQ(ierr); 165f4df32b1SMatthew Knepley ierr = MatZeroRows(is->A,n,rows,diag);CHKERRQ(ierr); 166b4319ba4SBarry Smith for (i=0; i<n; i++) { 167f4df32b1SMatthew Knepley ierr = MatSetValue(is->A,rows[i],rows[i],diag/(array[rows[i]]),INSERT_VALUES);CHKERRQ(ierr); 168b4319ba4SBarry Smith } 169b4319ba4SBarry Smith ierr = MatAssemblyBegin(is->A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 170b4319ba4SBarry Smith ierr = MatAssemblyEnd (is->A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 171b4319ba4SBarry Smith ierr = VecRestoreArray(is->x,&array);CHKERRQ(ierr); 172b4319ba4SBarry Smith } 173b4319ba4SBarry Smith 174b4319ba4SBarry Smith PetscFunctionReturn(0); 175b4319ba4SBarry Smith } 176b4319ba4SBarry Smith 177b4319ba4SBarry Smith #undef __FUNCT__ 178b4319ba4SBarry Smith #define __FUNCT__ "MatAssemblyBegin_IS" 179dfbe8321SBarry Smith PetscErrorCode MatAssemblyBegin_IS(Mat A,MatAssemblyType type) 180b4319ba4SBarry Smith { 181b4319ba4SBarry Smith Mat_IS *is = (Mat_IS*)A->data; 182dfbe8321SBarry Smith PetscErrorCode ierr; 183b4319ba4SBarry Smith 184b4319ba4SBarry Smith PetscFunctionBegin; 185b4319ba4SBarry Smith ierr = MatAssemblyBegin(is->A,type);CHKERRQ(ierr); 186b4319ba4SBarry Smith PetscFunctionReturn(0); 187b4319ba4SBarry Smith } 188b4319ba4SBarry Smith 189b4319ba4SBarry Smith #undef __FUNCT__ 190b4319ba4SBarry Smith #define __FUNCT__ "MatAssemblyEnd_IS" 191dfbe8321SBarry Smith PetscErrorCode MatAssemblyEnd_IS(Mat A,MatAssemblyType type) 192b4319ba4SBarry Smith { 193b4319ba4SBarry Smith Mat_IS *is = (Mat_IS*)A->data; 194dfbe8321SBarry Smith PetscErrorCode ierr; 195b4319ba4SBarry Smith 196b4319ba4SBarry Smith PetscFunctionBegin; 197b4319ba4SBarry Smith ierr = MatAssemblyEnd(is->A,type);CHKERRQ(ierr); 198b4319ba4SBarry Smith PetscFunctionReturn(0); 199b4319ba4SBarry Smith } 200b4319ba4SBarry Smith 201b4319ba4SBarry Smith EXTERN_C_BEGIN 202b4319ba4SBarry Smith #undef __FUNCT__ 203b4319ba4SBarry Smith #define __FUNCT__ "MatISGetLocalMat_IS" 204be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatISGetLocalMat_IS(Mat mat,Mat *local) 205b4319ba4SBarry Smith { 206b4319ba4SBarry Smith Mat_IS *is = (Mat_IS *)mat->data; 207b4319ba4SBarry Smith 208b4319ba4SBarry Smith PetscFunctionBegin; 209b4319ba4SBarry Smith *local = is->A; 210b4319ba4SBarry Smith PetscFunctionReturn(0); 211b4319ba4SBarry Smith } 212b4319ba4SBarry Smith EXTERN_C_END 213b4319ba4SBarry Smith 214b4319ba4SBarry Smith #undef __FUNCT__ 215b4319ba4SBarry Smith #define __FUNCT__ "MatISGetLocalMat" 216b4319ba4SBarry Smith /*@ 217b4319ba4SBarry Smith MatISGetLocalMat - Gets the local matrix stored inside a MATIS matrix. 218b4319ba4SBarry Smith 219b4319ba4SBarry Smith Input Parameter: 220b4319ba4SBarry Smith . mat - the matrix 221b4319ba4SBarry Smith 222b4319ba4SBarry Smith Output Parameter: 223b4319ba4SBarry Smith . local - the local matrix usually MATSEQAIJ 224b4319ba4SBarry Smith 225b4319ba4SBarry Smith Level: advanced 226b4319ba4SBarry Smith 227b4319ba4SBarry Smith Notes: 228b4319ba4SBarry Smith This can be called if you have precomputed the nonzero structure of the 229b4319ba4SBarry Smith matrix and want to provide it to the inner matrix object to improve the performance 230b4319ba4SBarry Smith of the MatSetValues() operation. 231b4319ba4SBarry Smith 232b4319ba4SBarry Smith .seealso: MATIS 233b4319ba4SBarry Smith @*/ 234be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatISGetLocalMat(Mat mat,Mat *local) 235b4319ba4SBarry Smith { 236dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(Mat,Mat *); 237b4319ba4SBarry Smith 238b4319ba4SBarry Smith PetscFunctionBegin; 239b4319ba4SBarry Smith PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 240b4319ba4SBarry Smith PetscValidPointer(local,2); 241b4319ba4SBarry Smith ierr = PetscObjectQueryFunction((PetscObject)mat,"MatISGetLocalMat_C",(void (**)(void))&f);CHKERRQ(ierr); 242b4319ba4SBarry Smith if (f) { 243b4319ba4SBarry Smith ierr = (*f)(mat,local);CHKERRQ(ierr); 244b4319ba4SBarry Smith } else { 245b4319ba4SBarry Smith local = 0; 246b4319ba4SBarry Smith } 247b4319ba4SBarry Smith PetscFunctionReturn(0); 248b4319ba4SBarry Smith } 249b4319ba4SBarry Smith 2506726f965SBarry Smith #undef __FUNCT__ 2516726f965SBarry Smith #define __FUNCT__ "MatZeroEntries_IS" 2526726f965SBarry Smith PetscErrorCode MatZeroEntries_IS(Mat A) 2536726f965SBarry Smith { 2546726f965SBarry Smith Mat_IS *a = (Mat_IS*)A->data; 2556726f965SBarry Smith PetscErrorCode ierr; 2566726f965SBarry Smith 2576726f965SBarry Smith PetscFunctionBegin; 2586726f965SBarry Smith ierr = MatZeroEntries(a->A);CHKERRQ(ierr); 2596726f965SBarry Smith PetscFunctionReturn(0); 2606726f965SBarry Smith } 2616726f965SBarry Smith 2626726f965SBarry Smith #undef __FUNCT__ 2636726f965SBarry Smith #define __FUNCT__ "MatSetOption_IS" 2646726f965SBarry Smith PetscErrorCode MatSetOption_IS(Mat A,MatOption op) 2656726f965SBarry Smith { 2666726f965SBarry Smith Mat_IS *a = (Mat_IS*)A->data; 2676726f965SBarry Smith PetscErrorCode ierr; 2686726f965SBarry Smith 2696726f965SBarry Smith PetscFunctionBegin; 2706726f965SBarry Smith ierr = MatSetOption(a->A,op);CHKERRQ(ierr); 2716726f965SBarry Smith PetscFunctionReturn(0); 2726726f965SBarry Smith } 2736726f965SBarry Smith 274284134d9SBarry Smith #undef __FUNCT__ 275284134d9SBarry Smith #define __FUNCT__ "MatCreateIS" 276284134d9SBarry Smith /*@ 277284134d9SBarry Smith MatCreateIS - Creates a "process" unassmembled matrix, it is assembled on each 278284134d9SBarry Smith process but not across processes. 279284134d9SBarry Smith 280284134d9SBarry Smith Input Parameters: 281284134d9SBarry Smith + comm - MPI communicator that will share the matrix 282284134d9SBarry Smith . m,n,M,N - local and/or global sizes of the the left and right vector used in matrix vector products 283284134d9SBarry Smith - map - mapping that defines the global number for each local number 284284134d9SBarry Smith 285284134d9SBarry Smith Output Parameter: 286284134d9SBarry Smith . A - the resulting matrix 287284134d9SBarry Smith 2888e6c10adSSatish Balay Level: advanced 2898e6c10adSSatish Balay 290284134d9SBarry Smith Notes: See MATIS for more details 291284134d9SBarry Smith m and n are NOT related to the size of the map 292284134d9SBarry Smith 293284134d9SBarry Smith .seealso: MATIS, MatSetLocalToGlobalMapping() 294284134d9SBarry Smith @*/ 295284134d9SBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatCreateIS(MPI_Comm comm,PetscInt m,PetscInt n,PetscInt M,PetscInt N,ISLocalToGlobalMapping map,Mat *A) 296284134d9SBarry Smith { 297284134d9SBarry Smith PetscErrorCode ierr; 298284134d9SBarry Smith 299284134d9SBarry Smith PetscFunctionBegin; 300284134d9SBarry Smith ierr = MatCreate(comm,A);CHKERRQ(ierr); 301284134d9SBarry Smith ierr = MatSetSizes(*A,m,n,M,N);CHKERRQ(ierr); 302284134d9SBarry Smith ierr = MatSetType(*A,MATIS);CHKERRQ(ierr); 303284134d9SBarry Smith ierr = MatSetLocalToGlobalMapping(*A,map);CHKERRQ(ierr); 304284134d9SBarry Smith PetscFunctionReturn(0); 305284134d9SBarry Smith } 306284134d9SBarry Smith 307b4319ba4SBarry Smith /*MC 308b4319ba4SBarry Smith MATIS - MATIS = "is" - A matrix type to be used for using the Neumann-Neumann type preconditioners. 309b4319ba4SBarry Smith This stores the matrices in globally unassembled form. Each processor 310b4319ba4SBarry Smith assembles only its local Neumann problem and the parallel matrix vector 311b4319ba4SBarry Smith product is handled "implicitly". 312b4319ba4SBarry Smith 313b4319ba4SBarry Smith Operations Provided: 3146726f965SBarry Smith + MatMult() 3156726f965SBarry Smith . MatZeroEntries() 3166726f965SBarry Smith . MatSetOption() 3176726f965SBarry Smith . MatZeroRowsLocal() 3186726f965SBarry Smith . MatSetValuesLocal() 3196726f965SBarry Smith - MatSetLocalToGlobalMapping() 320b4319ba4SBarry Smith 321b4319ba4SBarry Smith Options Database Keys: 322b4319ba4SBarry Smith . -mat_type is - sets the matrix type to "is" during a call to MatSetFromOptions() 323b4319ba4SBarry Smith 324b4319ba4SBarry Smith Notes: Options prefix for the inner matrix are given by -is_mat_xxx 325b4319ba4SBarry Smith 326b4319ba4SBarry Smith You must call MatSetLocalToGlobalMapping() before using this matrix type. 327b4319ba4SBarry Smith 328b4319ba4SBarry Smith You can do matrix preallocation on the local matrix after you obtain it with 329b4319ba4SBarry Smith MatISGetLocalMat() 330b4319ba4SBarry Smith 331b4319ba4SBarry Smith Level: advanced 332b4319ba4SBarry Smith 333b4319ba4SBarry Smith .seealso: PC, MatISGetLocalMat(), MatSetLocalToGlobalMapping() 334b4319ba4SBarry Smith 335b4319ba4SBarry Smith M*/ 336b4319ba4SBarry Smith 337b4319ba4SBarry Smith EXTERN_C_BEGIN 338b4319ba4SBarry Smith #undef __FUNCT__ 339b4319ba4SBarry Smith #define __FUNCT__ "MatCreate_IS" 340be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_IS(Mat A) 341b4319ba4SBarry Smith { 342dfbe8321SBarry Smith PetscErrorCode ierr; 343b4319ba4SBarry Smith Mat_IS *b; 344b4319ba4SBarry Smith 345b4319ba4SBarry Smith PetscFunctionBegin; 346b4319ba4SBarry Smith ierr = PetscNew(Mat_IS,&b);CHKERRQ(ierr); 347b4319ba4SBarry Smith A->data = (void*)b; 348b4319ba4SBarry Smith ierr = PetscMemzero(A->ops,sizeof(struct _MatOps));CHKERRQ(ierr); 349b4319ba4SBarry Smith A->factor = 0; 350b4319ba4SBarry Smith A->mapping = 0; 351b4319ba4SBarry Smith 352b4319ba4SBarry Smith A->ops->mult = MatMult_IS; 353b4319ba4SBarry Smith A->ops->destroy = MatDestroy_IS; 354b4319ba4SBarry Smith A->ops->setlocaltoglobalmapping = MatSetLocalToGlobalMapping_IS; 355b4319ba4SBarry Smith A->ops->setvalueslocal = MatSetValuesLocal_IS; 356b4319ba4SBarry Smith A->ops->zerorowslocal = MatZeroRowsLocal_IS; 357b4319ba4SBarry Smith A->ops->assemblybegin = MatAssemblyBegin_IS; 358b4319ba4SBarry Smith A->ops->assemblyend = MatAssemblyEnd_IS; 359b4319ba4SBarry Smith A->ops->view = MatView_IS; 3606726f965SBarry Smith A->ops->zeroentries = MatZeroEntries_IS; 3616726f965SBarry Smith A->ops->setoption = MatSetOption_IS; 362b4319ba4SBarry Smith 363899cda47SBarry Smith ierr = PetscMapInitialize(A->comm,&A->rmap);CHKERRQ(ierr); 364899cda47SBarry Smith ierr = PetscMapInitialize(A->comm,&A->cmap);CHKERRQ(ierr); 365b4319ba4SBarry Smith 366b4319ba4SBarry Smith b->A = 0; 367b4319ba4SBarry Smith b->ctx = 0; 368b4319ba4SBarry Smith b->x = 0; 369b4319ba4SBarry Smith b->y = 0; 370b4319ba4SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)A,"MatISGetLocalMat_C","MatISGetLocalMat_IS",MatISGetLocalMat_IS);CHKERRQ(ierr); 371*17667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)A,MATIS);CHKERRQ(ierr); 372b4319ba4SBarry Smith 373b4319ba4SBarry Smith PetscFunctionReturn(0); 374b4319ba4SBarry Smith } 375b4319ba4SBarry Smith EXTERN_C_END 376b4319ba4SBarry Smith 377b4319ba4SBarry Smith 378b4319ba4SBarry Smith 379b4319ba4SBarry Smith 380b4319ba4SBarry Smith 381b4319ba4SBarry Smith 382b4319ba4SBarry Smith 383b4319ba4SBarry Smith 384b4319ba4SBarry Smith 385b4319ba4SBarry Smith 386b4319ba4SBarry Smith 387b4319ba4SBarry Smith 388b4319ba4SBarry Smith 389