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