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