xref: /petsc/src/mat/interface/matregis.c (revision 0619917b5a674bb687c64e7daba2ab22be99af31)
1 /* Portions of this code are under:
2    Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved.
3 */
4 #include <petsc/private/matimpl.h> /*I "petscmat.h" I*/
5 
6 PETSC_EXTERN PetscErrorCode MatCreate_MFFD(Mat);
7 PETSC_EXTERN PetscErrorCode MatCreate_MAIJ(Mat);
8 PETSC_EXTERN PetscErrorCode MatCreate_KAIJ(Mat);
9 PETSC_EXTERN PetscErrorCode MatCreate_IS(Mat);
10 PETSC_EXTERN PetscErrorCode MatCreate_LRC(Mat);
11 
12 PETSC_EXTERN PetscErrorCode MatCreate_SeqAIJ(Mat);
13 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJ(Mat);
14 
15 PETSC_EXTERN PetscErrorCode MatCreate_SeqBAIJ(Mat);
16 PETSC_EXTERN PetscErrorCode MatCreate_MPIBAIJ(Mat);
17 
18 PETSC_EXTERN PetscErrorCode MatCreate_SeqSBAIJ(Mat);
19 PETSC_EXTERN PetscErrorCode MatCreate_MPISBAIJ(Mat);
20 
21 PETSC_INTERN PetscErrorCode MatCreate_SeqDense(Mat);
22 PETSC_INTERN PetscErrorCode MatCreate_MPIDense(Mat);
23 #if defined(PETSC_HAVE_CUDA)
24 PETSC_INTERN PetscErrorCode MatCreate_SeqDenseCUDA(Mat);
25 PETSC_INTERN PetscErrorCode MatCreate_MPIDenseCUDA(Mat);
26 #endif
27 
28 #if defined(PETSC_HAVE_HIP)
29 PETSC_INTERN PetscErrorCode MatCreate_SeqDenseHIP(Mat);
30 PETSC_INTERN PetscErrorCode MatCreate_MPIDenseHIP(Mat);
31 #endif
32 
33 PETSC_EXTERN PetscErrorCode MatCreate_MPIAdj(Mat);
34 PETSC_EXTERN PetscErrorCode MatCreate_Shell(Mat);
35 PETSC_EXTERN PetscErrorCode MatCreate_Composite(Mat);
36 
37 PETSC_EXTERN PetscErrorCode MatCreate_SeqAIJPERM(Mat);
38 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJPERM(Mat);
39 
40 PETSC_EXTERN PetscErrorCode MatCreate_SeqAIJSELL(Mat);
41 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJSELL(Mat);
42 
43 #if defined(PETSC_HAVE_MKL_SPARSE)
44 PETSC_EXTERN PetscErrorCode MatCreate_SeqAIJMKL(Mat);
45 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJMKL(Mat);
46 #endif
47 
48 #if defined(PETSC_HAVE_MKL_SPARSE_OPTIMIZE)
49 PETSC_EXTERN PetscErrorCode MatCreate_SeqBAIJMKL(Mat);
50 PETSC_EXTERN PetscErrorCode MatCreate_MPIBAIJMKL(Mat);
51 #endif
52 
53 PETSC_EXTERN PetscErrorCode MatCreate_SeqAIJCRL(Mat);
54 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJCRL(Mat);
55 
56 PETSC_EXTERN PetscErrorCode MatCreate_Scatter(Mat);
57 PETSC_EXTERN PetscErrorCode MatCreate_BlockMat(Mat);
58 PETSC_EXTERN PetscErrorCode MatCreate_Nest(Mat);
59 
60 PETSC_EXTERN PetscErrorCode MatCreate_SeqSELL(Mat);
61 PETSC_EXTERN PetscErrorCode MatCreate_MPISELL(Mat);
62 
63 #if defined(PETSC_HAVE_CUDA)
64 PETSC_EXTERN PetscErrorCode MatCreate_SeqAIJCUSPARSE(Mat);
65 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJCUSPARSE(Mat);
66 PETSC_EXTERN PetscErrorCode MatCreate_SeqSELLCUDA(Mat);
67 PETSC_EXTERN PetscErrorCode MatCreate_MPISELLCUDA(Mat);
68 #endif
69 
70 #if defined(PETSC_HAVE_HIP)
71 PETSC_EXTERN PetscErrorCode MatCreate_SeqAIJHIPSPARSE(Mat);
72 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJHIPSPARSE(Mat);
73 #endif
74 
75 #if defined(PETSC_HAVE_VIENNACL)
76 PETSC_EXTERN PetscErrorCode MatCreate_SeqAIJViennaCL(Mat);
77 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJViennaCL(Mat);
78 #endif
79 
80 #if defined(PETSC_HAVE_KOKKOS_KERNELS)
81 PETSC_EXTERN PetscErrorCode MatCreate_SeqAIJKokkos(Mat);
82 PETSC_EXTERN PetscErrorCode MatCreate_MPIAIJKokkos(Mat);
83 #endif
84 
85 #if defined(PETSC_HAVE_FFTW)
86 PETSC_EXTERN PetscErrorCode MatCreate_FFTW(Mat);
87 #endif
88 #if defined(PETSC_HAVE_ELEMENTAL)
89 PETSC_EXTERN PetscErrorCode MatCreate_Elemental(Mat);
90 #endif
91 #if defined(PETSC_HAVE_SCALAPACK)
92 PETSC_EXTERN PetscErrorCode MatCreate_ScaLAPACK(Mat);
93 #endif
94 
95 PETSC_EXTERN PetscErrorCode MatCreate_Preallocator(Mat);
96 PETSC_EXTERN PetscErrorCode MatCreate_Dummy(Mat);
97 
98 #if defined(PETSC_HAVE_HYPRE)
99 PETSC_EXTERN PetscErrorCode MatCreate_HYPRE(Mat);
100 #endif
101 
102 PETSC_EXTERN PetscErrorCode MatCreate_ConstantDiagonal(Mat);
103 PETSC_INTERN PetscErrorCode MatCreate_Diagonal(Mat);
104 
105 #if defined(PETSC_HAVE_H2OPUS)
106 PETSC_EXTERN PetscErrorCode MatCreate_H2OPUS(Mat);
107 #endif
108 
109 #if defined(PETSC_HAVE_HTOOL)
110 PETSC_EXTERN PetscErrorCode MatCreate_Htool(Mat);
111 #endif
112 
113 /*@C
114   MatRegisterAll - Registers all of the matrix types in PETSc
115 
116   Not Collective
117 
118   Level: advanced
119 
120 .seealso: `MatType`, `MatSetType()`, `MatRegister()`
121 @*/
122 PetscErrorCode MatRegisterAll(void)
123 {
124   PetscFunctionBegin;
125   if (MatRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
126   MatRegisterAllCalled = PETSC_TRUE;
127 
128   PetscCall(MatRegister(MATMFFD, MatCreate_MFFD));
129 
130   PetscCall(MatRegister(MATMPIMAIJ, MatCreate_MAIJ));
131   PetscCall(MatRegister(MATSEQMAIJ, MatCreate_MAIJ));
132   PetscCall(MatRegister(MATMAIJ, MatCreate_MAIJ));
133 
134   PetscCall(MatRegister(MATMPIKAIJ, MatCreate_KAIJ));
135   PetscCall(MatRegister(MATSEQKAIJ, MatCreate_KAIJ));
136   PetscCall(MatRegister(MATKAIJ, MatCreate_KAIJ));
137 
138   PetscCall(MatRegister(MATIS, MatCreate_IS));
139   PetscCall(MatRegister(MATSHELL, MatCreate_Shell));
140   PetscCall(MatRegister(MATCOMPOSITE, MatCreate_Composite));
141   PetscCall(MatRegister(MATLRC, MatCreate_LRC));
142 
143   PetscCall(MatRegisterRootName(MATAIJ, MATSEQAIJ, MATMPIAIJ));
144   PetscCall(MatRegister(MATMPIAIJ, MatCreate_MPIAIJ));
145   PetscCall(MatRegister(MATSEQAIJ, MatCreate_SeqAIJ));
146 
147   PetscCall(MatRegisterRootName(MATAIJPERM, MATSEQAIJPERM, MATMPIAIJPERM));
148   PetscCall(MatRegister(MATMPIAIJPERM, MatCreate_MPIAIJPERM));
149   PetscCall(MatRegister(MATSEQAIJPERM, MatCreate_SeqAIJPERM));
150 
151   PetscCall(MatRegisterRootName(MATAIJSELL, MATSEQAIJSELL, MATMPIAIJSELL));
152   PetscCall(MatRegister(MATMPIAIJSELL, MatCreate_MPIAIJSELL));
153   PetscCall(MatRegister(MATSEQAIJSELL, MatCreate_SeqAIJSELL));
154 
155 #if defined(PETSC_HAVE_MKL_SPARSE)
156   PetscCall(MatRegisterRootName(MATAIJMKL, MATSEQAIJMKL, MATMPIAIJMKL));
157   PetscCall(MatRegister(MATMPIAIJMKL, MatCreate_MPIAIJMKL));
158   PetscCall(MatRegister(MATSEQAIJMKL, MatCreate_SeqAIJMKL));
159 #endif
160 
161 #if defined(PETSC_HAVE_MKL_SPARSE_OPTIMIZE)
162   PetscCall(MatRegisterRootName(MATBAIJMKL, MATSEQBAIJMKL, MATMPIBAIJMKL));
163   PetscCall(MatRegister(MATMPIBAIJMKL, MatCreate_MPIBAIJMKL));
164   PetscCall(MatRegister(MATSEQBAIJMKL, MatCreate_SeqBAIJMKL));
165 #endif
166 
167   PetscCall(MatRegisterRootName(MATAIJCRL, MATSEQAIJCRL, MATMPIAIJCRL));
168   PetscCall(MatRegister(MATSEQAIJCRL, MatCreate_SeqAIJCRL));
169   PetscCall(MatRegister(MATMPIAIJCRL, MatCreate_MPIAIJCRL));
170 
171   PetscCall(MatRegisterRootName(MATBAIJ, MATSEQBAIJ, MATMPIBAIJ));
172   PetscCall(MatRegister(MATMPIBAIJ, MatCreate_MPIBAIJ));
173   PetscCall(MatRegister(MATSEQBAIJ, MatCreate_SeqBAIJ));
174 
175   PetscCall(MatRegisterRootName(MATSBAIJ, MATSEQSBAIJ, MATMPISBAIJ));
176   PetscCall(MatRegister(MATMPISBAIJ, MatCreate_MPISBAIJ));
177   PetscCall(MatRegister(MATSEQSBAIJ, MatCreate_SeqSBAIJ));
178 
179   PetscCall(MatRegisterRootName(MATDENSE, MATSEQDENSE, MATMPIDENSE));
180   PetscCall(MatRegister(MATMPIDENSE, MatCreate_MPIDense));
181   PetscCall(MatRegister(MATSEQDENSE, MatCreate_SeqDense));
182 #if defined(PETSC_HAVE_CUDA)
183   PetscCall(MatRegisterRootName(MATDENSECUDA, MATSEQDENSECUDA, MATMPIDENSECUDA));
184   PetscCall(MatRegister(MATSEQDENSECUDA, MatCreate_SeqDenseCUDA));
185   PetscCall(MatRegister(MATMPIDENSECUDA, MatCreate_MPIDenseCUDA));
186 #endif
187 
188 #if defined(PETSC_HAVE_HIP)
189   PetscCall(MatRegisterRootName(MATDENSEHIP, MATSEQDENSEHIP, MATMPIDENSEHIP));
190   PetscCall(MatRegister(MATSEQDENSEHIP, MatCreate_SeqDenseHIP));
191   PetscCall(MatRegister(MATMPIDENSEHIP, MatCreate_MPIDenseHIP));
192 #endif
193 
194   PetscCall(MatRegister(MATMPIADJ, MatCreate_MPIAdj));
195   PetscCall(MatRegister(MATSCATTER, MatCreate_Scatter));
196   PetscCall(MatRegister(MATBLOCKMAT, MatCreate_BlockMat));
197   PetscCall(MatRegister(MATNEST, MatCreate_Nest));
198 
199   PetscCall(MatRegisterRootName(MATSELL, MATSEQSELL, MATMPISELL));
200   PetscCall(MatRegister(MATMPISELL, MatCreate_MPISELL));
201   PetscCall(MatRegister(MATSEQSELL, MatCreate_SeqSELL));
202 
203 #if defined(PETSC_HAVE_CUDA)
204   PetscCall(MatRegisterRootName(MATAIJCUSPARSE, MATSEQAIJCUSPARSE, MATMPIAIJCUSPARSE));
205   PetscCall(MatRegister(MATSEQAIJCUSPARSE, MatCreate_SeqAIJCUSPARSE));
206   PetscCall(MatRegister(MATMPIAIJCUSPARSE, MatCreate_MPIAIJCUSPARSE));
207   PetscCall(MatRegisterRootName(MATSELLCUDA, MATSEQSELLCUDA, MATMPISELLCUDA));
208   PetscCall(MatRegister(MATSEQSELLCUDA, MatCreate_SeqSELLCUDA));
209   PetscCall(MatRegister(MATMPISELLCUDA, MatCreate_MPISELLCUDA));
210 #endif
211 
212 #if defined(PETSC_HAVE_HIP)
213   PetscCall(MatRegisterRootName(MATAIJHIPSPARSE, MATSEQAIJHIPSPARSE, MATMPIAIJHIPSPARSE));
214   PetscCall(MatRegister(MATSEQAIJHIPSPARSE, MatCreate_SeqAIJHIPSPARSE));
215   PetscCall(MatRegister(MATMPIAIJHIPSPARSE, MatCreate_MPIAIJHIPSPARSE));
216 #endif
217 
218 #if defined(PETSC_HAVE_VIENNACL)
219   PetscCall(MatRegisterRootName(MATAIJVIENNACL, MATSEQAIJVIENNACL, MATMPIAIJVIENNACL));
220   PetscCall(MatRegister(MATSEQAIJVIENNACL, MatCreate_SeqAIJViennaCL));
221   PetscCall(MatRegister(MATMPIAIJVIENNACL, MatCreate_MPIAIJViennaCL));
222 #endif
223 
224 #if defined(PETSC_HAVE_KOKKOS_KERNELS)
225   PetscCall(MatRegisterRootName(MATAIJKOKKOS, MATSEQAIJKOKKOS, MATMPIAIJKOKKOS));
226   PetscCall(MatRegister(MATSEQAIJKOKKOS, MatCreate_SeqAIJKokkos));
227   PetscCall(MatRegister(MATMPIAIJKOKKOS, MatCreate_MPIAIJKokkos));
228 #endif
229 
230 #if defined(PETSC_HAVE_FFTW)
231   PetscCall(MatRegister(MATFFTW, MatCreate_FFTW));
232 #endif
233 #if defined(PETSC_HAVE_ELEMENTAL)
234   PetscCall(MatRegister(MATELEMENTAL, MatCreate_Elemental));
235 #endif
236 #if defined(PETSC_HAVE_SCALAPACK)
237   PetscCall(MatRegister(MATSCALAPACK, MatCreate_ScaLAPACK));
238 #endif
239 
240   PetscCall(MatRegister(MATPREALLOCATOR, MatCreate_Preallocator));
241   PetscCall(MatRegister(MATDUMMY, MatCreate_Dummy));
242 
243   PetscCall(MatRegister(MATCONSTANTDIAGONAL, MatCreate_ConstantDiagonal));
244   PetscCall(MatRegister(MATDIAGONAL, MatCreate_Diagonal));
245 
246 #if defined(PETSC_HAVE_HYPRE)
247   PetscCall(MatRegister(MATHYPRE, MatCreate_HYPRE));
248 #endif
249 
250 #if defined(PETSC_HAVE_H2OPUS)
251   PetscCall(MatRegister(MATH2OPUS, MatCreate_H2OPUS));
252 #endif
253 
254 #if defined(PETSC_HAVE_HTOOL)
255   PetscCall(MatRegister(MATHTOOL, MatCreate_Htool));
256 #endif
257   PetscFunctionReturn(PETSC_SUCCESS);
258 }
259