1 #define PETSCMAT_DLL 2 3 /* 4 Mechanism for register PETSc matrix types 5 */ 6 #include "src/mat/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, MatType matype) 41 { 42 PetscErrorCode ierr,(*r)(Mat); 43 PetscTruth sametype; 44 45 PetscFunctionBegin; 46 PetscValidHeaderSpecific(mat,MAT_COOKIE,1); 47 if (mat->m < 0 && mat->M < 0 && mat->n < 0 && mat->N < 0) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Must call MatSetSizes() first"); 48 ierr = PetscTypeCompare((PetscObject)mat,matype,&sametype);CHKERRQ(ierr); 49 if (!sametype) { 50 /* Get the function pointers for the matrix requested */ 51 if (!MatRegisterAllCalled) {ierr = MatRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 52 ierr = PetscFListFind(mat->comm,MatList,matype,(void(**)(void))&r);CHKERRQ(ierr); 53 if (!r) SETERRQ1(PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown Mat type given: %s",matype); 54 55 /* free the old data structure if it existed */ 56 if (mat->ops->destroy) { 57 ierr = MatPreallocated(mat);CHKERRQ(ierr); 58 ierr = (*mat->ops->destroy)(mat);CHKERRQ(ierr); 59 mat->ops->destroy = PETSC_NULL; 60 mat->preallocated = PETSC_FALSE; 61 } 62 63 if (mat->rmap) { 64 ierr = PetscMapDestroy(mat->rmap);CHKERRQ(ierr); 65 mat->rmap = 0; 66 } 67 if (mat->cmap) { 68 ierr = PetscMapDestroy(mat->cmap);CHKERRQ(ierr); 69 mat->cmap = 0; 70 } 71 /* create the new data structure */ 72 ierr = (*r)(mat);CHKERRQ(ierr); 73 ierr = PetscObjectChangeTypeName((PetscObject)mat,matype);CHKERRQ(ierr); 74 } 75 ierr = PetscPublishAll(mat);CHKERRQ(ierr); 76 PetscFunctionReturn(0); 77 } 78 79 80 #undef __FUNCT__ 81 #define __FUNCT__ "MatRegisterDestroy" 82 /*@C 83 MatRegisterDestroy - Frees the list of matrix types that were 84 registered by MatRegister()/MatRegisterDynamic(). 85 86 Not Collective 87 88 Level: advanced 89 90 .keywords: Mat, register, destroy 91 92 .seealso: MatRegister(), MatRegisterAll(), MatRegisterDynamic() 93 @*/ 94 PetscErrorCode PETSCMAT_DLLEXPORT MatRegisterDestroy(void) 95 { 96 PetscErrorCode ierr; 97 98 PetscFunctionBegin; 99 if (MatList) { 100 ierr = PetscFListDestroy(&MatList);CHKERRQ(ierr); 101 MatList = 0; 102 } 103 MatRegisterAllCalled = PETSC_FALSE; 104 PetscFunctionReturn(0); 105 } 106 107 #undef __FUNCT__ 108 #define __FUNCT__ "MatGetType" 109 /*@C 110 MatGetType - Gets the matrix type as a string from the matrix object. 111 112 Not Collective 113 114 Input Parameter: 115 . mat - the matrix 116 117 Output Parameter: 118 . name - name of matrix type 119 120 Level: intermediate 121 122 .keywords: Mat, MatType, get, method, name 123 124 .seealso: MatSetType() 125 @*/ 126 PetscErrorCode PETSCMAT_DLLEXPORT MatGetType(Mat mat,MatType *type) 127 { 128 PetscFunctionBegin; 129 *type = mat->type_name; 130 PetscFunctionReturn(0); 131 } 132 133 134 #undef __FUNCT__ 135 #define __FUNCT__ "MatRegister" 136 /*@C 137 MatRegister - See MatRegisterDynamic() 138 139 Level: advanced 140 @*/ 141 PetscErrorCode PETSCMAT_DLLEXPORT MatRegister(const char sname[],const char path[],const char name[],PetscErrorCode (*function)(Mat)) 142 { 143 PetscErrorCode ierr; 144 char fullname[PETSC_MAX_PATH_LEN]; 145 146 PetscFunctionBegin; 147 ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 148 ierr = PetscFListAdd(&MatList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 149 PetscFunctionReturn(0); 150 } 151 152 153 154 155 156 157 158 159 160 161