xref: /petsc/src/mat/interface/dlregismat.c (revision 40badf4fbc550ac1f60bd080eaff6de6d55b946d)
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   CHKERRQ(MatSolverTypeDestroy());
58   while (names) {
59     nnames = names->next;
60     CHKERRQ(PetscFree(names->rname));
61     CHKERRQ(PetscFree(names->sname));
62     CHKERRQ(PetscFree(names->mname));
63     CHKERRQ(PetscFree(names));
64     names  = nnames;
65   }
66   CHKERRQ(PetscFunctionListDestroy(&MatList));
67   CHKERRQ(PetscFunctionListDestroy(&MatOrderingList));
68   CHKERRQ(PetscFunctionListDestroy(&MatColoringList));
69   CHKERRQ(PetscFunctionListDestroy(&MatPartitioningList));
70   CHKERRQ(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   CHKERRQ(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   CHKERRQ(MatMFFDInitializePackage());
165   /* Register Classes */
166   CHKERRQ(PetscClassIdRegister("Matrix",&MAT_CLASSID));
167   CHKERRQ(PetscClassIdRegister("Matrix FD Coloring",&MAT_FDCOLORING_CLASSID));
168   CHKERRQ(PetscClassIdRegister("Matrix Coloring",&MAT_COLORING_CLASSID));
169   CHKERRQ(PetscClassIdRegister("Matrix MatTranspose Coloring",&MAT_TRANSPOSECOLORING_CLASSID));
170   CHKERRQ(PetscClassIdRegister("Matrix Partitioning",&MAT_PARTITIONING_CLASSID));
171   CHKERRQ(PetscClassIdRegister("Matrix Coarsen",&MAT_COARSEN_CLASSID));
172   CHKERRQ(PetscClassIdRegister("Matrix Null Space",&MAT_NULLSPACE_CLASSID));
173   /* Register Constructors */
174   CHKERRQ(MatRegisterAll());
175   CHKERRQ(MatOrderingRegisterAll());
176   CHKERRQ(MatColoringRegisterAll());
177   CHKERRQ(MatPartitioningRegisterAll());
178   CHKERRQ(MatCoarsenRegisterAll());
179   CHKERRQ(MatSeqAIJRegisterAll());
180   /* Register Events */
181   CHKERRQ(PetscLogEventRegister("MatMult",          MAT_CLASSID,&MAT_Mult));
182   CHKERRQ(PetscLogEventRegister("MatMults",         MAT_CLASSID,&MAT_Mults));
183   CHKERRQ(PetscLogEventRegister("MatMultAdd",       MAT_CLASSID,&MAT_MultAdd));
184   CHKERRQ(PetscLogEventRegister("MatMultTranspose", MAT_CLASSID,&MAT_MultTranspose));
185   CHKERRQ(PetscLogEventRegister("MatMultTrAdd",     MAT_CLASSID,&MAT_MultTransposeAdd));
186   CHKERRQ(PetscLogEventRegister("MatSolve",         MAT_CLASSID,&MAT_Solve));
187   CHKERRQ(PetscLogEventRegister("MatSolves",        MAT_CLASSID,&MAT_Solves));
188   CHKERRQ(PetscLogEventRegister("MatSolveAdd",      MAT_CLASSID,&MAT_SolveAdd));
189   CHKERRQ(PetscLogEventRegister("MatSolveTranspos", MAT_CLASSID,&MAT_SolveTranspose));
190   CHKERRQ(PetscLogEventRegister("MatSolveTrAdd",    MAT_CLASSID,&MAT_SolveTransposeAdd));
191   CHKERRQ(PetscLogEventRegister("MatSOR",           MAT_CLASSID,&MAT_SOR));
192   CHKERRQ(PetscLogEventRegister("MatForwardSolve",  MAT_CLASSID,&MAT_ForwardSolve));
193   CHKERRQ(PetscLogEventRegister("MatBackwardSolve", MAT_CLASSID,&MAT_BackwardSolve));
194   CHKERRQ(PetscLogEventRegister("MatLUFactor",      MAT_CLASSID,&MAT_LUFactor));
195   CHKERRQ(PetscLogEventRegister("MatLUFactorSym",   MAT_CLASSID,&MAT_LUFactorSymbolic));
196   CHKERRQ(PetscLogEventRegister("MatLUFactorNum",   MAT_CLASSID,&MAT_LUFactorNumeric));
197   CHKERRQ(PetscLogEventRegister("MatQRFactor",      MAT_CLASSID,&MAT_QRFactor));
198   CHKERRQ(PetscLogEventRegister("MatQRFactorSym",   MAT_CLASSID,&MAT_QRFactorSymbolic));
199   CHKERRQ(PetscLogEventRegister("MatQRFactorNum",   MAT_CLASSID,&MAT_QRFactorNumeric));
200   CHKERRQ(PetscLogEventRegister("MatCholeskyFctr",  MAT_CLASSID,&MAT_CholeskyFactor));
201   CHKERRQ(PetscLogEventRegister("MatCholFctrSym",   MAT_CLASSID,&MAT_CholeskyFactorSymbolic));
202   CHKERRQ(PetscLogEventRegister("MatCholFctrNum",   MAT_CLASSID,&MAT_CholeskyFactorNumeric));
203   CHKERRQ(PetscLogEventRegister("MatFctrFactSchur", MAT_CLASSID,&MAT_FactorFactS));
204   CHKERRQ(PetscLogEventRegister("MatFctrInvSchur",  MAT_CLASSID,&MAT_FactorInvS));
205   CHKERRQ(PetscLogEventRegister("MatILUFactor",     MAT_CLASSID,&MAT_ILUFactor));
206   CHKERRQ(PetscLogEventRegister("MatILUFactorSym",  MAT_CLASSID,&MAT_ILUFactorSymbolic));
207   CHKERRQ(PetscLogEventRegister("MatICCFactorSym",  MAT_CLASSID,&MAT_ICCFactorSymbolic));
208   CHKERRQ(PetscLogEventRegister("MatCopy",          MAT_CLASSID,&MAT_Copy));
209   CHKERRQ(PetscLogEventRegister("MatConvert",       MAT_CLASSID,&MAT_Convert));
210   CHKERRQ(PetscLogEventRegister("MatScale",         MAT_CLASSID,&MAT_Scale));
211   CHKERRQ(PetscLogEventRegister("MatResidual",      MAT_CLASSID,&MAT_Residual));
212   CHKERRQ(PetscLogEventRegister("MatAssemblyBegin", MAT_CLASSID,&MAT_AssemblyBegin));
213   CHKERRQ(PetscLogEventRegister("MatAssemblyEnd",   MAT_CLASSID,&MAT_AssemblyEnd));
214   CHKERRQ(PetscLogEventRegister("MatSetValues",     MAT_CLASSID,&MAT_SetValues));
215   CHKERRQ(PetscLogEventRegister("MatGetValues",     MAT_CLASSID,&MAT_GetValues));
216   CHKERRQ(PetscLogEventRegister("MatGetRow",        MAT_CLASSID,&MAT_GetRow));
217   CHKERRQ(PetscLogEventRegister("MatGetRowIJ",      MAT_CLASSID,&MAT_GetRowIJ));
218   CHKERRQ(PetscLogEventRegister("MatCreateSubMats", MAT_CLASSID,&MAT_CreateSubMats));
219   CHKERRQ(PetscLogEventRegister("MatCreateSubMat",  MAT_CLASSID,&MAT_CreateSubMat));
220   CHKERRQ(PetscLogEventRegister("MatGetOrdering",   MAT_CLASSID,&MAT_GetOrdering));
221   CHKERRQ(PetscLogEventRegister("MatIncreaseOvrlp", MAT_CLASSID,&MAT_IncreaseOverlap));
222   CHKERRQ(PetscLogEventRegister("MatPartitioning",  MAT_PARTITIONING_CLASSID,&MAT_Partitioning));
223   CHKERRQ(PetscLogEventRegister("MatPartitioningND",MAT_PARTITIONING_CLASSID,&MAT_PartitioningND));
224   CHKERRQ(PetscLogEventRegister("MatCoarsen",       MAT_COARSEN_CLASSID,&MAT_Coarsen));
225   CHKERRQ(PetscLogEventRegister("MatZeroEntries",   MAT_CLASSID,&MAT_ZeroEntries));
226   CHKERRQ(PetscLogEventRegister("MatLoad",          MAT_CLASSID,&MAT_Load));
227   CHKERRQ(PetscLogEventRegister("MatView",          MAT_CLASSID,&MAT_View));
228   CHKERRQ(PetscLogEventRegister("MatAXPY",          MAT_CLASSID,&MAT_AXPY));
229   CHKERRQ(PetscLogEventRegister("MatFDColorCreate", MAT_FDCOLORING_CLASSID,&MAT_FDColoringCreate));
230   CHKERRQ(PetscLogEventRegister("MatFDColorSetUp",  MAT_FDCOLORING_CLASSID,&MAT_FDColoringSetUp));
231   CHKERRQ(PetscLogEventRegister("MatFDColorApply",  MAT_FDCOLORING_CLASSID,&MAT_FDColoringApply));
232   CHKERRQ(PetscLogEventRegister("MatFDColorFunc",   MAT_FDCOLORING_CLASSID,&MAT_FDColoringFunction));
233   CHKERRQ(PetscLogEventRegister("MatTranspose",     MAT_CLASSID,&MAT_Transpose));
234   CHKERRQ(PetscLogEventRegister("MatMatSolve",      MAT_CLASSID,&MAT_MatSolve));
235   CHKERRQ(PetscLogEventRegister("MatMatTrSolve",    MAT_CLASSID,&MAT_MatTrSolve));
236   CHKERRQ(PetscLogEventRegister("MatMatMultSym",    MAT_CLASSID,&MAT_MatMultSymbolic));
237   CHKERRQ(PetscLogEventRegister("MatMatMultNum",    MAT_CLASSID,&MAT_MatMultNumeric));
238   CHKERRQ(PetscLogEventRegister("MatMatMatMultSym", MAT_CLASSID,&MAT_MatMatMultSymbolic));
239   CHKERRQ(PetscLogEventRegister("MatMatMatMultNum", MAT_CLASSID,&MAT_MatMatMultNumeric));
240   CHKERRQ(PetscLogEventRegister("MatPtAPSymbolic",  MAT_CLASSID,&MAT_PtAPSymbolic));
241   CHKERRQ(PetscLogEventRegister("MatPtAPNumeric",   MAT_CLASSID,&MAT_PtAPNumeric));
242   CHKERRQ(PetscLogEventRegister("MatRARtSym",       MAT_CLASSID,&MAT_RARtSymbolic));
243   CHKERRQ(PetscLogEventRegister("MatRARtNum",       MAT_CLASSID,&MAT_RARtNumeric));
244   CHKERRQ(PetscLogEventRegister("MatMatTrnMultSym", MAT_CLASSID,&MAT_MatTransposeMultSymbolic));
245   CHKERRQ(PetscLogEventRegister("MatMatTrnMultNum", MAT_CLASSID,&MAT_MatTransposeMultNumeric));
246   CHKERRQ(PetscLogEventRegister("MatTrnMatMultSym", MAT_CLASSID,&MAT_TransposeMatMultSymbolic));
247   CHKERRQ(PetscLogEventRegister("MatTrnMatMultNum", MAT_CLASSID,&MAT_TransposeMatMultNumeric));
248   CHKERRQ(PetscLogEventRegister("MatTrnColorCreate",MAT_CLASSID,&MAT_TransposeColoringCreate));
249   CHKERRQ(PetscLogEventRegister("MatRedundantMat",  MAT_CLASSID,&MAT_RedundantMat));
250   CHKERRQ(PetscLogEventRegister("MatGetSeqNZStrct", MAT_CLASSID,&MAT_GetSequentialNonzeroStructure));
251   CHKERRQ(PetscLogEventRegister("MatGetMultiProcB", MAT_CLASSID,&MAT_GetMultiProcBlock));
252   CHKERRQ(PetscLogEventRegister("MatSetRandom",     MAT_CLASSID,&MAT_SetRandom));
253 
254   /* these may be specific to MPIAIJ matrices */
255   CHKERRQ(PetscLogEventRegister("MatMPISumSeqNumeric",MAT_CLASSID,&MAT_Seqstompinum));
256   CHKERRQ(PetscLogEventRegister("MatMPISumSeqSymbolic",MAT_CLASSID,&MAT_Seqstompisym));
257   CHKERRQ(PetscLogEventRegister("MatMPISumSeq",MAT_CLASSID,&MAT_Seqstompi));
258   CHKERRQ(PetscLogEventRegister("MatMPIConcateSeq",MAT_CLASSID,&MAT_Merge));
259   CHKERRQ(PetscLogEventRegister("MatGetLocalMat",MAT_CLASSID,&MAT_Getlocalmat));
260   CHKERRQ(PetscLogEventRegister("MatGetLocalMatCondensed",MAT_CLASSID,&MAT_Getlocalmatcondensed));
261   CHKERRQ(PetscLogEventRegister("MatGetBrowsOfAcols",MAT_CLASSID,&MAT_GetBrowsOfAcols));
262   CHKERRQ(PetscLogEventRegister("MatGetBrAoCol",MAT_CLASSID,&MAT_GetBrowsOfAocols));
263 
264   CHKERRQ(PetscLogEventRegister("MatApplyPAPt_Symbolic",MAT_CLASSID,&MAT_Applypapt_symbolic));
265   CHKERRQ(PetscLogEventRegister("MatApplyPAPt_Numeric",MAT_CLASSID,&MAT_Applypapt_numeric));
266   CHKERRQ(PetscLogEventRegister("MatApplyPAPt",MAT_CLASSID,&MAT_Applypapt));
267 
268   CHKERRQ(PetscLogEventRegister("MatGetSymTrans",MAT_CLASSID,&MAT_Getsymtranspose));
269   CHKERRQ(PetscLogEventRegister("MatGetSymTransR",MAT_CLASSID,&MAT_Getsymtransreduced));
270   CHKERRQ(PetscLogEventRegister("MatCUSPARSCopyTo",MAT_CLASSID,&MAT_CUSPARSECopyToGPU));
271   CHKERRQ(PetscLogEventRegister("MatCUSPARSCopyFr",MAT_CLASSID,&MAT_CUSPARSECopyFromGPU));
272   CHKERRQ(PetscLogEventRegister("MatCUSPARSSolAnl",MAT_CLASSID,&MAT_CUSPARSESolveAnalysis));
273   CHKERRQ(PetscLogEventRegister("MatCUSPARSGenT",MAT_CLASSID,&MAT_CUSPARSEGenerateTranspose));
274   CHKERRQ(PetscLogEventRegister("MatVCLCopyTo",  MAT_CLASSID,&MAT_ViennaCLCopyToGPU));
275   CHKERRQ(PetscLogEventRegister("MatDenseCopyTo",MAT_CLASSID,&MAT_DenseCopyToGPU));
276   CHKERRQ(PetscLogEventRegister("MatDenseCopyFrom",MAT_CLASSID,&MAT_DenseCopyFromGPU));
277   CHKERRQ(PetscLogEventRegister("MatSetValBatch",MAT_CLASSID,&MAT_SetValuesBatch));
278 
279   CHKERRQ(PetscLogEventRegister("MatColoringApply",MAT_COLORING_CLASSID,&MATCOLORING_Apply));
280   CHKERRQ(PetscLogEventRegister("MatColoringComm",MAT_COLORING_CLASSID,&MATCOLORING_Comm));
281   CHKERRQ(PetscLogEventRegister("MatColoringLocal",MAT_COLORING_CLASSID,&MATCOLORING_Local));
282   CHKERRQ(PetscLogEventRegister("MatColoringIS",MAT_COLORING_CLASSID,&MATCOLORING_ISCreate));
283   CHKERRQ(PetscLogEventRegister("MatColoringSetUp",MAT_COLORING_CLASSID,&MATCOLORING_SetUp));
284   CHKERRQ(PetscLogEventRegister("MatColoringWeights",MAT_COLORING_CLASSID,&MATCOLORING_Weights));
285 
286   CHKERRQ(PetscLogEventRegister("MatSetPreallCOO",MAT_CLASSID,&MAT_PreallCOO));
287   CHKERRQ(PetscLogEventRegister("MatSetValuesCOO",MAT_CLASSID,&MAT_SetVCOO));
288 
289   CHKERRQ(PetscLogEventRegister("MatH2OpusBuild",MAT_CLASSID,&MAT_H2Opus_Build));
290   CHKERRQ(PetscLogEventRegister("MatH2OpusComp", MAT_CLASSID,&MAT_H2Opus_Compress));
291   CHKERRQ(PetscLogEventRegister("MatH2OpusOrth", MAT_CLASSID,&MAT_H2Opus_Orthog));
292   CHKERRQ(PetscLogEventRegister("MatH2OpusLR",   MAT_CLASSID,&MAT_H2Opus_LR));
293 
294   /* Mark non-collective events */
295   CHKERRQ(PetscLogEventSetCollective(MAT_SetValues,      PETSC_FALSE));
296   CHKERRQ(PetscLogEventSetCollective(MAT_SetValuesBatch, PETSC_FALSE));
297   CHKERRQ(PetscLogEventSetCollective(MAT_GetRow,         PETSC_FALSE));
298   /* Turn off high traffic events by default */
299   CHKERRQ(PetscLogEventSetActiveAll(MAT_SetValues, PETSC_FALSE));
300   CHKERRQ(PetscLogEventSetActiveAll(MAT_GetValues, PETSC_FALSE));
301   CHKERRQ(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     CHKERRQ(PetscInfoProcessClass("mat", 7, classids));
314   }
315 
316   /* Process summary exclusions */
317   CHKERRQ(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
318   if (opt) {
319     CHKERRQ(PetscStrInList("mat",logList,',',&pkg));
320     if (pkg) CHKERRQ(PetscLogEventExcludeClass(MAT_CLASSID));
321     if (pkg) CHKERRQ(PetscLogEventExcludeClass(MAT_FDCOLORING_CLASSID));
322     if (pkg) CHKERRQ(PetscLogEventExcludeClass(MAT_COLORING_CLASSID));
323     if (pkg) CHKERRQ(PetscLogEventExcludeClass(MAT_TRANSPOSECOLORING_CLASSID));
324     if (pkg) CHKERRQ(PetscLogEventExcludeClass(MAT_PARTITIONING_CLASSID));
325     if (pkg) CHKERRQ(PetscLogEventExcludeClass(MAT_COARSEN_CLASSID));
326     if (pkg) CHKERRQ(PetscLogEventExcludeClass(MAT_NULLSPACE_CLASSID));
327   }
328 
329   /* Register the PETSc built in factorization based solvers */
330   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_LU,MatGetFactor_seqaij_petsc));
331   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc));
332   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc));
333   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc));
334 
335   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_LU,MatGetFactor_seqaij_petsc));
336   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc));
337   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc));
338   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc));
339 
340   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL,MAT_FACTOR_LU,MatGetFactor_constantdiagonal_petsc));
341   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL,MAT_FACTOR_CHOLESKY,MatGetFactor_constantdiagonal_petsc));
342   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL,MAT_FACTOR_ILU,MatGetFactor_constantdiagonal_petsc));
343   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL,MAT_FACTOR_ICC,MatGetFactor_constantdiagonal_petsc));
344 
345 #if defined(PETSC_HAVE_MKL_SPARSE)
346   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_LU,MatGetFactor_seqaij_petsc));
347   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc));
348   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc));
349   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc));
350 
351   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_LU,MatGetFactor_seqbaij_petsc));
352   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_CHOLESKY,MatGetFactor_seqbaij_petsc));
353   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_ILU,MatGetFactor_seqbaij_petsc));
354   CHKERRQ(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   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_LU,MatGetFactor_seqaij_petsc));
360   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc));
361   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc));
362   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc));
363 
364   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_LU,MatGetFactor_seqbaij_petsc));
365   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_CHOLESKY,MatGetFactor_seqbaij_petsc));
366   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_ILU,MatGetFactor_seqbaij_petsc));
367   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_ICC,MatGetFactor_seqbaij_petsc));
368 
369   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ,      MAT_FACTOR_CHOLESKY,MatGetFactor_seqsbaij_petsc));
370   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ,      MAT_FACTOR_ICC,MatGetFactor_seqsbaij_petsc));
371 
372   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE,      MAT_FACTOR_LU,MatGetFactor_seqdense_petsc));
373   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE,      MAT_FACTOR_ILU,MatGetFactor_seqdense_petsc));
374   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE,      MAT_FACTOR_CHOLESKY,MatGetFactor_seqdense_petsc));
375   CHKERRQ(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE,      MAT_FACTOR_QR,MatGetFactor_seqdense_petsc));
376 #if defined(PETSC_HAVE_CUDA)
377   CHKERRQ(MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSE,       MAT_FACTOR_LU,MatGetFactor_seqdense_cuda));
378   CHKERRQ(MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSE,       MAT_FACTOR_CHOLESKY,MatGetFactor_seqdense_cuda));
379   CHKERRQ(MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSE,       MAT_FACTOR_QR,MatGetFactor_seqdense_cuda));
380   CHKERRQ(MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSECUDA,   MAT_FACTOR_LU,MatGetFactor_seqdense_cuda));
381   CHKERRQ(MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSECUDA,   MAT_FACTOR_CHOLESKY,MatGetFactor_seqdense_cuda));
382   CHKERRQ(MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSECUDA,   MAT_FACTOR_QR,MatGetFactor_seqdense_cuda));
383 #endif
384 
385   CHKERRQ(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   CHKERRQ(MatSolverTypeRegister_MUMPS());
393 #endif
394 #if defined(PETSC_HAVE_CUDA)
395   CHKERRQ(MatSolverTypeRegister_CUSPARSE());
396 #endif
397 #if defined(PETSC_HAVE_KOKKOS_KERNELS)
398   CHKERRQ(MatSolverTypeRegister_KOKKOS());
399 #endif
400 #if defined(PETSC_HAVE_VIENNACL)
401   CHKERRQ(MatSolverTypeRegister_ViennaCL());
402 #endif
403 #if defined(PETSC_HAVE_ELEMENTAL)
404   CHKERRQ(MatSolverTypeRegister_Elemental());
405 #endif
406 #if defined(PETSC_HAVE_SCALAPACK)
407   CHKERRQ(MatSolverTypeRegister_ScaLAPACK());
408 #endif
409 #if defined(PETSC_HAVE_MATLAB_ENGINE)
410   CHKERRQ(MatSolverTypeRegister_Matlab());
411 #endif
412 #if defined(PETSC_HAVE_ESSL)
413   CHKERRQ(MatSolverTypeRegister_Essl());
414 #endif
415 #if defined(PETSC_HAVE_SUPERLU)
416   CHKERRQ(MatSolverTypeRegister_SuperLU());
417 #endif
418 #if defined(PETSC_HAVE_STRUMPACK)
419   CHKERRQ(MatSolverTypeRegister_STRUMPACK());
420 #endif
421 #if defined(PETSC_HAVE_PASTIX)
422   CHKERRQ(MatSolverTypeRegister_Pastix());
423 #endif
424 #if defined(PETSC_HAVE_SUPERLU_DIST)
425   CHKERRQ(MatSolverTypeRegister_SuperLU_DIST());
426 #endif
427 #if defined(PETSC_HAVE_ELEMENTAL)
428   CHKERRQ(MatSolverTypeRegister_SparseElemental());
429 #endif
430 #if defined(PETSC_HAVE_MKL_PARDISO)
431   CHKERRQ(MatSolverTypeRegister_MKL_Pardiso());
432 #endif
433 #if defined(PETSC_HAVE_MKL_CPARDISO)
434   CHKERRQ(MatSolverTypeRegister_MKL_CPardiso());
435 #endif
436 #if defined(PETSC_HAVE_SUITESPARSE)
437   CHKERRQ(MatSolverTypeRegister_SuiteSparse());
438 #endif
439 #if defined(PETSC_HAVE_LUSOL)
440   CHKERRQ(MatSolverTypeRegister_Lusol());
441 #endif
442   /* Register package finalizer */
443   CHKERRQ(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   CHKERRQ(MatInitializePackage());
458   PetscFunctionReturn(0);
459 }
460 
461 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
462