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_COMM_SELF,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 ierr = (*r)(mat);CHKERRQ(ierr); 63 64 ierr = PetscPublishAll(mat);CHKERRQ(ierr); 65 PetscFunctionReturn(0); 66 } 67 68 69 #undef __FUNCT__ 70 #define __FUNCT__ "MatRegisterDestroy" 71 /*@C 72 MatRegisterDestroy - Frees the list of matrix types that were 73 registered by MatRegister()/MatRegisterDynamic(). 74 75 Not Collective 76 77 Level: advanced 78 79 .keywords: Mat, register, destroy 80 81 .seealso: MatRegister(), MatRegisterAll(), MatRegisterDynamic() 82 @*/ 83 PetscErrorCode PETSCMAT_DLLEXPORT MatRegisterDestroy(void) 84 { 85 PetscErrorCode ierr; 86 87 PetscFunctionBegin; 88 ierr = PetscFListDestroy(&MatList);CHKERRQ(ierr); 89 MatRegisterAllCalled = PETSC_FALSE; 90 PetscFunctionReturn(0); 91 } 92 93 #undef __FUNCT__ 94 #define __FUNCT__ "MatGetType" 95 /*@C 96 MatGetType - Gets the matrix type as a string from the matrix object. 97 98 Not Collective 99 100 Input Parameter: 101 . mat - the matrix 102 103 Output Parameter: 104 . name - name of matrix type 105 106 Level: intermediate 107 108 .keywords: Mat, MatType, get, method, name 109 110 .seealso: MatSetType() 111 @*/ 112 PetscErrorCode PETSCMAT_DLLEXPORT MatGetType(Mat mat,const MatType *type) 113 { 114 PetscFunctionBegin; 115 PetscValidHeaderSpecific(mat,MAT_CLASSID,1); 116 PetscValidPointer(type,2); 117 *type = ((PetscObject)mat)->type_name; 118 PetscFunctionReturn(0); 119 } 120 121 122 #undef __FUNCT__ 123 #define __FUNCT__ "MatRegister" 124 /*@C 125 MatRegister - See MatRegisterDynamic() 126 127 Level: advanced 128 @*/ 129 PetscErrorCode PETSCMAT_DLLEXPORT MatRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(Mat)) 130 { 131 PetscErrorCode ierr; 132 char fullname[PETSC_MAX_PATH_LEN]; 133 134 PetscFunctionBegin; 135 ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 136 ierr = PetscFListAdd(&MatList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 137 PetscFunctionReturn(0); 138 } 139 140 141 142 143 144 145 146 147 148 149