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