xref: /petsc/src/mat/interface/matreg.c (revision 4db511f1d1b98f37717f3ecaf35cce8ecdb684f9)
1 #ifdef PETSC_RCS_HEADER
2 static char vcid[] = "$Id: matreg.c,v 1.18 2001/07/20 21:19:21 bsmith Exp $";
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(), MatType, Mat
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     MatPreallocated(mat);
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,(void(**)(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 = 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, 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(char *sname,char *path,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