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>
5
6 const char *MatOptions_Shifted[] = {"UNUSED_NONZERO_LOCATION_ERR", "ROW_ORIENTED", "NOT_A_VALID_OPTION", "SYMMETRIC", "STRUCTURALLY_SYMMETRIC", "FORCE_DIAGONAL_ENTRIES", "IGNORE_OFF_PROC_ENTRIES", "USE_HASH_TABLE", "KEEP_NONZERO_PATTERN", "IGNORE_ZERO_ENTRIES", "USE_INODES", "HERMITIAN", "SYMMETRY_ETERNAL", "NEW_NONZERO_LOCATION_ERR", "IGNORE_LOWER_TRIANGULAR", "ERROR_LOWER_TRIANGULAR", "GETROW_UPPERTRIANGULAR", "SPD", "NO_OFF_PROC_ZERO_ROWS", "NO_OFF_PROC_ENTRIES", "NEW_NONZERO_LOCATIONS", "NEW_NONZERO_ALLOCATION_ERR", "SUBSET_OFF_PROC_ENTRIES", "SUBMAT_SINGLEIS", "STRUCTURE_ONLY", "SORTED_FULL", "FORM_EXPLICIT_TRANSPOSE", "STRUCTURAL_SYMMETRY_ETERNAL", "SPD_ETERNAL", "MatOption", "MAT_", NULL};
7 const char *const *MatOptions = MatOptions_Shifted + 2;
8 const char *const MatFactorShiftTypes[] = {"NONE", "NONZERO", "POSITIVE_DEFINITE", "INBLOCKS", "MatFactorShiftType", "PC_FACTOR_", NULL};
9 const char *const MatStructures[] = {"DIFFERENT", "SUBSET", "SAME", "UNKNOWN", "MatStructure", "MAT_STRUCTURE_", NULL};
10 const char *const MatFactorShiftTypesDetail[] = {NULL, "diagonal shift to prevent zero pivot", "Manteuffel shift", "diagonal shift on blocks to prevent zero pivot"};
11 const char *const MPPTScotchStrategyTypes[] = {"DEFAULT", "QUALITY", "SPEED", "BALANCE", "SAFETY", "SCALABILITY", "MPPTScotchStrategyType", "MP_PTSCOTCH_", NULL};
12 const char *const MPChacoGlobalTypes[] = {"", "MULTILEVEL", "SPECTRAL", "", "LINEAR", "RANDOM", "SCATTERED", "MPChacoGlobalType", "MP_CHACO_", NULL};
13 const char *const MPChacoLocalTypes[] = {"", "KERNIGHAN", "NONE", "MPChacoLocalType", "MP_CHACO_", NULL};
14 const char *const MPChacoEigenTypes[] = {"LANCZOS", "RQI", "MPChacoEigenType", "MP_CHACO_", NULL};
15
16 extern PetscErrorCode MatSolverTypeDestroy(void);
17 static PetscBool MatPackageInitialized = PETSC_FALSE;
18
19 /*@C
20 MatFinalizePackage - This function destroys everything in the PETSc interface to the `Mat`
21 package. It is called from `PetscFinalize()`.
22
23 Level: developer
24
25 .seealso: `Mat`, `PetscFinalize()`, `MatInitializePackage()`
26 @*/
MatFinalizePackage(void)27 PetscErrorCode MatFinalizePackage(void)
28 {
29 MatRootName nnames, names = MatRootNameList;
30
31 PetscFunctionBegin;
32 PetscCall(MatSolverTypeDestroy());
33 while (names) {
34 nnames = names->next;
35 PetscCall(PetscFree(names->rname));
36 PetscCall(PetscFree(names->sname));
37 PetscCall(PetscFree(names->mname));
38 PetscCall(PetscFree(names));
39 names = nnames;
40 }
41 PetscCall(PetscFunctionListDestroy(&MatList));
42 PetscCall(PetscFunctionListDestroy(&MatOrderingList));
43 PetscCall(PetscFunctionListDestroy(&MatColoringList));
44 PetscCall(PetscFunctionListDestroy(&MatPartitioningList));
45 PetscCall(PetscFunctionListDestroy(&MatCoarsenList));
46 MatRootNameList = NULL;
47 MatPackageInitialized = PETSC_FALSE;
48 MatRegisterAllCalled = PETSC_FALSE;
49 MatOrderingRegisterAllCalled = PETSC_FALSE;
50 MatColoringRegisterAllCalled = PETSC_FALSE;
51 MatPartitioningRegisterAllCalled = PETSC_FALSE;
52 MatCoarsenRegisterAllCalled = PETSC_FALSE;
53 /* this is not ideal because it exposes SeqAIJ implementation details directly into the base Mat code */
54 PetscCall(PetscFunctionListDestroy(&MatSeqAIJList));
55 MatSeqAIJRegisterAllCalled = PETSC_FALSE;
56 PetscFunctionReturn(PETSC_SUCCESS);
57 }
58
59 #if defined(PETSC_HAVE_CUDA)
60 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_DENSECUDA(void);
61 #endif
62
63 #if defined(PETSC_HAVE_HIP)
64 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_DENSEHIP(void);
65 #endif
66
67 #if defined(PETSC_HAVE_MUMPS)
68 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_MUMPS(void);
69 #endif
70 #if defined(PETSC_HAVE_CUDA)
71 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_CUSPARSE(void);
72 #endif
73 #if defined(PETSC_HAVE_HIP)
74 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_HIPSPARSE(void);
75 #endif
76 #if defined(PETSC_HAVE_KOKKOS_KERNELS)
77 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_Kokkos(void);
78 #endif
79 #if defined(PETSC_HAVE_VIENNACL)
80 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_ViennaCL(void);
81 #endif
82 #if defined(PETSC_HAVE_ELEMENTAL)
83 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_Elemental(void);
84 #endif
85 #if defined(PETSC_HAVE_SCALAPACK) && (defined(PETSC_USE_REAL_SINGLE) || defined(PETSC_USE_REAL_DOUBLE))
86 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_ScaLAPACK(void);
87 #endif
88 #if defined(PETSC_HAVE_MATLAB)
89 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_Matlab(void);
90 #endif
91 #if defined(PETSC_HAVE_ESSL)
92 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_Essl(void);
93 #endif
94 #if defined(PETSC_HAVE_SUPERLU)
95 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_SuperLU(void);
96 #endif
97 #if defined(PETSC_HAVE_STRUMPACK)
98 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_STRUMPACK(void);
99 #endif
100 #if defined(PETSC_HAVE_PASTIX)
101 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_Pastix(void);
102 #endif
103 #if defined(PETSC_HAVE_SUPERLU_DIST)
104 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_SuperLU_DIST(void);
105 #endif
106 #if defined(PETSC_HAVE_MKL_PARDISO)
107 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_MKL_Pardiso(void);
108 #endif
109 #if defined(PETSC_HAVE_MKL_CPARDISO)
110 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_MKL_CPardiso(void);
111 #endif
112 #if defined(PETSC_HAVE_SUITESPARSE)
113 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_SuiteSparse(void);
114 #endif
115 #if defined(PETSC_HAVE_LUSOL)
116 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_Lusol(void);
117 #endif
118 #if defined(PETSC_HAVE_HTOOL)
119 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_Htool(void);
120 #endif
121
122 PETSC_INTERN PetscErrorCode MatGetFactor_seqaij_petsc(Mat, MatFactorType, Mat *);
123 PETSC_INTERN PetscErrorCode MatGetFactor_seqbaij_petsc(Mat, MatFactorType, Mat *);
124 PETSC_INTERN PetscErrorCode MatGetFactor_seqsbaij_petsc(Mat, MatFactorType, Mat *);
125 PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat, MatFactorType, Mat *);
126 #if defined(PETSC_HAVE_CUDA)
127 PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_cuda(Mat, MatFactorType, Mat *);
128 #endif
129 #if defined(PETSC_HAVE_HIP)
130 PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_hip(Mat, MatFactorType, Mat *);
131 #endif
132 PETSC_INTERN PetscErrorCode MatGetFactor_constantdiagonal_petsc(Mat, MatFactorType, Mat *);
133 PETSC_INTERN PetscErrorCode MatGetFactor_seqaij_bas(Mat, MatFactorType, Mat *);
134
135 #include <petscbm.h>
136 PETSC_INTERN PetscErrorCode PetscBenchCreate_HPL(PetscBench);
137
138 /*@C
139 MatInitializePackage - This function initializes everything in the `Mat` package. It is called
140 from `PetscDLLibraryRegister_petscmat()` when using dynamic libraries, and on the first call to `MatCreate()`
141 when using shared or static libraries.
142
143 Level: developer
144
145 Note:
146 This function never needs to be called by PETSc users.
147
148 .seealso: [](ch_matrices), `Mat`, `PetscInitialize()`, `MatFinalizePackage()`
149 @*/
MatInitializePackage(void)150 PetscErrorCode MatInitializePackage(void)
151 {
152 char logList[256];
153 PetscBool opt, pkg;
154
155 PetscFunctionBegin;
156 if (MatPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
157 MatPackageInitialized = PETSC_TRUE;
158 /* Initialize subpackage */
159 PetscCall(MatMFFDInitializePackage());
160 /* Register Classes */
161 PetscCall(PetscClassIdRegister("Matrix", &MAT_CLASSID));
162 PetscCall(PetscClassIdRegister("Matrix FD Coloring", &MAT_FDCOLORING_CLASSID));
163 PetscCall(PetscClassIdRegister("Matrix Coloring", &MAT_COLORING_CLASSID));
164 PetscCall(PetscClassIdRegister("Matrix MatTranspose Coloring", &MAT_TRANSPOSECOLORING_CLASSID));
165 PetscCall(PetscClassIdRegister("Matrix Partitioning", &MAT_PARTITIONING_CLASSID));
166 PetscCall(PetscClassIdRegister("Matrix Coarsen", &MAT_COARSEN_CLASSID));
167 PetscCall(PetscClassIdRegister("Matrix Null Space", &MAT_NULLSPACE_CLASSID));
168 /* Register Constructors */
169 PetscCall(MatRegisterAll());
170 PetscCall(MatOrderingRegisterAll());
171 PetscCall(MatColoringRegisterAll());
172 PetscCall(MatPartitioningRegisterAll());
173 PetscCall(MatCoarsenRegisterAll());
174 PetscCall(MatSeqAIJRegisterAll());
175 /* Register Events */
176 PetscCall(PetscLogEventRegister("MatMult", MAT_CLASSID, &MAT_Mult));
177 PetscCall(PetscLogEventRegister("MatMultAdd", MAT_CLASSID, &MAT_MultAdd));
178 PetscCall(PetscLogEventRegister("MatMultTranspose", MAT_CLASSID, &MAT_MultTranspose));
179 PetscCall(PetscLogEventRegister("MatMultHermitian", MAT_CLASSID, &MAT_MultHermitianTranspose));
180 PetscCall(PetscLogEventRegister("MatMultTrAdd", MAT_CLASSID, &MAT_MultTransposeAdd));
181 PetscCall(PetscLogEventRegister("MatMultHTAdd", MAT_CLASSID, &MAT_MultHermitianTransposeAdd));
182 PetscCall(PetscLogEventRegister("MatSolve", MAT_CLASSID, &MAT_Solve));
183 PetscCall(PetscLogEventRegister("MatSolves", MAT_CLASSID, &MAT_Solves));
184 PetscCall(PetscLogEventRegister("MatSolveAdd", MAT_CLASSID, &MAT_SolveAdd));
185 PetscCall(PetscLogEventRegister("MatSolveTranspos", MAT_CLASSID, &MAT_SolveTranspose));
186 PetscCall(PetscLogEventRegister("MatSolveTrAdd", MAT_CLASSID, &MAT_SolveTransposeAdd));
187 PetscCall(PetscLogEventRegister("MatSOR", MAT_CLASSID, &MAT_SOR));
188 PetscCall(PetscLogEventRegister("MatForwardSolve", MAT_CLASSID, &MAT_ForwardSolve));
189 PetscCall(PetscLogEventRegister("MatBackwardSolve", MAT_CLASSID, &MAT_BackwardSolve));
190 PetscCall(PetscLogEventRegister("MatLUFactor", MAT_CLASSID, &MAT_LUFactor));
191 PetscCall(PetscLogEventRegister("MatLUFactorSym", MAT_CLASSID, &MAT_LUFactorSymbolic));
192 PetscCall(PetscLogEventRegister("MatLUFactorNum", MAT_CLASSID, &MAT_LUFactorNumeric));
193 PetscCall(PetscLogEventRegister("MatQRFactor", MAT_CLASSID, &MAT_QRFactor));
194 PetscCall(PetscLogEventRegister("MatQRFactorSym", MAT_CLASSID, &MAT_QRFactorSymbolic));
195 PetscCall(PetscLogEventRegister("MatQRFactorNum", MAT_CLASSID, &MAT_QRFactorNumeric));
196 PetscCall(PetscLogEventRegister("MatCholeskyFctr", MAT_CLASSID, &MAT_CholeskyFactor));
197 PetscCall(PetscLogEventRegister("MatCholFctrSym", MAT_CLASSID, &MAT_CholeskyFactorSymbolic));
198 PetscCall(PetscLogEventRegister("MatCholFctrNum", MAT_CLASSID, &MAT_CholeskyFactorNumeric));
199 PetscCall(PetscLogEventRegister("MatFctrFactSchur", MAT_CLASSID, &MAT_FactorFactS));
200 PetscCall(PetscLogEventRegister("MatFctrInvSchur", MAT_CLASSID, &MAT_FactorInvS));
201 PetscCall(PetscLogEventRegister("MatILUFactor", MAT_CLASSID, &MAT_ILUFactor));
202 PetscCall(PetscLogEventRegister("MatILUFactorSym", MAT_CLASSID, &MAT_ILUFactorSymbolic));
203 PetscCall(PetscLogEventRegister("MatICCFactorSym", MAT_CLASSID, &MAT_ICCFactorSymbolic));
204 PetscCall(PetscLogEventRegister("MatCopy", MAT_CLASSID, &MAT_Copy));
205 PetscCall(PetscLogEventRegister("MatConvert", MAT_CLASSID, &MAT_Convert));
206 PetscCall(PetscLogEventRegister("MatScale", MAT_CLASSID, &MAT_Scale));
207 PetscCall(PetscLogEventRegister("MatResidual", MAT_CLASSID, &MAT_Residual));
208 PetscCall(PetscLogEventRegister("MatAssemblyBegin", MAT_CLASSID, &MAT_AssemblyBegin));
209 PetscCall(PetscLogEventRegister("MatAssemblyEnd", MAT_CLASSID, &MAT_AssemblyEnd));
210 PetscCall(PetscLogEventRegister("MatSetValues", MAT_CLASSID, &MAT_SetValues));
211 PetscCall(PetscLogEventRegister("MatGetValues", MAT_CLASSID, &MAT_GetValues));
212 PetscCall(PetscLogEventRegister("MatGetRow", MAT_CLASSID, &MAT_GetRow));
213 PetscCall(PetscLogEventRegister("MatGetRowIJ", MAT_CLASSID, &MAT_GetRowIJ));
214 PetscCall(PetscLogEventRegister("MatCreateSubMats", MAT_CLASSID, &MAT_CreateSubMats));
215 PetscCall(PetscLogEventRegister("MatCreateSubMat", MAT_CLASSID, &MAT_CreateSubMat));
216 PetscCall(PetscLogEventRegister("MatGetOrdering", MAT_CLASSID, &MAT_GetOrdering));
217 PetscCall(PetscLogEventRegister("MatIncreaseOvrlp", MAT_CLASSID, &MAT_IncreaseOverlap));
218 PetscCall(PetscLogEventRegister("MatPartitioning", MAT_PARTITIONING_CLASSID, &MAT_Partitioning));
219 PetscCall(PetscLogEventRegister("MatPartitioningND", MAT_PARTITIONING_CLASSID, &MAT_PartitioningND));
220 PetscCall(PetscLogEventRegister("MatCoarsen", MAT_COARSEN_CLASSID, &MAT_Coarsen));
221 PetscCall(PetscLogEventRegister("MatZeroEntries", MAT_CLASSID, &MAT_ZeroEntries));
222 PetscCall(PetscLogEventRegister("MatLoad", MAT_CLASSID, &MAT_Load));
223 PetscCall(PetscLogEventRegister("MatView", MAT_CLASSID, &MAT_View));
224 PetscCall(PetscLogEventRegister("MatAXPY", MAT_CLASSID, &MAT_AXPY));
225 PetscCall(PetscLogEventRegister("MatFDColorCreate", MAT_FDCOLORING_CLASSID, &MAT_FDColoringCreate));
226 PetscCall(PetscLogEventRegister("MatFDColorSetUp", MAT_FDCOLORING_CLASSID, &MAT_FDColoringSetUp));
227 PetscCall(PetscLogEventRegister("MatFDColorApply", MAT_FDCOLORING_CLASSID, &MAT_FDColoringApply));
228 PetscCall(PetscLogEventRegister("MatFDColorFunc", MAT_FDCOLORING_CLASSID, &MAT_FDColoringFunction));
229 PetscCall(PetscLogEventRegister("MatTranspose", MAT_CLASSID, &MAT_Transpose));
230 PetscCall(PetscLogEventRegister("MatMatSolve", MAT_CLASSID, &MAT_MatSolve));
231 PetscCall(PetscLogEventRegister("MatMatTrSolve", MAT_CLASSID, &MAT_MatTrSolve));
232 PetscCall(PetscLogEventRegister("MatMatMultSym", MAT_CLASSID, &MAT_MatMultSymbolic));
233 PetscCall(PetscLogEventRegister("MatMatMultNum", MAT_CLASSID, &MAT_MatMultNumeric));
234 PetscCall(PetscLogEventRegister("MatMatMatMultSym", MAT_CLASSID, &MAT_MatMatMultSymbolic));
235 PetscCall(PetscLogEventRegister("MatMatMatMultNum", MAT_CLASSID, &MAT_MatMatMultNumeric));
236 PetscCall(PetscLogEventRegister("MatPtAPSymbolic", MAT_CLASSID, &MAT_PtAPSymbolic));
237 PetscCall(PetscLogEventRegister("MatPtAPNumeric", MAT_CLASSID, &MAT_PtAPNumeric));
238 PetscCall(PetscLogEventRegister("MatRARtSym", MAT_CLASSID, &MAT_RARtSymbolic));
239 PetscCall(PetscLogEventRegister("MatRARtNum", MAT_CLASSID, &MAT_RARtNumeric));
240 PetscCall(PetscLogEventRegister("MatMatTrnMultSym", MAT_CLASSID, &MAT_MatTransposeMultSymbolic));
241 PetscCall(PetscLogEventRegister("MatMatTrnMultNum", MAT_CLASSID, &MAT_MatTransposeMultNumeric));
242 PetscCall(PetscLogEventRegister("MatTrnMatMultSym", MAT_CLASSID, &MAT_TransposeMatMultSymbolic));
243 PetscCall(PetscLogEventRegister("MatTrnMatMultNum", MAT_CLASSID, &MAT_TransposeMatMultNumeric));
244 PetscCall(PetscLogEventRegister("MatTrnColorCreate", MAT_CLASSID, &MAT_TransposeColoringCreate));
245 PetscCall(PetscLogEventRegister("MatRedundantMat", MAT_CLASSID, &MAT_RedundantMat));
246 PetscCall(PetscLogEventRegister("MatGetSeqNZStrct", MAT_CLASSID, &MAT_GetSeqNonzeroStructure));
247 PetscCall(PetscLogEventRegister("MatGetMultiProcB", MAT_CLASSID, &MAT_GetMultiProcBlock));
248 PetscCall(PetscLogEventRegister("MatSetRandom", MAT_CLASSID, &MAT_SetRandom));
249
250 /* these may be specific to MPIAIJ matrices */
251 PetscCall(PetscLogEventRegister("MatMPISumSeqNumeric", MAT_CLASSID, &MAT_Seqstompinum));
252 PetscCall(PetscLogEventRegister("MatMPISumSeqSymbolic", MAT_CLASSID, &MAT_Seqstompisym));
253 PetscCall(PetscLogEventRegister("MatMPISumSeq", MAT_CLASSID, &MAT_Seqstompi));
254 PetscCall(PetscLogEventRegister("MatMPIConcateSeq", MAT_CLASSID, &MAT_Merge));
255 PetscCall(PetscLogEventRegister("MatGetLocalMat", MAT_CLASSID, &MAT_Getlocalmat));
256 PetscCall(PetscLogEventRegister("MatGetLocalMatCondensed", MAT_CLASSID, &MAT_Getlocalmatcondensed));
257 PetscCall(PetscLogEventRegister("MatGetBrowsOfAcols", MAT_CLASSID, &MAT_GetBrowsOfAcols));
258 PetscCall(PetscLogEventRegister("MatGetBrAoCol", MAT_CLASSID, &MAT_GetBrowsOfAocols));
259
260 PetscCall(PetscLogEventRegister("MatGetSymTransR", MAT_CLASSID, &MAT_Getsymtransreduced));
261 PetscCall(PetscLogEventRegister("MatCUSPARSCopyTo", MAT_CLASSID, &MAT_CUSPARSECopyToGPU));
262 PetscCall(PetscLogEventRegister("MatCUSPARSCopyFr", MAT_CLASSID, &MAT_CUSPARSECopyFromGPU));
263 PetscCall(PetscLogEventRegister("MatCUSPARSSolAnl", MAT_CLASSID, &MAT_CUSPARSESolveAnalysis));
264 PetscCall(PetscLogEventRegister("MatCUSPARSGenT", MAT_CLASSID, &MAT_CUSPARSEGenerateTranspose));
265 PetscCall(PetscLogEventRegister("MatHIPSPARSCopyTo", MAT_CLASSID, &MAT_HIPSPARSECopyToGPU));
266 PetscCall(PetscLogEventRegister("MatHIPSPARSCopyFr", MAT_CLASSID, &MAT_HIPSPARSECopyFromGPU));
267 PetscCall(PetscLogEventRegister("MatHIPSPARSSolAnl", MAT_CLASSID, &MAT_HIPSPARSESolveAnalysis));
268 PetscCall(PetscLogEventRegister("MatHIPSPARSGenT", MAT_CLASSID, &MAT_HIPSPARSEGenerateTranspose));
269 PetscCall(PetscLogEventRegister("MatVCLCopyTo", MAT_CLASSID, &MAT_ViennaCLCopyToGPU));
270 PetscCall(PetscLogEventRegister("MatDenseCopyTo", MAT_CLASSID, &MAT_DenseCopyToGPU));
271 PetscCall(PetscLogEventRegister("MatDenseCopyFrom", MAT_CLASSID, &MAT_DenseCopyFromGPU));
272 PetscCall(PetscLogEventRegister("MatSetValBatch", MAT_CLASSID, &MAT_SetValuesBatch));
273 PetscCall(PetscLogEventRegister("MatCreateGraph", MAT_CLASSID, &MAT_CreateGraph));
274
275 PetscCall(PetscLogEventRegister("MatColoringApply", MAT_COLORING_CLASSID, &MATCOLORING_Apply));
276 PetscCall(PetscLogEventRegister("MatColoringComm", MAT_COLORING_CLASSID, &MATCOLORING_Comm));
277 PetscCall(PetscLogEventRegister("MatColoringLocal", MAT_COLORING_CLASSID, &MATCOLORING_Local));
278 PetscCall(PetscLogEventRegister("MatColoringIS", MAT_COLORING_CLASSID, &MATCOLORING_ISCreate));
279 PetscCall(PetscLogEventRegister("MatColoringSetUp", MAT_COLORING_CLASSID, &MATCOLORING_SetUp));
280 PetscCall(PetscLogEventRegister("MatColoringWeights", MAT_COLORING_CLASSID, &MATCOLORING_Weights));
281
282 PetscCall(PetscLogEventRegister("MatSetPreallCOO", MAT_CLASSID, &MAT_PreallCOO));
283 PetscCall(PetscLogEventRegister("MatSetValuesCOO", MAT_CLASSID, &MAT_SetVCOO));
284
285 PetscCall(PetscLogEventRegister("MatH2OpusBuild", MAT_CLASSID, &MAT_H2Opus_Build));
286 PetscCall(PetscLogEventRegister("MatH2OpusComp", MAT_CLASSID, &MAT_H2Opus_Compress));
287 PetscCall(PetscLogEventRegister("MatH2OpusOrth", MAT_CLASSID, &MAT_H2Opus_Orthog));
288 PetscCall(PetscLogEventRegister("MatH2OpusLR", MAT_CLASSID, &MAT_H2Opus_LR));
289
290 /* Mark non-collective events */
291 PetscCall(PetscLogEventSetCollective(MAT_SetValues, PETSC_FALSE));
292 PetscCall(PetscLogEventSetCollective(MAT_SetValuesBatch, PETSC_FALSE));
293 PetscCall(PetscLogEventSetCollective(MAT_GetRow, PETSC_FALSE));
294 /* Turn off high traffic events by default */
295 PetscCall(PetscLogEventSetActiveAll(MAT_SetValues, PETSC_FALSE));
296 PetscCall(PetscLogEventSetActiveAll(MAT_GetValues, PETSC_FALSE));
297 PetscCall(PetscLogEventSetActiveAll(MAT_GetRow, PETSC_FALSE));
298 /* Process Info */
299 {
300 PetscClassId classids[7];
301
302 classids[0] = MAT_CLASSID;
303 classids[1] = MAT_FDCOLORING_CLASSID;
304 classids[2] = MAT_COLORING_CLASSID;
305 classids[3] = MAT_TRANSPOSECOLORING_CLASSID;
306 classids[4] = MAT_PARTITIONING_CLASSID;
307 classids[5] = MAT_COARSEN_CLASSID;
308 classids[6] = MAT_NULLSPACE_CLASSID;
309 PetscCall(PetscInfoProcessClass("mat", 7, classids));
310 }
311
312 /* Process summary exclusions */
313 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
314 if (opt) {
315 PetscCall(PetscStrInList("mat", logList, ',', &pkg));
316 if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_CLASSID));
317 if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_FDCOLORING_CLASSID));
318 if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_COLORING_CLASSID));
319 if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_TRANSPOSECOLORING_CLASSID));
320 if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_PARTITIONING_CLASSID));
321 if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_COARSEN_CLASSID));
322 if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_NULLSPACE_CLASSID));
323 }
324
325 /* Register the PETSc built in factorization based solvers */
326 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
327 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
328 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
329 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));
330
331 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
332 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
333 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
334 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));
335
336 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_LU, MatGetFactor_constantdiagonal_petsc));
337 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_CHOLESKY, MatGetFactor_constantdiagonal_petsc));
338 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_ILU, MatGetFactor_constantdiagonal_petsc));
339 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_ICC, MatGetFactor_constantdiagonal_petsc));
340
341 #if defined(PETSC_HAVE_MKL_SPARSE)
342 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
343 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
344 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
345 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));
346
347 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_LU, MatGetFactor_seqbaij_petsc));
348 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_CHOLESKY, MatGetFactor_seqbaij_petsc));
349 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_ILU, MatGetFactor_seqbaij_petsc));
350 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_ICC, MatGetFactor_seqbaij_petsc));
351 #endif
352 /* Above, we register the PETSc built-in factorization solvers for MATSEQAIJMKL. In the future, we may want to use
353 * some of the MKL-provided ones instead. */
354
355 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
356 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
357 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
358 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));
359
360 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_LU, MatGetFactor_seqbaij_petsc));
361 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqbaij_petsc));
362 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_ILU, MatGetFactor_seqbaij_petsc));
363 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_ICC, MatGetFactor_seqbaij_petsc));
364
365 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqsbaij_petsc));
366 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_ICC, MatGetFactor_seqsbaij_petsc));
367
368 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_LU, MatGetFactor_seqdense_petsc));
369 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_ILU, MatGetFactor_seqdense_petsc));
370 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_CHOLESKY, MatGetFactor_seqdense_petsc));
371 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_QR, MatGetFactor_seqdense_petsc));
372 #if defined(PETSC_HAVE_CUDA)
373 PetscCall(MatSolverTypeRegister_DENSECUDA());
374 #endif
375 #if defined(PETSC_HAVE_HIP)
376 PetscCall(MatSolverTypeRegister_DENSEHIP());
377 #endif
378
379 PetscCall(MatSolverTypeRegister(MATSOLVERBAS, MATSEQAIJ, MAT_FACTOR_ICC, MatGetFactor_seqaij_bas));
380
381 /*
382 Register the external package factorization based solvers
383 Eventually we don't want to have these hardwired here at compile time of PETSc
384 */
385 #if defined(PETSC_HAVE_MUMPS)
386 PetscCall(MatSolverTypeRegister_MUMPS());
387 #endif
388 #if defined(PETSC_HAVE_CUDA)
389 PetscCall(MatSolverTypeRegister_CUSPARSE());
390 #endif
391 #if defined(PETSC_HAVE_HIP)
392 PetscCall(MatSolverTypeRegister_HIPSPARSE());
393 #endif
394 #if defined(PETSC_HAVE_KOKKOS_KERNELS)
395 PetscCall(MatSolverTypeRegister_Kokkos());
396 #endif
397 #if defined(PETSC_HAVE_VIENNACL)
398 PetscCall(MatSolverTypeRegister_ViennaCL());
399 #endif
400 #if defined(PETSC_HAVE_ELEMENTAL)
401 PetscCall(MatSolverTypeRegister_Elemental());
402 #endif
403 #if defined(PETSC_HAVE_SCALAPACK) && (defined(PETSC_USE_REAL_SINGLE) || defined(PETSC_USE_REAL_DOUBLE))
404 PetscCall(MatSolverTypeRegister_ScaLAPACK());
405 #endif
406 #if defined(PETSC_HAVE_MATLAB)
407 PetscCall(MatSolverTypeRegister_Matlab());
408 #endif
409 #if defined(PETSC_HAVE_ESSL)
410 PetscCall(MatSolverTypeRegister_Essl());
411 #endif
412 #if defined(PETSC_HAVE_SUPERLU)
413 PetscCall(MatSolverTypeRegister_SuperLU());
414 #endif
415 #if defined(PETSC_HAVE_STRUMPACK)
416 PetscCall(MatSolverTypeRegister_STRUMPACK());
417 #endif
418 #if defined(PETSC_HAVE_PASTIX)
419 PetscCall(MatSolverTypeRegister_Pastix());
420 #endif
421 #if defined(PETSC_HAVE_SUPERLU_DIST)
422 PetscCall(MatSolverTypeRegister_SuperLU_DIST());
423 #endif
424 #if defined(PETSC_HAVE_MKL_PARDISO)
425 PetscCall(MatSolverTypeRegister_MKL_Pardiso());
426 #endif
427 #if defined(PETSC_HAVE_MKL_CPARDISO)
428 PetscCall(MatSolverTypeRegister_MKL_CPardiso());
429 #endif
430 #if defined(PETSC_HAVE_SUITESPARSE)
431 PetscCall(MatSolverTypeRegister_SuiteSparse());
432 #endif
433 #if defined(PETSC_HAVE_LUSOL)
434 PetscCall(MatSolverTypeRegister_Lusol());
435 #endif
436 #if defined(PETSC_HAVE_HTOOL)
437 PetscCall(MatSolverTypeRegister_Htool());
438 #endif
439 #if defined(PETSC_HAVE_HPL)
440 PetscCall(PetscBenchRegister(PETSCBMHPL, PetscBenchCreate_HPL));
441 #endif
442 /* Register package finalizer */
443 PetscCall(PetscRegisterFinalize(MatFinalizePackage));
444 PetscFunctionReturn(PETSC_SUCCESS);
445 }
446
447 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
448 /*
449 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
450
451 This one registers all the matrix methods that are in the basic PETSc Matrix library.
452
453 */
PetscDLLibraryRegister_petscmat(void)454 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscmat(void)
455 {
456 PetscFunctionBegin;
457 PetscCall(MatInitializePackage());
458 PetscFunctionReturn(PETSC_SUCCESS);
459 }
460
461 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
462