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