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