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