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