xref: /petsc/src/mat/interface/matreg.c (revision e5c89e4ece6e3231999e6896bd6dacaf81d4b32f)
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