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