xref: /petsc/src/mat/interface/dlregismat.c (revision 285fb4e2b69b3de46a0633bd0adc6a7f684caa1e)
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 .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 = MatSolverTypeDestroy();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 MatSolverTypeRegister_MUMPS(void);
84 #endif
85 #if defined(PETSC_HAVE_VECCUDA)
86 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_CUSPARSE(void);
87 #endif
88 #if defined(PETSC_HAVE_VIENNACL)
89 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_ViennaCL(void);
90 #endif
91 #if defined(PETSC_HAVE_ELEMENTAL)
92 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Elemental(void);
93 #endif
94 #if defined(PETSC_HAVE_MATLAB_ENGINE)
95 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Matlab(void);
96 #endif
97 #if defined(PETSC_HAVE_PETSC_HAVE_ESSL)
98 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Essl(void);
99 #endif
100 #if defined(PETSC_HAVE_SUPERLU)
101 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SuperLU(void);
102 #endif
103 #if defined(PETSC_HAVE_STRUMPACK)
104 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_STRUMPACK(void);
105 #endif
106 #if defined(PETSC_HAVE_PASTIX)
107 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Pastix(void);
108 #endif
109 #if defined(PETSC_HAVE_SUPERLU_DIST)
110 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SuperLU_DIST(void);
111 #endif
112 #if defined(PETSC_HAVE_ELEMENTAL)
113 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SparseElemental(void);
114 #endif
115 #if defined(PETSC_HAVE_MKL_PARDISO)
116 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_MKL_Pardiso(void);
117 #endif
118 #if defined(PETSC_HAVE_MKL_CPARDISO)
119 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_MKL_CPardiso(void);
120 #endif
121 #if defined(PETSC_HAVE_SUITESPARSE)
122 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SuiteSparse(void);
123 #endif
124 #if defined(PETSC_HAVE_LUSOL)
125 PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Lusol(void);
126 #endif
127 
128 PETSC_INTERN PetscErrorCode MatGetFactor_seqaij_petsc(Mat,MatFactorType,Mat*);
129 PETSC_INTERN PetscErrorCode MatGetFactor_seqbaij_petsc(Mat,MatFactorType,Mat*);
130 PETSC_INTERN PetscErrorCode MatGetFactor_seqsbaij_petsc(Mat,MatFactorType,Mat*);
131 PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_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() when using dynamic libraries, and on the first call to MatCreate()
137   when using static libraries.
138 
139   Level: developer
140 
141 .keywords: Mat, initialize, package
142 .seealso: PetscInitialize()
143 @*/
144 PetscErrorCode  MatInitializePackage(void)
145 {
146   char           logList[256];
147   PetscBool      opt,pkg;
148   PetscErrorCode ierr;
149 
150   PetscFunctionBegin;
151   if (MatPackageInitialized) PetscFunctionReturn(0);
152   MatPackageInitialized = PETSC_TRUE;
153   /* Inialize subpackage */
154   ierr = MatMFFDInitializePackage();CHKERRQ(ierr);
155   /* Register Classes */
156   ierr = PetscClassIdRegister("Matrix",&MAT_CLASSID);CHKERRQ(ierr);
157   ierr = PetscClassIdRegister("Matrix FD Coloring",&MAT_FDCOLORING_CLASSID);CHKERRQ(ierr);
158   ierr = PetscClassIdRegister("Matrix Coloring",&MAT_COLORING_CLASSID);CHKERRQ(ierr);
159   ierr = PetscClassIdRegister("Matrix MatTranspose Coloring",&MAT_TRANSPOSECOLORING_CLASSID);CHKERRQ(ierr);
160   ierr = PetscClassIdRegister("Matrix Partitioning",&MAT_PARTITIONING_CLASSID);CHKERRQ(ierr);
161   ierr = PetscClassIdRegister("Matrix Coarsen",&MAT_COARSEN_CLASSID);CHKERRQ(ierr);
162   ierr = PetscClassIdRegister("Matrix Null Space",&MAT_NULLSPACE_CLASSID);CHKERRQ(ierr);
163   /* Register Constructors */
164   ierr = MatRegisterAll();CHKERRQ(ierr);
165   ierr = MatOrderingRegisterAll();CHKERRQ(ierr);
166   ierr = MatColoringRegisterAll();CHKERRQ(ierr);
167   ierr = MatPartitioningRegisterAll();CHKERRQ(ierr);
168   ierr = MatCoarsenRegisterAll();CHKERRQ(ierr);
169   ierr = MatSeqAIJRegisterAll();CHKERRQ(ierr);
170   /* Register Events */
171   ierr = PetscLogEventRegister("MatMult",          MAT_CLASSID,&MAT_Mult);CHKERRQ(ierr);
172   ierr = PetscLogEventRegister("MatMults",         MAT_CLASSID,&MAT_Mults);CHKERRQ(ierr);
173   ierr = PetscLogEventRegister("MatMultConstr",    MAT_CLASSID,&MAT_MultConstrained);CHKERRQ(ierr);
174   ierr = PetscLogEventRegister("MatMultAdd",       MAT_CLASSID,&MAT_MultAdd);CHKERRQ(ierr);
175   ierr = PetscLogEventRegister("MatMultTranspose", MAT_CLASSID,&MAT_MultTranspose);CHKERRQ(ierr);
176   ierr = PetscLogEventRegister("MatMultTrConstr",  MAT_CLASSID,&MAT_MultTransposeConstrained);CHKERRQ(ierr);
177   ierr = PetscLogEventRegister("MatMultTrAdd",     MAT_CLASSID,&MAT_MultTransposeAdd);CHKERRQ(ierr);
178   ierr = PetscLogEventRegister("MatSolve",         MAT_CLASSID,&MAT_Solve);CHKERRQ(ierr);
179   ierr = PetscLogEventRegister("MatSolves",        MAT_CLASSID,&MAT_Solves);CHKERRQ(ierr);
180   ierr = PetscLogEventRegister("MatSolveAdd",      MAT_CLASSID,&MAT_SolveAdd);CHKERRQ(ierr);
181   ierr = PetscLogEventRegister("MatSolveTranspos", MAT_CLASSID,&MAT_SolveTranspose);CHKERRQ(ierr);
182   ierr = PetscLogEventRegister("MatSolveTrAdd",    MAT_CLASSID,&MAT_SolveTransposeAdd);CHKERRQ(ierr);
183   ierr = PetscLogEventRegister("MatSOR",           MAT_CLASSID,&MAT_SOR);CHKERRQ(ierr);
184   ierr = PetscLogEventRegister("MatForwardSolve",  MAT_CLASSID,&MAT_ForwardSolve);CHKERRQ(ierr);
185   ierr = PetscLogEventRegister("MatBackwardSolve", MAT_CLASSID,&MAT_BackwardSolve);CHKERRQ(ierr);
186   ierr = PetscLogEventRegister("MatLUFactor",      MAT_CLASSID,&MAT_LUFactor);CHKERRQ(ierr);
187   ierr = PetscLogEventRegister("MatLUFactorSym",   MAT_CLASSID,&MAT_LUFactorSymbolic);CHKERRQ(ierr);
188   ierr = PetscLogEventRegister("MatLUFactorNum",   MAT_CLASSID,&MAT_LUFactorNumeric);CHKERRQ(ierr);
189   ierr = PetscLogEventRegister("MatCholeskyFctr",  MAT_CLASSID,&MAT_CholeskyFactor);CHKERRQ(ierr);
190   ierr = PetscLogEventRegister("MatCholFctrSym",   MAT_CLASSID,&MAT_CholeskyFactorSymbolic);CHKERRQ(ierr);
191   ierr = PetscLogEventRegister("MatCholFctrNum",   MAT_CLASSID,&MAT_CholeskyFactorNumeric);CHKERRQ(ierr);
192   ierr = PetscLogEventRegister("MatILUFactor",     MAT_CLASSID,&MAT_ILUFactor);CHKERRQ(ierr);
193   ierr = PetscLogEventRegister("MatILUFactorSym",  MAT_CLASSID,&MAT_ILUFactorSymbolic);CHKERRQ(ierr);
194   ierr = PetscLogEventRegister("MatICCFactorSym",  MAT_CLASSID,&MAT_ICCFactorSymbolic);CHKERRQ(ierr);
195   ierr = PetscLogEventRegister("MatCopy",          MAT_CLASSID,&MAT_Copy);CHKERRQ(ierr);
196   ierr = PetscLogEventRegister("MatConvert",       MAT_CLASSID,&MAT_Convert);CHKERRQ(ierr);
197   ierr = PetscLogEventRegister("MatScale",         MAT_CLASSID,&MAT_Scale);CHKERRQ(ierr);
198   ierr = PetscLogEventRegister("MatResidual",      MAT_CLASSID,&MAT_Residual);CHKERRQ(ierr);
199   ierr = PetscLogEventRegister("MatAssemblyBegin", MAT_CLASSID,&MAT_AssemblyBegin);CHKERRQ(ierr);
200   ierr = PetscLogEventRegister("MatAssemblyEnd",   MAT_CLASSID,&MAT_AssemblyEnd);CHKERRQ(ierr);
201   ierr = PetscLogEventRegister("MatSetValues",     MAT_CLASSID,&MAT_SetValues);CHKERRQ(ierr);
202   ierr = PetscLogEventRegister("MatGetValues",     MAT_CLASSID,&MAT_GetValues);CHKERRQ(ierr);
203   ierr = PetscLogEventRegister("MatGetRow",        MAT_CLASSID,&MAT_GetRow);CHKERRQ(ierr);
204   ierr = PetscLogEventRegister("MatGetRowIJ",      MAT_CLASSID,&MAT_GetRowIJ);CHKERRQ(ierr);
205   ierr = PetscLogEventRegister("MatCreateSubMats", MAT_CLASSID,&MAT_CreateSubMats);CHKERRQ(ierr);
206   ierr = PetscLogEventRegister("MatCreateSubMat",  MAT_CLASSID,&MAT_CreateSubMat);CHKERRQ(ierr);
207   ierr = PetscLogEventRegister("MatGetOrdering",   MAT_CLASSID,&MAT_GetOrdering);CHKERRQ(ierr);
208   ierr = PetscLogEventRegister("MatIncreaseOvrlp", MAT_CLASSID,&MAT_IncreaseOverlap);CHKERRQ(ierr);
209   ierr = PetscLogEventRegister("MatPartitioning",  MAT_PARTITIONING_CLASSID,&MAT_Partitioning);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("MatTranspose_SeqAIJ_FAST",MAT_CLASSID,&MAT_Transpose_SeqAIJ);CHKERRQ(ierr);
263   ierr = PetscLogEventRegister("MatCUSPARSECopyTo",MAT_CLASSID,&MAT_CUSPARSECopyToGPU);CHKERRQ(ierr);
264   ierr = PetscLogEventRegister("MatViennaCLCopyTo",MAT_CLASSID,&MAT_ViennaCLCopyToGPU);CHKERRQ(ierr);
265   ierr = PetscLogEventRegister("MatSetValBatch",MAT_CLASSID,&MAT_SetValuesBatch);CHKERRQ(ierr);
266 
267   ierr = PetscLogEventRegister("MatColoringApply",MAT_COLORING_CLASSID,&MATCOLORING_Apply);CHKERRQ(ierr);
268   ierr = PetscLogEventRegister("MatColoringComm",MAT_COLORING_CLASSID,&MATCOLORING_Comm);CHKERRQ(ierr);
269   ierr = PetscLogEventRegister("MatColoringLocal",MAT_COLORING_CLASSID,&MATCOLORING_Local);CHKERRQ(ierr);
270   ierr = PetscLogEventRegister("MatColoringIS",MAT_COLORING_CLASSID,&MATCOLORING_ISCreate);CHKERRQ(ierr);
271   ierr = PetscLogEventRegister("MatColoringSetUp",MAT_COLORING_CLASSID,&MATCOLORING_SetUp);CHKERRQ(ierr);
272   ierr = PetscLogEventRegister("MatColoringWeights",MAT_COLORING_CLASSID,&MATCOLORING_Weights);CHKERRQ(ierr);
273 
274   /* Mark non-collective events */
275   ierr = PetscLogEventSetCollective(MAT_SetValues,      PETSC_FALSE);CHKERRQ(ierr);
276   ierr = PetscLogEventSetCollective(MAT_SetValuesBatch, PETSC_FALSE);CHKERRQ(ierr);
277   ierr = PetscLogEventSetCollective(MAT_GetRow,         PETSC_FALSE);CHKERRQ(ierr);
278   /* Turn off high traffic events by default */
279   ierr = PetscLogEventSetActiveAll(MAT_SetValues, PETSC_FALSE);CHKERRQ(ierr);
280   ierr = PetscLogEventSetActiveAll(MAT_GetValues, PETSC_FALSE);CHKERRQ(ierr);
281   ierr = PetscLogEventSetActiveAll(MAT_GetRow,    PETSC_FALSE);CHKERRQ(ierr);
282 
283   /* Process info exclusions */
284   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
285   if (opt) {
286     ierr = PetscStrInList("mat",logList,',',&pkg);CHKERRQ(ierr);
287     if (pkg) {ierr = PetscInfoDeactivateClass(MAT_CLASSID);CHKERRQ(ierr);}
288     if (pkg) {ierr = PetscInfoDeactivateClass(MAT_FDCOLORING_CLASSID);CHKERRQ(ierr);}
289     if (pkg) {ierr = PetscInfoDeactivateClass(MAT_COLORING_CLASSID);CHKERRQ(ierr);}
290     if (pkg) {ierr = PetscInfoDeactivateClass(MAT_TRANSPOSECOLORING_CLASSID);CHKERRQ(ierr);}
291     if (pkg) {ierr = PetscInfoDeactivateClass(MAT_PARTITIONING_CLASSID);CHKERRQ(ierr);}
292     if (pkg) {ierr = PetscInfoDeactivateClass(MAT_COARSEN_CLASSID);CHKERRQ(ierr);}
293     if (pkg) {ierr = PetscInfoDeactivateClass(MAT_NULLSPACE_CLASSID);CHKERRQ(ierr);}
294   }
295 
296   /* Process summary exclusions */
297   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
298   if (opt) {
299     ierr = PetscStrInList("mat",logList,',',&pkg);CHKERRQ(ierr);
300     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_CLASSID);CHKERRQ(ierr);}
301     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_FDCOLORING_CLASSID);CHKERRQ(ierr);}
302     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_COLORING_CLASSID);CHKERRQ(ierr);}
303     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_TRANSPOSECOLORING_CLASSID);CHKERRQ(ierr);}
304     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_PARTITIONING_CLASSID);CHKERRQ(ierr);}
305     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_COARSEN_CLASSID);CHKERRQ(ierr);}
306     if (pkg) {ierr = PetscLogEventExcludeClass(MAT_NULLSPACE_CLASSID);CHKERRQ(ierr);}
307   }
308 
309   /* Register the PETSc built in factorization based solvers */
310   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_LU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
311   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
312   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
313   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ,        MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
314 
315   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_LU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
316   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
317   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
318   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM,    MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
319 
320 #if defined(PETSC_HAVE_MKL_SPARSE)
321   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_LU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
322   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
323   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
324   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL,     MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
325 
326   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_LU,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
327   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_CHOLESKY,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
328   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_ILU,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
329   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL,    MAT_FACTOR_ICC,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
330 #endif
331     /* Above, we register the PETSc built-in factorization solvers for MATSEQAIJMKL.  In the future, we may want to use
332      * some of the MKL-provided ones instead. */
333 
334   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_LU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
335   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_CHOLESKY,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
336   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_ILU,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
337   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL,     MAT_FACTOR_ICC,MatGetFactor_seqaij_petsc);CHKERRQ(ierr);
338 
339   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_LU,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
340   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_CHOLESKY,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
341   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_ILU,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
342   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ,       MAT_FACTOR_ICC,MatGetFactor_seqbaij_petsc);CHKERRQ(ierr);
343 
344   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ,      MAT_FACTOR_CHOLESKY,MatGetFactor_seqsbaij_petsc);CHKERRQ(ierr);
345   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ,      MAT_FACTOR_ICC,MatGetFactor_seqsbaij_petsc);CHKERRQ(ierr);
346 
347   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE,      MAT_FACTOR_LU,MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
348   ierr = MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE,      MAT_FACTOR_CHOLESKY,MatGetFactor_seqdense_petsc);CHKERRQ(ierr);
349 
350   ierr = MatSolverTypeRegister(MATSOLVERBAS,   MATSEQAIJ,        MAT_FACTOR_ICC,MatGetFactor_seqaij_bas);CHKERRQ(ierr);
351 
352   /*
353      Register the external package factorization based solvers
354         Eventually we don't want to have these hardwired here at compile time of PETSc
355   */
356 #if defined(PETSC_HAVE_MUMPS)
357   ierr = MatSolverTypeRegister_MUMPS();CHKERRQ(ierr);
358 #endif
359 #if defined(PETSC_HAVE_VECCUDA)
360   ierr = MatSolverTypeRegister_CUSPARSE();CHKERRQ(ierr);
361 #endif
362 #if defined(PETSC_HAVE_VIENNACL)
363   ierr = MatSolverTypeRegister_ViennaCL();CHKERRQ(ierr);
364 #endif
365 #if defined(PETSC_HAVE_ELEMENTAL)
366   ierr = MatSolverTypeRegister_Elemental();CHKERRQ(ierr);
367 #endif
368 #if defined(PETSC_HAVE_MATLAB_ENGINE)
369   ierr = MatSolverTypeRegister_Matlab();CHKERRQ(ierr);
370 #endif
371 #if defined(PETSC_HAVE_PETSC_HAVE_ESSL)
372   ierr = MatSolverTypeRegister_Essl();CHKERRQ(ierr);
373 #endif
374 #if defined(PETSC_HAVE_SUPERLU)
375   ierr = MatSolverTypeRegister_SuperLU();CHKERRQ(ierr);
376 #endif
377 #if defined(PETSC_HAVE_STRUMPACK)
378   ierr = MatSolverTypeRegister_STRUMPACK();CHKERRQ(ierr);
379 #endif
380 #if defined(PETSC_HAVE_PASTIX)
381   ierr = MatSolverTypeRegister_Pastix();CHKERRQ(ierr);
382 #endif
383 #if defined(PETSC_HAVE_SUPERLU_DIST)
384   ierr = MatSolverTypeRegister_SuperLU_DIST();CHKERRQ(ierr);
385 #endif
386 #if defined(PETSC_HAVE_ELEMENTAL)
387   ierr = MatSolverTypeRegister_SparseElemental();CHKERRQ(ierr);
388 #endif
389 #if defined(PETSC_HAVE_MKL_PARDISO)
390   ierr = MatSolverTypeRegister_MKL_Pardiso();CHKERRQ(ierr);
391 #endif
392 #if defined(PETSC_HAVE_MKL_CPARDISO)
393   ierr = MatSolverTypeRegister_MKL_CPardiso();CHKERRQ(ierr);
394 #endif
395 #if defined(PETSC_HAVE_SUITESPARSE)
396   ierr = MatSolverTypeRegister_SuiteSparse();CHKERRQ(ierr);
397 #endif
398 #if defined(PETSC_HAVE_LUSOL)
399   ierr = MatSolverTypeRegister_Lusol();CHKERRQ(ierr);
400 #endif
401 #if defined(PETSC_HAVE_ELEMENTAL)
402   ierr = MatSolverTypeRegister_SparseElemental();CHKERRQ(ierr);
403 #endif
404   /* Register package finalizer */
405   ierr = PetscRegisterFinalize(MatFinalizePackage);CHKERRQ(ierr);
406   PetscFunctionReturn(0);
407 }
408 
409 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
410 /*
411   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
412 
413   This one registers all the matrix methods that are in the basic PETSc Matrix library.
414 
415  */
416 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscmat(void)
417 {
418   PetscErrorCode ierr;
419 
420   PetscFunctionBegin;
421   ierr = MatInitializePackage();CHKERRQ(ierr);
422   PetscFunctionReturn(0);
423 }
424 
425 
426 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
427