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