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