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