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