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