xref: /petsc/src/mat/interface/matreg.c (revision 9c30b7d2697335155d7490a7e085415ee7b4a02a)
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 int MatSetType(Mat mat,const MatType matype)
39 {
40   int        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(1,"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     if (mat->qlist) {
70       ierr = PetscFListDestroy(&mat->qlist);CHKERRQ(ierr);
71       mat->qlist = 0;
72     }
73     if (mat->olist) {
74       ierr = PetscOListDestroy(&mat->olist);CHKERRQ(ierr);
75       mat->olist = 0;
76     }
77     /* create the new data structure */
78     ierr = (*r)(mat);CHKERRQ(ierr);
79 
80     ierr = PetscObjectChangeTypeName((PetscObject)mat,matype);CHKERRQ(ierr);
81   }
82   ierr = PetscPublishAll(mat);CHKERRQ(ierr);
83   PetscFunctionReturn(0);
84 }
85 
86 
87 #undef __FUNCT__
88 #define __FUNCT__ "MatRegisterDestroy"
89 /*@C
90    MatRegisterDestroy - Frees the list of matrix types that were
91    registered by MatRegister()/MatRegisterDynamic().
92 
93    Not Collective
94 
95    Level: advanced
96 
97 .keywords: Mat, register, destroy
98 
99 .seealso: MatRegister(), MatRegisterAll(), MatRegisterDynamic()
100 @*/
101 int MatRegisterDestroy(void)
102 {
103   int ierr;
104 
105   PetscFunctionBegin;
106   if (MatList) {
107     ierr = PetscFListDestroy(&MatList);CHKERRQ(ierr);
108     MatList = 0;
109   }
110   MatRegisterAllCalled = PETSC_FALSE;
111   PetscFunctionReturn(0);
112 }
113 
114 #undef __FUNCT__
115 #define __FUNCT__ "MatGetType"
116 /*@C
117    MatGetType - Gets the matrix type as a string from the matrix object.
118 
119    Not Collective
120 
121    Input Parameter:
122 .  mat - the matrix
123 
124    Output Parameter:
125 .  name - name of matrix type
126 
127    Level: intermediate
128 
129 .keywords: Mat, MatType, get, method, name
130 
131 .seealso: MatSetType()
132 @*/
133 int MatGetType(Mat mat,MatType *type)
134 {
135   PetscFunctionBegin;
136   *type = mat->type_name;
137   PetscFunctionReturn(0);
138 }
139 
140 
141 #undef __FUNCT__
142 #define __FUNCT__ "MatRegister"
143 /*@C
144   MatRegister - See MatRegisterDynamic()
145 
146   Level: advanced
147 @*/
148 int MatRegister(const char sname[],const char path[],const char name[],int (*function)(Mat))
149 {
150   int  ierr;
151   char fullname[PETSC_MAX_PATH_LEN];
152 
153   PetscFunctionBegin;
154   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
155   ierr = PetscFListAdd(&MatList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr);
156   PetscFunctionReturn(0);
157 }
158 
159 
160 
161 
162 
163 
164 
165 
166 
167 
168