xref: /petsc/src/mat/interface/dlregismat.c (revision 9a2cd68e563fb69dfcb2578ce58f7db064c2e0fb)
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 MatMFFDInitializePackage(void);
17 extern PetscErrorCode MatSolverTypeDestroy(void);
18 static PetscBool      MatPackageInitialized = PETSC_FALSE;
19 /*@C
20   MatFinalizePackage - This function destroys everything in the Petsc interface to the `Mat` package. It is
21   called from `PetscFinalize()`.
22 
23   Level: developer
24 
25 .seealso: `Mat`, `PetscFinalize()`, `MatInitializePackage()`
26 @*/
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_EXTERN PetscErrorCode MatSolverTypeRegister_MUMPS(void);
69 #endif
70 #if defined(PETSC_HAVE_CUDA)
71 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_CUSPARSE(void);
72 #endif
73 #if defined(PETSC_HAVE_HIP)
74 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_HIPSPARSE(void);
75 #endif
76 #if defined(PETSC_HAVE_KOKKOS_KERNELS)
77 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_KOKKOS(void);
78 #endif
79 #if defined(PETSC_HAVE_VIENNACL)
80 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_ViennaCL(void);
81 #endif
82 #if defined(PETSC_HAVE_ELEMENTAL)
83 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Elemental(void);
84 #endif
85 #if defined(PETSC_HAVE_SCALAPACK)
86 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_ScaLAPACK(void);
87 #endif
88 #if defined(PETSC_HAVE_MATLAB)
89 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Matlab(void);
90 #endif
91 #if defined(PETSC_HAVE_ESSL)
92 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Essl(void);
93 #endif
94 #if defined(PETSC_HAVE_SUPERLU)
95 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SuperLU(void);
96 #endif
97 #if defined(PETSC_HAVE_STRUMPACK)
98 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_STRUMPACK(void);
99 #endif
100 #if defined(PETSC_HAVE_PASTIX)
101 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Pastix(void);
102 #endif
103 #if defined(PETSC_HAVE_SUPERLU_DIST)
104 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SuperLU_DIST(void);
105 #endif
106 #if defined(PETSC_HAVE_ELEMENTAL)
107 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SparseElemental(void);
108 #endif
109 #if defined(PETSC_HAVE_MKL_PARDISO)
110 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_MKL_Pardiso(void);
111 #endif
112 #if defined(PETSC_HAVE_MKL_CPARDISO)
113 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_MKL_CPardiso(void);
114 #endif
115 #if defined(PETSC_HAVE_SUITESPARSE)
116 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SuiteSparse(void);
117 #endif
118 #if defined(PETSC_HAVE_LUSOL)
119 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Lusol(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 /*@C
136   MatInitializePackage - This function initializes everything in the `Mat` package. It is called
137   from `PetscDLLibraryRegister_petscmat()` when using dynamic libraries, and on the first call to `MatCreate()`
138   when using shared or static libraries.
139 
140   Level: developer
141 
142 .seealso: [](ch_matrices), `Mat`, `PetscInitialize()`, `MatFinalizePackage()`
143 @*/
144 PetscErrorCode MatInitializePackage(void)
145 {
146   char      logList[256];
147   PetscBool opt, pkg;
148 
149   PetscFunctionBegin;
150   if (MatPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
151   MatPackageInitialized = PETSC_TRUE;
152   /* Initialize subpackage */
153   PetscCall(MatMFFDInitializePackage());
154   /* Register Classes */
155   PetscCall(PetscClassIdRegister("Matrix", &MAT_CLASSID));
156   PetscCall(PetscClassIdRegister("Matrix FD Coloring", &MAT_FDCOLORING_CLASSID));
157   PetscCall(PetscClassIdRegister("Matrix Coloring", &MAT_COLORING_CLASSID));
158   PetscCall(PetscClassIdRegister("Matrix MatTranspose Coloring", &MAT_TRANSPOSECOLORING_CLASSID));
159   PetscCall(PetscClassIdRegister("Matrix Partitioning", &MAT_PARTITIONING_CLASSID));
160   PetscCall(PetscClassIdRegister("Matrix Coarsen", &MAT_COARSEN_CLASSID));
161   PetscCall(PetscClassIdRegister("Matrix Null Space", &MAT_NULLSPACE_CLASSID));
162   /* Register Constructors */
163   PetscCall(MatRegisterAll());
164   PetscCall(MatOrderingRegisterAll());
165   PetscCall(MatColoringRegisterAll());
166   PetscCall(MatPartitioningRegisterAll());
167   PetscCall(MatCoarsenRegisterAll());
168   PetscCall(MatSeqAIJRegisterAll());
169   /* Register Events */
170   PetscCall(PetscLogEventRegister("MatMult", MAT_CLASSID, &MAT_Mult));
171   PetscCall(PetscLogEventRegister("MatMultAdd", MAT_CLASSID, &MAT_MultAdd));
172   PetscCall(PetscLogEventRegister("MatMultTranspose", MAT_CLASSID, &MAT_MultTranspose));
173   PetscCall(PetscLogEventRegister("MatMultHermitian", MAT_CLASSID, &MAT_MultHermitianTranspose));
174   PetscCall(PetscLogEventRegister("MatMultTrAdd", MAT_CLASSID, &MAT_MultTransposeAdd));
175   PetscCall(PetscLogEventRegister("MatMultHTAdd", MAT_CLASSID, &MAT_MultHermitianTransposeAdd));
176   PetscCall(PetscLogEventRegister("MatSolve", MAT_CLASSID, &MAT_Solve));
177   PetscCall(PetscLogEventRegister("MatSolves", MAT_CLASSID, &MAT_Solves));
178   PetscCall(PetscLogEventRegister("MatSolveAdd", MAT_CLASSID, &MAT_SolveAdd));
179   PetscCall(PetscLogEventRegister("MatSolveTranspos", MAT_CLASSID, &MAT_SolveTranspose));
180   PetscCall(PetscLogEventRegister("MatSolveTrAdd", MAT_CLASSID, &MAT_SolveTransposeAdd));
181   PetscCall(PetscLogEventRegister("MatSOR", MAT_CLASSID, &MAT_SOR));
182   PetscCall(PetscLogEventRegister("MatForwardSolve", MAT_CLASSID, &MAT_ForwardSolve));
183   PetscCall(PetscLogEventRegister("MatBackwardSolve", MAT_CLASSID, &MAT_BackwardSolve));
184   PetscCall(PetscLogEventRegister("MatLUFactor", MAT_CLASSID, &MAT_LUFactor));
185   PetscCall(PetscLogEventRegister("MatLUFactorSym", MAT_CLASSID, &MAT_LUFactorSymbolic));
186   PetscCall(PetscLogEventRegister("MatLUFactorNum", MAT_CLASSID, &MAT_LUFactorNumeric));
187   PetscCall(PetscLogEventRegister("MatQRFactor", MAT_CLASSID, &MAT_QRFactor));
188   PetscCall(PetscLogEventRegister("MatQRFactorSym", MAT_CLASSID, &MAT_QRFactorSymbolic));
189   PetscCall(PetscLogEventRegister("MatQRFactorNum", MAT_CLASSID, &MAT_QRFactorNumeric));
190   PetscCall(PetscLogEventRegister("MatCholeskyFctr", MAT_CLASSID, &MAT_CholeskyFactor));
191   PetscCall(PetscLogEventRegister("MatCholFctrSym", MAT_CLASSID, &MAT_CholeskyFactorSymbolic));
192   PetscCall(PetscLogEventRegister("MatCholFctrNum", MAT_CLASSID, &MAT_CholeskyFactorNumeric));
193   PetscCall(PetscLogEventRegister("MatFctrFactSchur", MAT_CLASSID, &MAT_FactorFactS));
194   PetscCall(PetscLogEventRegister("MatFctrInvSchur", MAT_CLASSID, &MAT_FactorInvS));
195   PetscCall(PetscLogEventRegister("MatILUFactor", MAT_CLASSID, &MAT_ILUFactor));
196   PetscCall(PetscLogEventRegister("MatILUFactorSym", MAT_CLASSID, &MAT_ILUFactorSymbolic));
197   PetscCall(PetscLogEventRegister("MatICCFactorSym", MAT_CLASSID, &MAT_ICCFactorSymbolic));
198   PetscCall(PetscLogEventRegister("MatCopy", MAT_CLASSID, &MAT_Copy));
199   PetscCall(PetscLogEventRegister("MatConvert", MAT_CLASSID, &MAT_Convert));
200   PetscCall(PetscLogEventRegister("MatScale", MAT_CLASSID, &MAT_Scale));
201   PetscCall(PetscLogEventRegister("MatResidual", MAT_CLASSID, &MAT_Residual));
202   PetscCall(PetscLogEventRegister("MatAssemblyBegin", MAT_CLASSID, &MAT_AssemblyBegin));
203   PetscCall(PetscLogEventRegister("MatAssemblyEnd", MAT_CLASSID, &MAT_AssemblyEnd));
204   PetscCall(PetscLogEventRegister("MatSetValues", MAT_CLASSID, &MAT_SetValues));
205   PetscCall(PetscLogEventRegister("MatGetValues", MAT_CLASSID, &MAT_GetValues));
206   PetscCall(PetscLogEventRegister("MatGetRow", MAT_CLASSID, &MAT_GetRow));
207   PetscCall(PetscLogEventRegister("MatGetRowIJ", MAT_CLASSID, &MAT_GetRowIJ));
208   PetscCall(PetscLogEventRegister("MatCreateSubMats", MAT_CLASSID, &MAT_CreateSubMats));
209   PetscCall(PetscLogEventRegister("MatCreateSubMat", MAT_CLASSID, &MAT_CreateSubMat));
210   PetscCall(PetscLogEventRegister("MatGetOrdering", MAT_CLASSID, &MAT_GetOrdering));
211   PetscCall(PetscLogEventRegister("MatIncreaseOvrlp", MAT_CLASSID, &MAT_IncreaseOverlap));
212   PetscCall(PetscLogEventRegister("MatPartitioning", MAT_PARTITIONING_CLASSID, &MAT_Partitioning));
213   PetscCall(PetscLogEventRegister("MatPartitioningND", MAT_PARTITIONING_CLASSID, &MAT_PartitioningND));
214   PetscCall(PetscLogEventRegister("MatCoarsen", MAT_COARSEN_CLASSID, &MAT_Coarsen));
215   PetscCall(PetscLogEventRegister("MatZeroEntries", MAT_CLASSID, &MAT_ZeroEntries));
216   PetscCall(PetscLogEventRegister("MatLoad", MAT_CLASSID, &MAT_Load));
217   PetscCall(PetscLogEventRegister("MatView", MAT_CLASSID, &MAT_View));
218   PetscCall(PetscLogEventRegister("MatAXPY", MAT_CLASSID, &MAT_AXPY));
219   PetscCall(PetscLogEventRegister("MatFDColorCreate", MAT_FDCOLORING_CLASSID, &MAT_FDColoringCreate));
220   PetscCall(PetscLogEventRegister("MatFDColorSetUp", MAT_FDCOLORING_CLASSID, &MAT_FDColoringSetUp));
221   PetscCall(PetscLogEventRegister("MatFDColorApply", MAT_FDCOLORING_CLASSID, &MAT_FDColoringApply));
222   PetscCall(PetscLogEventRegister("MatFDColorFunc", MAT_FDCOLORING_CLASSID, &MAT_FDColoringFunction));
223   PetscCall(PetscLogEventRegister("MatTranspose", MAT_CLASSID, &MAT_Transpose));
224   PetscCall(PetscLogEventRegister("MatMatSolve", MAT_CLASSID, &MAT_MatSolve));
225   PetscCall(PetscLogEventRegister("MatMatTrSolve", MAT_CLASSID, &MAT_MatTrSolve));
226   PetscCall(PetscLogEventRegister("MatMatMultSym", MAT_CLASSID, &MAT_MatMultSymbolic));
227   PetscCall(PetscLogEventRegister("MatMatMultNum", MAT_CLASSID, &MAT_MatMultNumeric));
228   PetscCall(PetscLogEventRegister("MatMatMatMultSym", MAT_CLASSID, &MAT_MatMatMultSymbolic));
229   PetscCall(PetscLogEventRegister("MatMatMatMultNum", MAT_CLASSID, &MAT_MatMatMultNumeric));
230   PetscCall(PetscLogEventRegister("MatPtAPSymbolic", MAT_CLASSID, &MAT_PtAPSymbolic));
231   PetscCall(PetscLogEventRegister("MatPtAPNumeric", MAT_CLASSID, &MAT_PtAPNumeric));
232   PetscCall(PetscLogEventRegister("MatRARtSym", MAT_CLASSID, &MAT_RARtSymbolic));
233   PetscCall(PetscLogEventRegister("MatRARtNum", MAT_CLASSID, &MAT_RARtNumeric));
234   PetscCall(PetscLogEventRegister("MatMatTrnMultSym", MAT_CLASSID, &MAT_MatTransposeMultSymbolic));
235   PetscCall(PetscLogEventRegister("MatMatTrnMultNum", MAT_CLASSID, &MAT_MatTransposeMultNumeric));
236   PetscCall(PetscLogEventRegister("MatTrnMatMultSym", MAT_CLASSID, &MAT_TransposeMatMultSymbolic));
237   PetscCall(PetscLogEventRegister("MatTrnMatMultNum", MAT_CLASSID, &MAT_TransposeMatMultNumeric));
238   PetscCall(PetscLogEventRegister("MatTrnColorCreate", MAT_CLASSID, &MAT_TransposeColoringCreate));
239   PetscCall(PetscLogEventRegister("MatRedundantMat", MAT_CLASSID, &MAT_RedundantMat));
240   PetscCall(PetscLogEventRegister("MatGetSeqNZStrct", MAT_CLASSID, &MAT_GetSeqNonzeroStructure));
241   PetscCall(PetscLogEventRegister("MatGetMultiProcB", MAT_CLASSID, &MAT_GetMultiProcBlock));
242   PetscCall(PetscLogEventRegister("MatSetRandom", MAT_CLASSID, &MAT_SetRandom));
243 
244   /* these may be specific to MPIAIJ matrices */
245   PetscCall(PetscLogEventRegister("MatMPISumSeqNumeric", MAT_CLASSID, &MAT_Seqstompinum));
246   PetscCall(PetscLogEventRegister("MatMPISumSeqSymbolic", MAT_CLASSID, &MAT_Seqstompisym));
247   PetscCall(PetscLogEventRegister("MatMPISumSeq", MAT_CLASSID, &MAT_Seqstompi));
248   PetscCall(PetscLogEventRegister("MatMPIConcateSeq", MAT_CLASSID, &MAT_Merge));
249   PetscCall(PetscLogEventRegister("MatGetLocalMat", MAT_CLASSID, &MAT_Getlocalmat));
250   PetscCall(PetscLogEventRegister("MatGetLocalMatCondensed", MAT_CLASSID, &MAT_Getlocalmatcondensed));
251   PetscCall(PetscLogEventRegister("MatGetBrowsOfAcols", MAT_CLASSID, &MAT_GetBrowsOfAcols));
252   PetscCall(PetscLogEventRegister("MatGetBrAoCol", MAT_CLASSID, &MAT_GetBrowsOfAocols));
253 
254   PetscCall(PetscLogEventRegister("MatGetSymTransR", MAT_CLASSID, &MAT_Getsymtransreduced));
255   PetscCall(PetscLogEventRegister("MatCUSPARSCopyTo", MAT_CLASSID, &MAT_CUSPARSECopyToGPU));
256   PetscCall(PetscLogEventRegister("MatCUSPARSCopyFr", MAT_CLASSID, &MAT_CUSPARSECopyFromGPU));
257   PetscCall(PetscLogEventRegister("MatCUSPARSSolAnl", MAT_CLASSID, &MAT_CUSPARSESolveAnalysis));
258   PetscCall(PetscLogEventRegister("MatCUSPARSGenT", MAT_CLASSID, &MAT_CUSPARSEGenerateTranspose));
259   PetscCall(PetscLogEventRegister("MatHIPSPARSCopyTo", MAT_CLASSID, &MAT_HIPSPARSECopyToGPU));
260   PetscCall(PetscLogEventRegister("MatHIPSPARSCopyFr", MAT_CLASSID, &MAT_HIPSPARSECopyFromGPU));
261   PetscCall(PetscLogEventRegister("MatHIPSPARSSolAnl", MAT_CLASSID, &MAT_HIPSPARSESolveAnalysis));
262   PetscCall(PetscLogEventRegister("MatHIPSPARSGenT", MAT_CLASSID, &MAT_HIPSPARSEGenerateTranspose));
263   PetscCall(PetscLogEventRegister("MatVCLCopyTo", MAT_CLASSID, &MAT_ViennaCLCopyToGPU));
264   PetscCall(PetscLogEventRegister("MatDenseCopyTo", MAT_CLASSID, &MAT_DenseCopyToGPU));
265   PetscCall(PetscLogEventRegister("MatDenseCopyFrom", MAT_CLASSID, &MAT_DenseCopyFromGPU));
266   PetscCall(PetscLogEventRegister("MatSetValBatch", MAT_CLASSID, &MAT_SetValuesBatch));
267 
268   PetscCall(PetscLogEventRegister("MatColoringApply", MAT_COLORING_CLASSID, &MATCOLORING_Apply));
269   PetscCall(PetscLogEventRegister("MatColoringComm", MAT_COLORING_CLASSID, &MATCOLORING_Comm));
270   PetscCall(PetscLogEventRegister("MatColoringLocal", MAT_COLORING_CLASSID, &MATCOLORING_Local));
271   PetscCall(PetscLogEventRegister("MatColoringIS", MAT_COLORING_CLASSID, &MATCOLORING_ISCreate));
272   PetscCall(PetscLogEventRegister("MatColoringSetUp", MAT_COLORING_CLASSID, &MATCOLORING_SetUp));
273   PetscCall(PetscLogEventRegister("MatColoringWeights", MAT_COLORING_CLASSID, &MATCOLORING_Weights));
274 
275   PetscCall(PetscLogEventRegister("MatSetPreallCOO", MAT_CLASSID, &MAT_PreallCOO));
276   PetscCall(PetscLogEventRegister("MatSetValuesCOO", MAT_CLASSID, &MAT_SetVCOO));
277 
278   PetscCall(PetscLogEventRegister("MatH2OpusBuild", MAT_CLASSID, &MAT_H2Opus_Build));
279   PetscCall(PetscLogEventRegister("MatH2OpusComp", MAT_CLASSID, &MAT_H2Opus_Compress));
280   PetscCall(PetscLogEventRegister("MatH2OpusOrth", MAT_CLASSID, &MAT_H2Opus_Orthog));
281   PetscCall(PetscLogEventRegister("MatH2OpusLR", MAT_CLASSID, &MAT_H2Opus_LR));
282 
283   /* Mark non-collective events */
284   PetscCall(PetscLogEventSetCollective(MAT_SetValues, PETSC_FALSE));
285   PetscCall(PetscLogEventSetCollective(MAT_SetValuesBatch, PETSC_FALSE));
286   PetscCall(PetscLogEventSetCollective(MAT_GetRow, PETSC_FALSE));
287   /* Turn off high traffic events by default */
288   PetscCall(PetscLogEventSetActiveAll(MAT_SetValues, PETSC_FALSE));
289   PetscCall(PetscLogEventSetActiveAll(MAT_GetValues, PETSC_FALSE));
290   PetscCall(PetscLogEventSetActiveAll(MAT_GetRow, PETSC_FALSE));
291   /* Process Info */
292   {
293     PetscClassId classids[7];
294 
295     classids[0] = MAT_CLASSID;
296     classids[1] = MAT_FDCOLORING_CLASSID;
297     classids[2] = MAT_COLORING_CLASSID;
298     classids[3] = MAT_TRANSPOSECOLORING_CLASSID;
299     classids[4] = MAT_PARTITIONING_CLASSID;
300     classids[5] = MAT_COARSEN_CLASSID;
301     classids[6] = MAT_NULLSPACE_CLASSID;
302     PetscCall(PetscInfoProcessClass("mat", 7, classids));
303   }
304 
305   /* Process summary exclusions */
306   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
307   if (opt) {
308     PetscCall(PetscStrInList("mat", logList, ',', &pkg));
309     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_CLASSID));
310     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_FDCOLORING_CLASSID));
311     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_COLORING_CLASSID));
312     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_TRANSPOSECOLORING_CLASSID));
313     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_PARTITIONING_CLASSID));
314     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_COARSEN_CLASSID));
315     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_NULLSPACE_CLASSID));
316   }
317 
318   /* Register the PETSc built in factorization based solvers */
319   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
320   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
321   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
322   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));
323 
324   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
325   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
326   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
327   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));
328 
329   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_LU, MatGetFactor_constantdiagonal_petsc));
330   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_CHOLESKY, MatGetFactor_constantdiagonal_petsc));
331   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_ILU, MatGetFactor_constantdiagonal_petsc));
332   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_ICC, MatGetFactor_constantdiagonal_petsc));
333 
334 #if defined(PETSC_HAVE_MKL_SPARSE)
335   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
336   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
337   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
338   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));
339 
340   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_LU, MatGetFactor_seqbaij_petsc));
341   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_CHOLESKY, MatGetFactor_seqbaij_petsc));
342   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_ILU, MatGetFactor_seqbaij_petsc));
343   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_ICC, MatGetFactor_seqbaij_petsc));
344 #endif
345   /* Above, we register the PETSc built-in factorization solvers for MATSEQAIJMKL.  In the future, we may want to use
346      * some of the MKL-provided ones instead. */
347 
348   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
349   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
350   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
351   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));
352 
353   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_LU, MatGetFactor_seqbaij_petsc));
354   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqbaij_petsc));
355   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_ILU, MatGetFactor_seqbaij_petsc));
356   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_ICC, MatGetFactor_seqbaij_petsc));
357 
358   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqsbaij_petsc));
359   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_ICC, MatGetFactor_seqsbaij_petsc));
360 
361   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_LU, MatGetFactor_seqdense_petsc));
362   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_ILU, MatGetFactor_seqdense_petsc));
363   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_CHOLESKY, MatGetFactor_seqdense_petsc));
364   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_QR, MatGetFactor_seqdense_petsc));
365 #if defined(PETSC_HAVE_CUDA)
366   PetscCall(MatSolverTypeRegister_DENSECUDA());
367 #endif
368 #if defined(PETSC_HAVE_HIP)
369   PetscCall(MatSolverTypeRegister_DENSEHIP());
370 #endif
371 
372   PetscCall(MatSolverTypeRegister(MATSOLVERBAS, MATSEQAIJ, MAT_FACTOR_ICC, MatGetFactor_seqaij_bas));
373 
374   /*
375      Register the external package factorization based solvers
376         Eventually we don't want to have these hardwired here at compile time of PETSc
377   */
378 #if defined(PETSC_HAVE_MUMPS)
379   PetscCall(MatSolverTypeRegister_MUMPS());
380 #endif
381 #if defined(PETSC_HAVE_CUDA)
382   PetscCall(MatSolverTypeRegister_CUSPARSE());
383 #endif
384 #if defined(PETSC_HAVE_HIP)
385   PetscCall(MatSolverTypeRegister_HIPSPARSE());
386 #endif
387 #if defined(PETSC_HAVE_KOKKOS_KERNELS)
388   PetscCall(MatSolverTypeRegister_KOKKOS());
389 #endif
390 #if defined(PETSC_HAVE_VIENNACL)
391   PetscCall(MatSolverTypeRegister_ViennaCL());
392 #endif
393 #if defined(PETSC_HAVE_ELEMENTAL)
394   PetscCall(MatSolverTypeRegister_Elemental());
395 #endif
396 #if defined(PETSC_HAVE_SCALAPACK)
397   PetscCall(MatSolverTypeRegister_ScaLAPACK());
398 #endif
399 #if defined(PETSC_HAVE_MATLAB)
400   PetscCall(MatSolverTypeRegister_Matlab());
401 #endif
402 #if defined(PETSC_HAVE_ESSL)
403   PetscCall(MatSolverTypeRegister_Essl());
404 #endif
405 #if defined(PETSC_HAVE_SUPERLU)
406   PetscCall(MatSolverTypeRegister_SuperLU());
407 #endif
408 #if defined(PETSC_HAVE_STRUMPACK)
409   PetscCall(MatSolverTypeRegister_STRUMPACK());
410 #endif
411 #if defined(PETSC_HAVE_PASTIX)
412   PetscCall(MatSolverTypeRegister_Pastix());
413 #endif
414 #if defined(PETSC_HAVE_SUPERLU_DIST)
415   PetscCall(MatSolverTypeRegister_SuperLU_DIST());
416 #endif
417 #if defined(PETSC_HAVE_ELEMENTAL)
418   PetscCall(MatSolverTypeRegister_SparseElemental());
419 #endif
420 #if defined(PETSC_HAVE_MKL_PARDISO)
421   PetscCall(MatSolverTypeRegister_MKL_Pardiso());
422 #endif
423 #if defined(PETSC_HAVE_MKL_CPARDISO)
424   PetscCall(MatSolverTypeRegister_MKL_CPardiso());
425 #endif
426 #if defined(PETSC_HAVE_SUITESPARSE)
427   PetscCall(MatSolverTypeRegister_SuiteSparse());
428 #endif
429 #if defined(PETSC_HAVE_LUSOL)
430   PetscCall(MatSolverTypeRegister_Lusol());
431 #endif
432   /* Register package finalizer */
433   PetscCall(PetscRegisterFinalize(MatFinalizePackage));
434   PetscFunctionReturn(PETSC_SUCCESS);
435 }
436 
437 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
438 /*
439   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
440 
441   This one registers all the matrix methods that are in the basic PETSc Matrix library.
442 
443  */
444 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscmat(void)
445 {
446   PetscFunctionBegin;
447   PetscCall(MatInitializePackage());
448   PetscFunctionReturn(PETSC_SUCCESS);
449 }
450 
451 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
452