xref: /petsc/src/mat/interface/dlregismat.c (revision efa12513287cff49a2b9648ae83199dcbfaad71a)
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                                   "MAT_SUBSET_OFF_PROC_ENTRIES",
27                                   "MAT_SUBMAT_SINGLEIS",
28                                   "MAT_STRUCTURE_ONLY",
29                                   "MAT_SORTED_FULL",
30                                   "MatOption","MAT_",NULL};
31 const char *const* MatOptions = MatOptions_Shifted+2;
32 const char *const MatFactorShiftTypes[] = {"NONE","NONZERO","POSITIVE_DEFINITE","INBLOCKS","MatFactorShiftType","PC_FACTOR_",NULL};
33 const char *const MatStructures[] = {"different nonzero pattern","subset nonzero pattern","same nonzero pattern","unknown nonzero pattern","MatStructure","MAT_STRUCTURE_",NULL};
34 const char *const MatFactorShiftTypesDetail[] = {NULL,"diagonal shift to prevent zero pivot","Manteuffel shift","diagonal shift on blocks to prevent zero pivot"};
35 const char *const MPPTScotchStrategyTypes[] = {"DEFAULT","QUALITY","SPEED","BALANCE","SAFETY","SCALABILITY","MPPTScotchStrategyType","MP_PTSCOTCH_",NULL};
36 const char *const MPChacoGlobalTypes[] = {"","MULTILEVEL","SPECTRAL","","LINEAR","RANDOM","SCATTERED","MPChacoGlobalType","MP_CHACO_",NULL};
37 const char *const MPChacoLocalTypes[] = {"","KERNIGHAN","NONE","MPChacoLocalType","MP_CHACO_",NULL};
38 const char *const MPChacoEigenTypes[] = {"LANCZOS","RQI","MPChacoEigenType","MP_CHACO_",NULL};
39 
40 extern PetscErrorCode  MatMFFDInitializePackage(void);
41 extern PetscErrorCode  MatSolverTypeDestroy(void);
42 static PetscBool MatPackageInitialized = PETSC_FALSE;
43 /*@C
44   MatFinalizePackage - This function destroys everything in the Petsc interface to the Mat package. It is
45   called from PetscFinalize().
46 
47   Level: developer
48 
49 .seealso: PetscFinalize(), MatInitializePackage()
50 @*/
51 PetscErrorCode  MatFinalizePackage(void)
52 {
53   MatRootName    nnames,names = MatRootNameList;
54   PetscErrorCode ierr;
55 
56   PetscFunctionBegin;
57   ierr = MatSolverTypeDestroy();CHKERRQ(ierr);
58   while (names) {
59     nnames = names->next;
60     ierr   = PetscFree(names->rname);CHKERRQ(ierr);
61     ierr   = PetscFree(names->sname);CHKERRQ(ierr);
62     ierr   = PetscFree(names->mname);CHKERRQ(ierr);
63     ierr   = PetscFree(names);CHKERRQ(ierr);
64     names  = nnames;
65   }
66   ierr = PetscFunctionListDestroy(&MatList);CHKERRQ(ierr);
67   ierr = PetscFunctionListDestroy(&MatOrderingList);CHKERRQ(ierr);
68   ierr = PetscFunctionListDestroy(&MatColoringList);CHKERRQ(ierr);
69   ierr = PetscFunctionListDestroy(&MatPartitioningList);CHKERRQ(ierr);
70   ierr = PetscFunctionListDestroy(&MatCoarsenList);CHKERRQ(ierr);
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   ierr = PetscFunctionListDestroy(&MatSeqAIJList);CHKERRQ(ierr);
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_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   PetscErrorCode ierr;
161 
162   PetscFunctionBegin;
163   if (MatPackageInitialized) PetscFunctionReturn(0);
164   MatPackageInitialized = PETSC_TRUE;
165   /* Initialize subpackage */
166   ierr = MatMFFDInitializePackage();CHKERRQ(ierr);
167   /* Register Classes */
168   ierr = PetscClassIdRegister("Matrix",&MAT_CLASSID);CHKERRQ(ierr);
169   ierr = PetscClassIdRegister("Matrix FD Coloring",&MAT_FDCOLORING_CLASSID);CHKERRQ(ierr);
170   ierr = PetscClassIdRegister("Matrix Coloring",&MAT_COLORING_CLASSID);CHKERRQ(ierr);
171   ierr = PetscClassIdRegister("Matrix MatTranspose Coloring",&MAT_TRANSPOSECOLORING_CLASSID);CHKERRQ(ierr);
172   ierr = PetscClassIdRegister("Matrix Partitioning",&MAT_PARTITIONING_CLASSID);CHKERRQ(ierr);
173   ierr = PetscClassIdRegister("Matrix Coarsen",&MAT_COARSEN_CLASSID);CHKERRQ(ierr);
174   ierr = PetscClassIdRegister("Matrix Null Space",&MAT_NULLSPACE_CLASSID);CHKERRQ(ierr);
175   /* Register Constructors */
176   ierr = MatRegisterAll();CHKERRQ(ierr);
177   ierr = MatOrderingRegisterAll();CHKERRQ(ierr);
178   ierr = MatColoringRegisterAll();CHKERRQ(ierr);
179   ierr = MatPartitioningRegisterAll();CHKERRQ(ierr);
180   ierr = MatCoarsenRegisterAll();CHKERRQ(ierr);
181   ierr = MatSeqAIJRegisterAll();CHKERRQ(ierr);
182   /* Register Events */
183   ierr = PetscLogEventRegister("MatMult",          MAT_CLASSID,&MAT_Mult);CHKERRQ(ierr);
184   ierr = PetscLogEventRegister("MatMults",         MAT_CLASSID,&MAT_Mults);CHKERRQ(ierr);
185   ierr = PetscLogEventRegister("MatMultConstr",    MAT_CLASSID,&MAT_MultConstrained);CHKERRQ(ierr);
186   ierr = PetscLogEventRegister("MatMultAdd",       MAT_CLASSID,&MAT_MultAdd);CHKERRQ(ierr);
187   ierr = PetscLogEventRegister("MatMultTranspose", MAT_CLASSID,&MAT_MultTranspose);CHKERRQ(ierr);
188   ierr = PetscLogEventRegister("MatMultTrConstr",  MAT_CLASSID,&MAT_MultTransposeConstrained);CHKERRQ(ierr);
189   ierr = PetscLogEventRegister("MatMultTrAdd",     MAT_CLASSID,&MAT_MultTransposeAdd);CHKERRQ(ierr);
190   ierr = PetscLogEventRegister("MatSolve",         MAT_CLASSID,&MAT_Solve);CHKERRQ(ierr);
191   ierr = PetscLogEventRegister("MatSolves",        MAT_CLASSID,&MAT_Solves);CHKERRQ(ierr);
192   ierr = PetscLogEventRegister("MatSolveAdd",      MAT_CLASSID,&MAT_SolveAdd);CHKERRQ(ierr);
193   ierr = PetscLogEventRegister("MatSolveTranspos", MAT_CLASSID,&MAT_SolveTranspose);CHKERRQ(ierr);
194   ierr = PetscLogEventRegister("MatSolveTrAdd",    MAT_CLASSID,&MAT_SolveTransposeAdd);CHKERRQ(ierr);
195   ierr = PetscLogEventRegister("MatSOR",           MAT_CLASSID,&MAT_SOR);CHKERRQ(ierr);
196   ierr = PetscLogEventRegister("MatForwardSolve",  MAT_CLASSID,&MAT_ForwardSolve);CHKERRQ(ierr);
197   ierr = PetscLogEventRegister("MatBackwardSolve", MAT_CLASSID,&MAT_BackwardSolve);CHKERRQ(ierr);
198   ierr = PetscLogEventRegister("MatLUFactor",      MAT_CLASSID,&MAT_LUFactor);CHKERRQ(ierr);
199   ierr = PetscLogEventRegister("MatLUFactorSym",   MAT_CLASSID,&MAT_LUFactorSymbolic);CHKERRQ(ierr);
200   ierr = PetscLogEventRegister("MatLUFactorNum",   MAT_CLASSID,&MAT_LUFactorNumeric);CHKERRQ(ierr);
201   ierr = PetscLogEventRegister("MatCholeskyFctr",  MAT_CLASSID,&MAT_CholeskyFactor);CHKERRQ(ierr);
202   ierr = PetscLogEventRegister("MatCholFctrSym",   MAT_CLASSID,&MAT_CholeskyFactorSymbolic);CHKERRQ(ierr);
203   ierr = PetscLogEventRegister("MatCholFctrNum",   MAT_CLASSID,&MAT_CholeskyFactorNumeric);CHKERRQ(ierr);
204   ierr = PetscLogEventRegister("MatFctrFactSchur", MAT_CLASSID,&MAT_FactorFactS);CHKERRQ(ierr);
205   ierr = PetscLogEventRegister("MatFctrInvSchur",  MAT_CLASSID,&MAT_FactorInvS);CHKERRQ(ierr);
206   ierr = PetscLogEventRegister("MatILUFactor",     MAT_CLASSID,&MAT_ILUFactor);CHKERRQ(ierr);
207   ierr = PetscLogEventRegister("MatILUFactorSym",  MAT_CLASSID,&MAT_ILUFactorSymbolic);CHKERRQ(ierr);
208   ierr = PetscLogEventRegister("MatICCFactorSym",  MAT_CLASSID,&MAT_ICCFactorSymbolic);CHKERRQ(ierr);
209   ierr = PetscLogEventRegister("MatCopy",          MAT_CLASSID,&MAT_Copy);CHKERRQ(ierr);
210   ierr = PetscLogEventRegister("MatConvert",       MAT_CLASSID,&MAT_Convert);CHKERRQ(ierr);
211   ierr = PetscLogEventRegister("MatScale",         MAT_CLASSID,&MAT_Scale);CHKERRQ(ierr);
212   ierr = PetscLogEventRegister("MatResidual",      MAT_CLASSID,&MAT_Residual);CHKERRQ(ierr);
213   ierr = PetscLogEventRegister("MatAssemblyBegin", MAT_CLASSID,&MAT_AssemblyBegin);CHKERRQ(ierr);
214   ierr = PetscLogEventRegister("MatAssemblyEnd",   MAT_CLASSID,&MAT_AssemblyEnd);CHKERRQ(ierr);
215   ierr = PetscLogEventRegister("MatSetValues",     MAT_CLASSID,&MAT_SetValues);CHKERRQ(ierr);
216   ierr = PetscLogEventRegister("MatGetValues",     MAT_CLASSID,&MAT_GetValues);CHKERRQ(ierr);
217   ierr = PetscLogEventRegister("MatGetRow",        MAT_CLASSID,&MAT_GetRow);CHKERRQ(ierr);
218   ierr = PetscLogEventRegister("MatGetRowIJ",      MAT_CLASSID,&MAT_GetRowIJ);CHKERRQ(ierr);
219   ierr = PetscLogEventRegister("MatCreateSubMats", MAT_CLASSID,&MAT_CreateSubMats);CHKERRQ(ierr);
220   ierr = PetscLogEventRegister("MatCreateSubMat",  MAT_CLASSID,&MAT_CreateSubMat);CHKERRQ(ierr);
221   ierr = PetscLogEventRegister("MatGetOrdering",   MAT_CLASSID,&MAT_GetOrdering);CHKERRQ(ierr);
222   ierr = PetscLogEventRegister("MatIncreaseOvrlp", MAT_CLASSID,&MAT_IncreaseOverlap);CHKERRQ(ierr);
223   ierr = PetscLogEventRegister("MatPartitioning",  MAT_PARTITIONING_CLASSID,&MAT_Partitioning);CHKERRQ(ierr);
224   ierr = PetscLogEventRegister("MatPartitioningND",MAT_PARTITIONING_CLASSID,&MAT_PartitioningND);CHKERRQ(ierr);
225   ierr = PetscLogEventRegister("MatCoarsen",       MAT_COARSEN_CLASSID,&MAT_Coarsen);CHKERRQ(ierr);
226   ierr = PetscLogEventRegister("MatZeroEntries",   MAT_CLASSID,&MAT_ZeroEntries);CHKERRQ(ierr);
227   ierr = PetscLogEventRegister("MatLoad",          MAT_CLASSID,&MAT_Load);CHKERRQ(ierr);
228   ierr = PetscLogEventRegister("MatView",          MAT_CLASSID,&MAT_View);CHKERRQ(ierr);
229   ierr = PetscLogEventRegister("MatAXPY",          MAT_CLASSID,&MAT_AXPY);CHKERRQ(ierr);
230   ierr = PetscLogEventRegister("MatFDColorCreate", MAT_FDCOLORING_CLASSID,&MAT_FDColoringCreate);CHKERRQ(ierr);
231   ierr = PetscLogEventRegister("MatFDColorSetUp",  MAT_FDCOLORING_CLASSID,&MAT_FDColoringSetUp);CHKERRQ(ierr);
232   ierr = PetscLogEventRegister("MatFDColorApply",  MAT_FDCOLORING_CLASSID,&MAT_FDColoringApply);CHKERRQ(ierr);
233   ierr = PetscLogEventRegister("MatFDColorFunc",   MAT_FDCOLORING_CLASSID,&MAT_FDColoringFunction);CHKERRQ(ierr);
234   ierr = PetscLogEventRegister("MatTranspose",     MAT_CLASSID,&MAT_Transpose);CHKERRQ(ierr);
235   ierr = PetscLogEventRegister("MatMatSolve",      MAT_CLASSID,&MAT_MatSolve);CHKERRQ(ierr);
236   ierr = PetscLogEventRegister("MatMatTrSolve",    MAT_CLASSID,&MAT_MatTrSolve);CHKERRQ(ierr);
237   ierr = PetscLogEventRegister("MatMatMultSym",    MAT_CLASSID,&MAT_MatMultSymbolic);CHKERRQ(ierr);
238   ierr = PetscLogEventRegister("MatMatMultNum",    MAT_CLASSID,&MAT_MatMultNumeric);CHKERRQ(ierr);
239   ierr = PetscLogEventRegister("MatMatMatMultSym", MAT_CLASSID,&MAT_MatMatMultSymbolic);CHKERRQ(ierr);
240   ierr = PetscLogEventRegister("MatMatMatMultNum", MAT_CLASSID,&MAT_MatMatMultNumeric);CHKERRQ(ierr);
241   ierr = PetscLogEventRegister("MatPtAPSymbolic",  MAT_CLASSID,&MAT_PtAPSymbolic);CHKERRQ(ierr);
242   ierr = PetscLogEventRegister("MatPtAPNumeric",   MAT_CLASSID,&MAT_PtAPNumeric);CHKERRQ(ierr);
243   ierr = PetscLogEventRegister("MatRARtSym",       MAT_CLASSID,&MAT_RARtSymbolic);CHKERRQ(ierr);
244   ierr = PetscLogEventRegister("MatRARtNum",       MAT_CLASSID,&MAT_RARtNumeric);CHKERRQ(ierr);
245   ierr = PetscLogEventRegister("MatMatTrnMultSym", MAT_CLASSID,&MAT_MatTransposeMultSymbolic);CHKERRQ(ierr);
246   ierr = PetscLogEventRegister("MatMatTrnMultNum", MAT_CLASSID,&MAT_MatTransposeMultNumeric);CHKERRQ(ierr);
247   ierr = PetscLogEventRegister("MatTrnMatMultSym", MAT_CLASSID,&MAT_TransposeMatMultSymbolic);CHKERRQ(ierr);
248   ierr = PetscLogEventRegister("MatTrnMatMultNum", MAT_CLASSID,&MAT_TransposeMatMultNumeric);CHKERRQ(ierr);
249   ierr = PetscLogEventRegister("MatTrnColorCreate",MAT_CLASSID,&MAT_TransposeColoringCreate);CHKERRQ(ierr);
250   ierr = PetscLogEventRegister("MatRedundantMat",  MAT_CLASSID,&MAT_RedundantMat);CHKERRQ(ierr);
251   ierr = PetscLogEventRegister("MatGetSeqNZStrct", MAT_CLASSID,&MAT_GetSequentialNonzeroStructure);CHKERRQ(ierr);
252   ierr = PetscLogEventRegister("MatGetMultiProcB", MAT_CLASSID,&MAT_GetMultiProcBlock);CHKERRQ(ierr);
253   ierr = PetscLogEventRegister("MatSetRandom",     MAT_CLASSID,&MAT_SetRandom);CHKERRQ(ierr);
254 
255   /* these may be specific to MPIAIJ matrices */
256   ierr = PetscLogEventRegister("MatMPISumSeqNumeric",MAT_CLASSID,&MAT_Seqstompinum);CHKERRQ(ierr);
257   ierr = PetscLogEventRegister("MatMPISumSeqSymbolic",MAT_CLASSID,&MAT_Seqstompisym);CHKERRQ(ierr);
258   ierr = PetscLogEventRegister("MatMPISumSeq",MAT_CLASSID,&MAT_Seqstompi);CHKERRQ(ierr);
259   ierr = PetscLogEventRegister("MatMPIConcateSeq",MAT_CLASSID,&MAT_Merge);CHKERRQ(ierr);
260   ierr = PetscLogEventRegister("MatGetLocalMat",MAT_CLASSID,&MAT_Getlocalmat);CHKERRQ(ierr);
261   ierr = PetscLogEventRegister("MatGetLocalMatCondensed",MAT_CLASSID,&MAT_Getlocalmatcondensed);CHKERRQ(ierr);
262   ierr = PetscLogEventRegister("MatGetBrowsOfAcols",MAT_CLASSID,&MAT_GetBrowsOfAcols);CHKERRQ(ierr);
263   ierr = PetscLogEventRegister("MatGetBrAoCol",MAT_CLASSID,&MAT_GetBrowsOfAocols);CHKERRQ(ierr);
264 
265   ierr = PetscLogEventRegister("MatApplyPAPt_Symbolic",MAT_CLASSID,&MAT_Applypapt_symbolic);CHKERRQ(ierr);
266   ierr = PetscLogEventRegister("MatApplyPAPt_Numeric",MAT_CLASSID,&MAT_Applypapt_numeric);CHKERRQ(ierr);
267   ierr = PetscLogEventRegister("MatApplyPAPt",MAT_CLASSID,&MAT_Applypapt);CHKERRQ(ierr);
268 
269   ierr = PetscLogEventRegister("MatGetSymTrans",MAT_CLASSID,&MAT_Getsymtranspose);CHKERRQ(ierr);
270   ierr = PetscLogEventRegister("MatGetSymTransR",MAT_CLASSID,&MAT_Getsymtransreduced);CHKERRQ(ierr);
271   ierr = PetscLogEventRegister("MatCUSPARSCopyTo",MAT_CLASSID,&MAT_CUSPARSECopyToGPU);CHKERRQ(ierr);
272   ierr = PetscLogEventRegister("MatCUSPARSCopyFr",MAT_CLASSID,&MAT_CUSPARSECopyFromGPU);CHKERRQ(ierr);
273   ierr = PetscLogEventRegister("MatCUSPARSSolAnl",MAT_CLASSID,&MAT_CUSPARSESolveAnalysis);CHKERRQ(ierr);
274   ierr = PetscLogEventRegister("MatCUSPARSGenT",MAT_CLASSID,&MAT_CUSPARSEGenerateTranspose);CHKERRQ(ierr);
275   ierr = PetscLogEventRegister("MatVCLCopyTo",  MAT_CLASSID,&MAT_ViennaCLCopyToGPU);CHKERRQ(ierr);
276   ierr = PetscLogEventRegister("MatDenseCopyTo",MAT_CLASSID,&MAT_DenseCopyToGPU);CHKERRQ(ierr);
277   ierr = PetscLogEventRegister("MatDenseCopyFrom",MAT_CLASSID,&MAT_DenseCopyFromGPU);CHKERRQ(ierr);
278   ierr = PetscLogEventRegister("MatSetValBatch",MAT_CLASSID,&MAT_SetValuesBatch);CHKERRQ(ierr);
279 
280   ierr = PetscLogEventRegister("MatColoringApply",MAT_COLORING_CLASSID,&MATCOLORING_Apply);CHKERRQ(ierr);
281   ierr = PetscLogEventRegister("MatColoringComm",MAT_COLORING_CLASSID,&MATCOLORING_Comm);CHKERRQ(ierr);
282   ierr = PetscLogEventRegister("MatColoringLocal",MAT_COLORING_CLASSID,&MATCOLORING_Local);CHKERRQ(ierr);
283   ierr = PetscLogEventRegister("MatColoringIS",MAT_COLORING_CLASSID,&MATCOLORING_ISCreate);CHKERRQ(ierr);
284   ierr = PetscLogEventRegister("MatColoringSetUp",MAT_COLORING_CLASSID,&MATCOLORING_SetUp);CHKERRQ(ierr);
285   ierr = PetscLogEventRegister("MatColoringWeights",MAT_COLORING_CLASSID,&MATCOLORING_Weights);CHKERRQ(ierr);
286 
287   ierr = PetscLogEventRegister("MatSetPreallCOO",MAT_CLASSID,&MAT_PreallCOO);CHKERRQ(ierr);
288   ierr = PetscLogEventRegister("MatSetValuesCOO",MAT_CLASSID,&MAT_SetVCOO);CHKERRQ(ierr);
289 
290   /* Mark non-collective events */
291   ierr = PetscLogEventSetCollective(MAT_SetValues,      PETSC_FALSE);CHKERRQ(ierr);
292   ierr = PetscLogEventSetCollective(MAT_SetValuesBatch, PETSC_FALSE);CHKERRQ(ierr);
293   ierr = PetscLogEventSetCollective(MAT_GetRow,         PETSC_FALSE);CHKERRQ(ierr);
294   /* Turn off high traffic events by default */
295   ierr = PetscLogEventSetActiveAll(MAT_SetValues, PETSC_FALSE);CHKERRQ(ierr);
296   ierr = PetscLogEventSetActiveAll(MAT_GetValues, PETSC_FALSE);CHKERRQ(ierr);
297   ierr = PetscLogEventSetActiveAll(MAT_GetRow,    PETSC_FALSE);CHKERRQ(ierr);
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     ierr = PetscInfoProcessClass("mat", 7, classids);CHKERRQ(ierr);
310   }
311 
312   /* Process summary exclusions */
313   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
314   if (opt) {
315     ierr = PetscStrInList("mat",logList,',',&pkg);CHKERRQ(ierr);
316     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_CLASSID);CHKERRQ(ierr);}
317     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_FDCOLORING_CLASSID);CHKERRQ(ierr);}
318     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_COLORING_CLASSID);CHKERRQ(ierr);}
319     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_TRANSPOSECOLORING_CLASSID);CHKERRQ(ierr);}
320     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_PARTITIONING_CLASSID);CHKERRQ(ierr);}
321     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_COARSEN_CLASSID);CHKERRQ(ierr);}
322     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_NULLSPACE_CLASSID);CHKERRQ(ierr);}
323   }
324 
325   /* Register the PETSc built in factorization based solvers */
326   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_LU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
327   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
328   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
329   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
330 
331   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_LU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
332   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
333   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
334   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
335 
336   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL,MAT_FACTOR_LU,MatGetFactor_constantdiagonal_petsc);CHKERRQ(ierr);
337   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL,MAT_FACTOR_CHOLESKY,MatGetFactor_constantdiagonal_petsc);CHKERRQ(ierr);
338   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL,MAT_FACTOR_ILU,MatGetFactor_constantdiagonal_petsc);CHKERRQ(ierr);
339   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL,MAT_FACTOR_ICC,MatGetFactor_constantdiagonal_petsc);CHKERRQ(ierr);
340 
341 #if defined(PETSC_HAVE_MKL_SPARSE)
342   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_LU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
343   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
344   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
345   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
346 
347   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_LU,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
348   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_CHOLESKY,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
349   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_ILU,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
350   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_ICC,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
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   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_LU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
356   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
357   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
358   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
359 
360   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_LU,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
361   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_CHOLESKY,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
362   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_ILU,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
363   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_ICC,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
364 
365   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ,      MAT_FACTOR_CHOLESKY,MatGetFactor_seqsbaij_petsc);CHKERRQ(ierr);
366   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ,      MAT_FACTOR_ICC,MatGetFactor_seqsbaij_petsc);CHKERRQ(ierr);
367 
368   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE,      MAT_FACTOR_LU,MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
369   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE,      MAT_FACTOR_ILU,MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
370   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE,      MAT_FACTOR_CHOLESKY,MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
371 #if defined(PETSC_HAVE_CUDA)
372   ierr = MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSE,       MAT_FACTOR_LU,MatGetFactor_seqdense_cuda);CHKERRQ(ierr);
373   ierr = MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSE,       MAT_FACTOR_CHOLESKY,MatGetFactor_seqdense_cuda);CHKERRQ(ierr);
374   ierr = MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSECUDA,   MAT_FACTOR_LU,MatGetFactor_seqdense_cuda);CHKERRQ(ierr);
375   ierr = MatSolverTypeRegister(MATSOLVERCUDA, MATSEQDENSECUDA,   MAT_FACTOR_CHOLESKY,MatGetFactor_seqdense_cuda);CHKERRQ(ierr);
376 #endif
377 
378   ierr = MatSolverTypeRegister(MATSOLVERBAS,   MATSEQAIJ,        MAT_FACTOR_ICC,MatGetFactor_seqaij_bas);CHKERRQ(ierr);
379 
380   /*
381      Register the external package factorization based solvers
382         Eventually we don't want to have these hardwired here at compile time of PETSc
383   */
384 #if defined(PETSC_HAVE_MUMPS)
385   ierr = MatSolverTypeRegister_MUMPS();CHKERRQ(ierr);
386 #endif
387 #if defined(PETSC_HAVE_CUDA)
388   ierr = MatSolverTypeRegister_CUSPARSE();CHKERRQ(ierr);
389 #endif
390 #if defined(PETSC_HAVE_KOKKOS_KERNELS)
391   ierr = MatSolverTypeRegister_KOKKOS();CHKERRQ(ierr);
392 #endif
393 #if defined(PETSC_HAVE_VIENNACL)
394   ierr = MatSolverTypeRegister_ViennaCL();CHKERRQ(ierr);
395 #endif
396 #if defined(PETSC_HAVE_ELEMENTAL)
397   ierr = MatSolverTypeRegister_Elemental();CHKERRQ(ierr);
398 #endif
399 #if defined(PETSC_HAVE_SCALAPACK)
400   ierr = MatSolverTypeRegister_ScaLAPACK();CHKERRQ(ierr);
401 #endif
402 #if defined(PETSC_HAVE_MATLAB_ENGINE)
403   ierr = MatSolverTypeRegister_Matlab();CHKERRQ(ierr);
404 #endif
405 #if defined(PETSC_HAVE_PETSC_HAVE_ESSL)
406   ierr = MatSolverTypeRegister_Essl();CHKERRQ(ierr);
407 #endif
408 #if defined(PETSC_HAVE_SUPERLU)
409   ierr = MatSolverTypeRegister_SuperLU();CHKERRQ(ierr);
410 #endif
411 #if defined(PETSC_HAVE_STRUMPACK)
412   ierr = MatSolverTypeRegister_STRUMPACK();CHKERRQ(ierr);
413 #endif
414 #if defined(PETSC_HAVE_PASTIX)
415   ierr = MatSolverTypeRegister_Pastix();CHKERRQ(ierr);
416 #endif
417 #if defined(PETSC_HAVE_SUPERLU_DIST)
418   ierr = MatSolverTypeRegister_SuperLU_DIST();CHKERRQ(ierr);
419 #endif
420 #if defined(PETSC_HAVE_ELEMENTAL)
421   ierr = MatSolverTypeRegister_SparseElemental();CHKERRQ(ierr);
422 #endif
423 #if defined(PETSC_HAVE_MKL_PARDISO)
424   ierr = MatSolverTypeRegister_MKL_Pardiso();CHKERRQ(ierr);
425 #endif
426 #if defined(PETSC_HAVE_MKL_CPARDISO)
427   ierr = MatSolverTypeRegister_MKL_CPardiso();CHKERRQ(ierr);
428 #endif
429 #if defined(PETSC_HAVE_SUITESPARSE)
430   ierr = MatSolverTypeRegister_SuiteSparse();CHKERRQ(ierr);
431 #endif
432 #if defined(PETSC_HAVE_LUSOL)
433   ierr = MatSolverTypeRegister_Lusol();CHKERRQ(ierr);
434 #endif
435   /* Register package finalizer */
436   ierr = PetscRegisterFinalize(MatFinalizePackage);CHKERRQ(ierr);
437   PetscFunctionReturn(0);
438 }
439 
440 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
441 /*
442   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
443 
444   This one registers all the matrix methods that are in the basic PETSc Matrix library.
445 
446  */
447 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscmat(void)
448 {
449   PetscErrorCode ierr;
450 
451   PetscFunctionBegin;
452   ierr = MatInitializePackage();CHKERRQ(ierr);
453   PetscFunctionReturn(0);
454 }
455 
456 
457 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
458