xref: /petsc/src/mat/interface/matreg.c (revision 4a2ae208534dc2960f861bf8a1e27d424854347f)
1 #ifdef PETSC_RCS_HEADER
2 static char vcid[] = "$Id: matreg.c,v 1.13 2001/01/15 21:45:27 bsmith Exp balay $";
3 #endif
4 /*
5      Mechanism for register PETSc matrix types
6 */
7 #include "src/mat/matimpl.h"      /*I "petscmat.h" I*/
8 #include "petscsys.h"
9 
10 PetscTruth MatRegisterAllCalled = PETSC_FALSE;
11 
12 /*
13    Contains the list of registered Mat routines
14 */
15 PetscFList MatList = 0;
16 
17 #undef __FUNCT__
18 #define __FUNCT__ "MatSetType"
19 /*@C
20    MatSetType - Builds matrix object for a particular matrix type
21 
22    Collective on Mat
23 
24    Input Parameters:
25 +  mat      - the matrix object
26 -  matype   - matrix type
27 
28    Options Database Key:
29 .  -mat_type  <method> - Sets the type; use -help for a list
30     of available methods (for instance, seqaij)
31 
32    Notes:
33    See "${PETSC_DIR}/include/petscmat.h" for available methods
34 
35   Level: intermediate
36 
37 .keywords: Mat, set, method
38 
39 .seealso: PCSetType(), VecSetType(), MatCreate()
40 @*/
41 int MatSetType(Mat mat,MatType matype)
42 {
43   int        ierr,(*r)(Mat);
44   PetscTruth sametype;
45 
46   PetscFunctionBegin;
47   PetscValidHeaderSpecific(mat,MAT_COOKIE);
48 
49   ierr = PetscTypeCompare((PetscObject)mat,matype,&sametype);CHKERRQ(ierr);
50   if (!sametype) {
51 
52     /* Get the function pointers for the matrix requested */
53     if (!MatRegisterAllCalled) {ierr = MatRegisterAll(PETSC_NULL);CHKERRQ(ierr);}
54     ierr =  PetscFListFind(mat->comm,MatList,matype,(int(**)(void*))&r);CHKERRQ(ierr);
55     if (!r) SETERRQ1(1,"Unknown Mat type given: %s",matype);
56 
57     /* free the old data structure if it existed */
58     if (mat->ops->destroy) {
59       ierr = (*mat->ops->destroy)(mat);CHKERRQ(ierr);
60     }
61     if (mat->rmap) {
62       ierr = MapDestroy(mat->rmap);CHKERRQ(ierr);
63       mat->rmap = 0;
64     }
65     if (mat->cmap) {
66       ierr = MapDestroy(mat->cmap);CHKERRQ(ierr);
67       mat->cmap = 0;
68     }
69 
70     /* create the new data structure */
71     ierr = (*r)(mat);CHKERRQ(ierr);
72 
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().
85 
86    Not Collective
87 
88    Level: advanced
89 
90 .keywords: Mat, register, destroy
91 
92 .seealso: MatRegister(), MatRegisterAll()
93 @*/
94 int MatRegisterDestroy(void)
95 {
96   int 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 matrx 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, get, method, name
123 
124 .seealso: MatSetType()
125 @*/
126 int MatGetType(Mat mat,MatType *type)
127 {
128   PetscFunctionBegin;
129   *type = mat->type_name;
130   PetscFunctionReturn(0);
131 }
132 
133 /*MC
134    MatRegisterDynamic - Adds a new matrix type
135 
136    Synopsis:
137    MatRegisterDynamic(char *name,char *path,char *name_create,int (*routine_create)(Mat))
138 
139    Not Collective
140 
141    Input Parameters:
142 +  name - name of a new user-defined matrix type
143 .  path - path (either absolute or relative) the library containing this solver
144 .  name_create - name of routine to create method context
145 -  routine_create - routine to create method context
146 
147    Notes:
148    MatRegister() may be called multiple times to add several user-defined solvers.
149 
150    If dynamic libraries are used, then the fourth input argument (routine_create)
151    is ignored.
152 
153    Sample usage:
154 .vb
155    MatRegisterDynamic("my_mat",/home/username/my_lib/lib/libO/solaris/mylib.a,
156                "MyMatCreate",MyMatCreate);
157 .ve
158 
159    Then, your solver can be chosen with the procedural interface via
160 $     MatSetType(Mat,"my_mat")
161    or at runtime via the option
162 $     -mat_type my_mat
163 
164    Level: advanced
165 
166    ${PETSC_ARCH} and ${BOPT} occuring in pathname will be replaced with appropriate values.
167 
168 .keywords: Mat, register
169 
170 .seealso: MatRegisterAll(), MatRegisterDestroy(), MatRegister()
171 
172 M*/
173 
174 #undef __FUNCT__
175 #define __FUNCT__ "MatRegister"
176 int MatRegister(char *sname,char *path,char *name,int (*function)(Mat))
177 {
178   int  ierr;
179   char fullname[256];
180 
181   PetscFunctionBegin;
182   ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr);
183   ierr = PetscFListAdd(&MatList,sname,fullname,(int (*)(void*))function);CHKERRQ(ierr);
184   PetscFunctionReturn(0);
185 }
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196