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