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