1 #define PETSCMAT_DLL 2 3 /* 4 Mechanism for register PETSc matrix types 5 */ 6 #include "private/matimpl.h" /*I "petscmat.h" I*/ 7 8 PetscTruth MatRegisterAllCalled = PETSC_FALSE; 9 10 /* 11 Contains the list of registered Mat routines 12 */ 13 PetscFList MatList = 0; 14 15 #undef __FUNCT__ 16 #define __FUNCT__ "MatSetType" 17 /*@C 18 MatSetType - Builds matrix object for a particular matrix type 19 20 Collective on Mat 21 22 Input Parameters: 23 + mat - the matrix object 24 - matype - matrix type 25 26 Options Database Key: 27 . -mat_type <method> - Sets the type; use -help for a list 28 of available methods (for instance, seqaij) 29 30 Notes: 31 See "${PETSC_DIR}/include/petscmat.h" for available methods 32 33 Level: intermediate 34 35 .keywords: Mat, MatType, set, method 36 37 .seealso: PCSetType(), VecSetType(), MatCreate(), MatType, Mat 38 @*/ 39 PetscErrorCode PETSCMAT_DLLEXPORT MatSetType(Mat mat, const MatType matype) 40 { 41 PetscErrorCode ierr,(*r)(Mat); 42 PetscTruth sametype; 43 44 PetscFunctionBegin; 45 PetscValidHeaderSpecific(mat,MAT_CLASSID,1); 46 47 ierr = PetscTypeCompare((PetscObject)mat,matype,&sametype);CHKERRQ(ierr); 48 if (sametype) PetscFunctionReturn(0); 49 50 ierr = PetscFListFind(MatList,((PetscObject)mat)->comm,matype,(void(**)(void))&r);CHKERRQ(ierr); 51 if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown Mat type given: %s",matype); 52 53 /* free the old data structure if it existed */ 54 if (mat->ops->destroy) { 55 ierr = MatPreallocated(mat);CHKERRQ(ierr); 56 ierr = (*mat->ops->destroy)(mat);CHKERRQ(ierr); 57 mat->ops->destroy = PETSC_NULL; 58 mat->preallocated = PETSC_FALSE; 59 } 60 61 /* create the new data structure */ 62 if (mat->rmap->n < 0 && mat->rmap->N < 0 && mat->cmap->n < 0 && mat->cmap->N < 0) { 63 mat->ops->create = r; 64 } else { 65 ierr = (*r)(mat);CHKERRQ(ierr); 66 } 67 ierr = PetscPublishAll(mat);CHKERRQ(ierr); 68 PetscFunctionReturn(0); 69 } 70 71 72 #undef __FUNCT__ 73 #define __FUNCT__ "MatRegisterDestroy" 74 /*@C 75 MatRegisterDestroy - Frees the list of matrix types that were 76 registered by MatRegister()/MatRegisterDynamic(). 77 78 Not Collective 79 80 Level: advanced 81 82 .keywords: Mat, register, destroy 83 84 .seealso: MatRegister(), MatRegisterAll(), MatRegisterDynamic() 85 @*/ 86 PetscErrorCode PETSCMAT_DLLEXPORT MatRegisterDestroy(void) 87 { 88 PetscErrorCode ierr; 89 90 PetscFunctionBegin; 91 ierr = PetscFListDestroy(&MatList);CHKERRQ(ierr); 92 MatRegisterAllCalled = PETSC_FALSE; 93 PetscFunctionReturn(0); 94 } 95 96 #undef __FUNCT__ 97 #define __FUNCT__ "MatGetType" 98 /*@C 99 MatGetType - Gets the matrix type as a string from the matrix object. 100 101 Not Collective 102 103 Input Parameter: 104 . mat - the matrix 105 106 Output Parameter: 107 . name - name of matrix type 108 109 Level: intermediate 110 111 .keywords: Mat, MatType, get, method, name 112 113 .seealso: MatSetType() 114 @*/ 115 PetscErrorCode PETSCMAT_DLLEXPORT MatGetType(Mat mat,const MatType *type) 116 { 117 PetscFunctionBegin; 118 PetscValidHeaderSpecific(mat,MAT_CLASSID,1); 119 PetscValidPointer(type,2); 120 *type = ((PetscObject)mat)->type_name; 121 PetscFunctionReturn(0); 122 } 123 124 125 #undef __FUNCT__ 126 #define __FUNCT__ "MatRegister" 127 /*@C 128 MatRegister - See MatRegisterDynamic() 129 130 Level: advanced 131 @*/ 132 PetscErrorCode PETSCMAT_DLLEXPORT MatRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(Mat)) 133 { 134 PetscErrorCode ierr; 135 char fullname[PETSC_MAX_PATH_LEN]; 136 137 PetscFunctionBegin; 138 ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 139 ierr = PetscFListAdd(&MatList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 140 PetscFunctionReturn(0); 141 } 142 143 144 145 146 147 148 149 150 151 152