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_CUDA)
 60: PETSC_INTERN PetscErrorCode MatSolverTypeRegister_DENSECUDA(void);
 61: #endif

 63: #if defined(PETSC_HAVE_HIP)
 64: PETSC_INTERN PetscErrorCode MatSolverTypeRegister_DENSEHIP(void);
 65: #endif

 67: #if defined(PETSC_HAVE_MUMPS)
 68: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_MUMPS(void);
 69: #endif
 70: #if defined(PETSC_HAVE_CUDA)
 71: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_CUSPARSE(void);
 72: #endif
 73: #if defined(PETSC_HAVE_HIP)
 74: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_HIPSPARSE(void);
 75: #endif
 76: #if defined(PETSC_HAVE_KOKKOS_KERNELS)
 77: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_KOKKOS(void);
 78: #endif
 79: #if defined(PETSC_HAVE_VIENNACL)
 80: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_ViennaCL(void);
 81: #endif
 82: #if defined(PETSC_HAVE_ELEMENTAL)
 83: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Elemental(void);
 84: #endif
 85: #if defined(PETSC_HAVE_SCALAPACK)
 86: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_ScaLAPACK(void);
 87: #endif
 88: #if defined(PETSC_HAVE_MATLAB)
 89: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Matlab(void);
 90: #endif
 91: #if defined(PETSC_HAVE_ESSL)
 92: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Essl(void);
 93: #endif
 94: #if defined(PETSC_HAVE_SUPERLU)
 95: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SuperLU(void);
 96: #endif
 97: #if defined(PETSC_HAVE_STRUMPACK)
 98: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_STRUMPACK(void);
 99: #endif
100: #if defined(PETSC_HAVE_PASTIX)
101: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Pastix(void);
102: #endif
103: #if defined(PETSC_HAVE_SUPERLU_DIST)
104: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SuperLU_DIST(void);
105: #endif
106: #if defined(PETSC_HAVE_ELEMENTAL)
107: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SparseElemental(void);
108: #endif
109: #if defined(PETSC_HAVE_MKL_PARDISO)
110: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_MKL_Pardiso(void);
111: #endif
112: #if defined(PETSC_HAVE_MKL_CPARDISO)
113: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_MKL_CPardiso(void);
114: #endif
115: #if defined(PETSC_HAVE_SUITESPARSE)
116: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_SuiteSparse(void);
117: #endif
118: #if defined(PETSC_HAVE_LUSOL)
119: PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Lusol(void);
120: #endif

122: PETSC_INTERN PetscErrorCode MatGetFactor_seqaij_petsc(Mat, MatFactorType, Mat *);
123: PETSC_INTERN PetscErrorCode MatGetFactor_seqbaij_petsc(Mat, MatFactorType, Mat *);
124: PETSC_INTERN PetscErrorCode MatGetFactor_seqsbaij_petsc(Mat, MatFactorType, Mat *);
125: PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat, MatFactorType, Mat *);
126: #if defined(PETSC_HAVE_CUDA)
127: PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_cuda(Mat, MatFactorType, Mat *);
128: #endif
129: #if defined(PETSC_HAVE_HIP)
130: PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_hip(Mat, MatFactorType, Mat *);
131: #endif
132: PETSC_INTERN PetscErrorCode MatGetFactor_constantdiagonal_petsc(Mat, MatFactorType, Mat *);
133: PETSC_INTERN PetscErrorCode MatGetFactor_seqaij_bas(Mat, MatFactorType, Mat *);

135: /*@C
136:   MatInitializePackage - This function initializes everything in the `Mat` package. It is called
137:   from `PetscDLLibraryRegister_petscmat()` when using dynamic libraries, and on the first call to `MatCreate()`
138:   when using shared or static libraries.

140:   Level: developer

142: .seealso: [](chapter_matrices), `Mat`, `PetscInitialize()`, `MatFinalizePackage()`
143: @*/
144: PetscErrorCode MatInitializePackage(void)
145: {
146:   char      logList[256];
147:   PetscBool opt, pkg;

149:   PetscFunctionBegin;
150:   if (MatPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
151:   MatPackageInitialized = PETSC_TRUE;
152:   /* Initialize subpackage */
153:   PetscCall(MatMFFDInitializePackage());
154:   /* Register Classes */
155:   PetscCall(PetscClassIdRegister("Matrix", &MAT_CLASSID));
156:   PetscCall(PetscClassIdRegister("Matrix FD Coloring", &MAT_FDCOLORING_CLASSID));
157:   PetscCall(PetscClassIdRegister("Matrix Coloring", &MAT_COLORING_CLASSID));
158:   PetscCall(PetscClassIdRegister("Matrix MatTranspose Coloring", &MAT_TRANSPOSECOLORING_CLASSID));
159:   PetscCall(PetscClassIdRegister("Matrix Partitioning", &MAT_PARTITIONING_CLASSID));
160:   PetscCall(PetscClassIdRegister("Matrix Coarsen", &MAT_COARSEN_CLASSID));
161:   PetscCall(PetscClassIdRegister("Matrix Null Space", &MAT_NULLSPACE_CLASSID));
162:   /* Register Constructors */
163:   PetscCall(MatRegisterAll());
164:   PetscCall(MatOrderingRegisterAll());
165:   PetscCall(MatColoringRegisterAll());
166:   PetscCall(MatPartitioningRegisterAll());
167:   PetscCall(MatCoarsenRegisterAll());
168:   PetscCall(MatSeqAIJRegisterAll());
169:   /* Register Events */
170:   PetscCall(PetscLogEventRegister("MatMult", MAT_CLASSID, &MAT_Mult));
171:   PetscCall(PetscLogEventRegister("MatMults", MAT_CLASSID, &MAT_Mults));
172:   PetscCall(PetscLogEventRegister("MatMultAdd", MAT_CLASSID, &MAT_MultAdd));
173:   PetscCall(PetscLogEventRegister("MatMultTranspose", MAT_CLASSID, &MAT_MultTranspose));
174:   PetscCall(PetscLogEventRegister("MatMultTrAdd", MAT_CLASSID, &MAT_MultTransposeAdd));
175:   PetscCall(PetscLogEventRegister("MatSolve", MAT_CLASSID, &MAT_Solve));
176:   PetscCall(PetscLogEventRegister("MatSolves", MAT_CLASSID, &MAT_Solves));
177:   PetscCall(PetscLogEventRegister("MatSolveAdd", MAT_CLASSID, &MAT_SolveAdd));
178:   PetscCall(PetscLogEventRegister("MatSolveTranspos", MAT_CLASSID, &MAT_SolveTranspose));
179:   PetscCall(PetscLogEventRegister("MatSolveTrAdd", MAT_CLASSID, &MAT_SolveTransposeAdd));
180:   PetscCall(PetscLogEventRegister("MatSOR", MAT_CLASSID, &MAT_SOR));
181:   PetscCall(PetscLogEventRegister("MatForwardSolve", MAT_CLASSID, &MAT_ForwardSolve));
182:   PetscCall(PetscLogEventRegister("MatBackwardSolve", MAT_CLASSID, &MAT_BackwardSolve));
183:   PetscCall(PetscLogEventRegister("MatLUFactor", MAT_CLASSID, &MAT_LUFactor));
184:   PetscCall(PetscLogEventRegister("MatLUFactorSym", MAT_CLASSID, &MAT_LUFactorSymbolic));
185:   PetscCall(PetscLogEventRegister("MatLUFactorNum", MAT_CLASSID, &MAT_LUFactorNumeric));
186:   PetscCall(PetscLogEventRegister("MatQRFactor", MAT_CLASSID, &MAT_QRFactor));
187:   PetscCall(PetscLogEventRegister("MatQRFactorSym", MAT_CLASSID, &MAT_QRFactorSymbolic));
188:   PetscCall(PetscLogEventRegister("MatQRFactorNum", MAT_CLASSID, &MAT_QRFactorNumeric));
189:   PetscCall(PetscLogEventRegister("MatCholeskyFctr", MAT_CLASSID, &MAT_CholeskyFactor));
190:   PetscCall(PetscLogEventRegister("MatCholFctrSym", MAT_CLASSID, &MAT_CholeskyFactorSymbolic));
191:   PetscCall(PetscLogEventRegister("MatCholFctrNum", MAT_CLASSID, &MAT_CholeskyFactorNumeric));
192:   PetscCall(PetscLogEventRegister("MatFctrFactSchur", MAT_CLASSID, &MAT_FactorFactS));
193:   PetscCall(PetscLogEventRegister("MatFctrInvSchur", MAT_CLASSID, &MAT_FactorInvS));
194:   PetscCall(PetscLogEventRegister("MatILUFactor", MAT_CLASSID, &MAT_ILUFactor));
195:   PetscCall(PetscLogEventRegister("MatILUFactorSym", MAT_CLASSID, &MAT_ILUFactorSymbolic));
196:   PetscCall(PetscLogEventRegister("MatICCFactorSym", MAT_CLASSID, &MAT_ICCFactorSymbolic));
197:   PetscCall(PetscLogEventRegister("MatCopy", MAT_CLASSID, &MAT_Copy));
198:   PetscCall(PetscLogEventRegister("MatConvert", MAT_CLASSID, &MAT_Convert));
199:   PetscCall(PetscLogEventRegister("MatScale", MAT_CLASSID, &MAT_Scale));
200:   PetscCall(PetscLogEventRegister("MatResidual", MAT_CLASSID, &MAT_Residual));
201:   PetscCall(PetscLogEventRegister("MatAssemblyBegin", MAT_CLASSID, &MAT_AssemblyBegin));
202:   PetscCall(PetscLogEventRegister("MatAssemblyEnd", MAT_CLASSID, &MAT_AssemblyEnd));
203:   PetscCall(PetscLogEventRegister("MatSetValues", MAT_CLASSID, &MAT_SetValues));
204:   PetscCall(PetscLogEventRegister("MatGetValues", MAT_CLASSID, &MAT_GetValues));
205:   PetscCall(PetscLogEventRegister("MatGetRow", MAT_CLASSID, &MAT_GetRow));
206:   PetscCall(PetscLogEventRegister("MatGetRowIJ", MAT_CLASSID, &MAT_GetRowIJ));
207:   PetscCall(PetscLogEventRegister("MatCreateSubMats", MAT_CLASSID, &MAT_CreateSubMats));
208:   PetscCall(PetscLogEventRegister("MatCreateSubMat", MAT_CLASSID, &MAT_CreateSubMat));
209:   PetscCall(PetscLogEventRegister("MatGetOrdering", MAT_CLASSID, &MAT_GetOrdering));
210:   PetscCall(PetscLogEventRegister("MatIncreaseOvrlp", MAT_CLASSID, &MAT_IncreaseOverlap));
211:   PetscCall(PetscLogEventRegister("MatPartitioning", MAT_PARTITIONING_CLASSID, &MAT_Partitioning));
212:   PetscCall(PetscLogEventRegister("MatPartitioningND", MAT_PARTITIONING_CLASSID, &MAT_PartitioningND));
213:   PetscCall(PetscLogEventRegister("MatCoarsen", MAT_COARSEN_CLASSID, &MAT_Coarsen));
214:   PetscCall(PetscLogEventRegister("MatZeroEntries", MAT_CLASSID, &MAT_ZeroEntries));
215:   PetscCall(PetscLogEventRegister("MatLoad", MAT_CLASSID, &MAT_Load));
216:   PetscCall(PetscLogEventRegister("MatView", MAT_CLASSID, &MAT_View));
217:   PetscCall(PetscLogEventRegister("MatAXPY", MAT_CLASSID, &MAT_AXPY));
218:   PetscCall(PetscLogEventRegister("MatFDColorCreate", MAT_FDCOLORING_CLASSID, &MAT_FDColoringCreate));
219:   PetscCall(PetscLogEventRegister("MatFDColorSetUp", MAT_FDCOLORING_CLASSID, &MAT_FDColoringSetUp));
220:   PetscCall(PetscLogEventRegister("MatFDColorApply", MAT_FDCOLORING_CLASSID, &MAT_FDColoringApply));
221:   PetscCall(PetscLogEventRegister("MatFDColorFunc", MAT_FDCOLORING_CLASSID, &MAT_FDColoringFunction));
222:   PetscCall(PetscLogEventRegister("MatTranspose", MAT_CLASSID, &MAT_Transpose));
223:   PetscCall(PetscLogEventRegister("MatMatSolve", MAT_CLASSID, &MAT_MatSolve));
224:   PetscCall(PetscLogEventRegister("MatMatTrSolve", MAT_CLASSID, &MAT_MatTrSolve));
225:   PetscCall(PetscLogEventRegister("MatMatMultSym", MAT_CLASSID, &MAT_MatMultSymbolic));
226:   PetscCall(PetscLogEventRegister("MatMatMultNum", MAT_CLASSID, &MAT_MatMultNumeric));
227:   PetscCall(PetscLogEventRegister("MatMatMatMultSym", MAT_CLASSID, &MAT_MatMatMultSymbolic));
228:   PetscCall(PetscLogEventRegister("MatMatMatMultNum", MAT_CLASSID, &MAT_MatMatMultNumeric));
229:   PetscCall(PetscLogEventRegister("MatPtAPSymbolic", MAT_CLASSID, &MAT_PtAPSymbolic));
230:   PetscCall(PetscLogEventRegister("MatPtAPNumeric", MAT_CLASSID, &MAT_PtAPNumeric));
231:   PetscCall(PetscLogEventRegister("MatRARtSym", MAT_CLASSID, &MAT_RARtSymbolic));
232:   PetscCall(PetscLogEventRegister("MatRARtNum", MAT_CLASSID, &MAT_RARtNumeric));
233:   PetscCall(PetscLogEventRegister("MatMatTrnMultSym", MAT_CLASSID, &MAT_MatTransposeMultSymbolic));
234:   PetscCall(PetscLogEventRegister("MatMatTrnMultNum", MAT_CLASSID, &MAT_MatTransposeMultNumeric));
235:   PetscCall(PetscLogEventRegister("MatTrnMatMultSym", MAT_CLASSID, &MAT_TransposeMatMultSymbolic));
236:   PetscCall(PetscLogEventRegister("MatTrnMatMultNum", MAT_CLASSID, &MAT_TransposeMatMultNumeric));
237:   PetscCall(PetscLogEventRegister("MatTrnColorCreate", MAT_CLASSID, &MAT_TransposeColoringCreate));
238:   PetscCall(PetscLogEventRegister("MatRedundantMat", MAT_CLASSID, &MAT_RedundantMat));
239:   PetscCall(PetscLogEventRegister("MatGetSeqNZStrct", MAT_CLASSID, &MAT_GetSequentialNonzeroStructure));
240:   PetscCall(PetscLogEventRegister("MatGetMultiProcB", MAT_CLASSID, &MAT_GetMultiProcBlock));
241:   PetscCall(PetscLogEventRegister("MatSetRandom", MAT_CLASSID, &MAT_SetRandom));

243:   /* these may be specific to MPIAIJ matrices */
244:   PetscCall(PetscLogEventRegister("MatMPISumSeqNumeric", MAT_CLASSID, &MAT_Seqstompinum));
245:   PetscCall(PetscLogEventRegister("MatMPISumSeqSymbolic", MAT_CLASSID, &MAT_Seqstompisym));
246:   PetscCall(PetscLogEventRegister("MatMPISumSeq", MAT_CLASSID, &MAT_Seqstompi));
247:   PetscCall(PetscLogEventRegister("MatMPIConcateSeq", MAT_CLASSID, &MAT_Merge));
248:   PetscCall(PetscLogEventRegister("MatGetLocalMat", MAT_CLASSID, &MAT_Getlocalmat));
249:   PetscCall(PetscLogEventRegister("MatGetLocalMatCondensed", MAT_CLASSID, &MAT_Getlocalmatcondensed));
250:   PetscCall(PetscLogEventRegister("MatGetBrowsOfAcols", MAT_CLASSID, &MAT_GetBrowsOfAcols));
251:   PetscCall(PetscLogEventRegister("MatGetBrAoCol", MAT_CLASSID, &MAT_GetBrowsOfAocols));

253:   PetscCall(PetscLogEventRegister("MatApplyPAPt_Symbolic", MAT_CLASSID, &MAT_Applypapt_symbolic));
254:   PetscCall(PetscLogEventRegister("MatApplyPAPt_Numeric", MAT_CLASSID, &MAT_Applypapt_numeric));
255:   PetscCall(PetscLogEventRegister("MatApplyPAPt", MAT_CLASSID, &MAT_Applypapt));

257:   PetscCall(PetscLogEventRegister("MatGetSymTrans", MAT_CLASSID, &MAT_Getsymtranspose));
258:   PetscCall(PetscLogEventRegister("MatGetSymTransR", MAT_CLASSID, &MAT_Getsymtransreduced));
259:   PetscCall(PetscLogEventRegister("MatCUSPARSCopyTo", MAT_CLASSID, &MAT_CUSPARSECopyToGPU));
260:   PetscCall(PetscLogEventRegister("MatCUSPARSCopyFr", MAT_CLASSID, &MAT_CUSPARSECopyFromGPU));
261:   PetscCall(PetscLogEventRegister("MatCUSPARSSolAnl", MAT_CLASSID, &MAT_CUSPARSESolveAnalysis));
262:   PetscCall(PetscLogEventRegister("MatCUSPARSGenT", MAT_CLASSID, &MAT_CUSPARSEGenerateTranspose));
263:   PetscCall(PetscLogEventRegister("MatHIPSPARSCopyTo", MAT_CLASSID, &MAT_HIPSPARSECopyToGPU));
264:   PetscCall(PetscLogEventRegister("MatHIPSPARSCopyFr", MAT_CLASSID, &MAT_HIPSPARSECopyFromGPU));
265:   PetscCall(PetscLogEventRegister("MatHIPSPARSSolAnl", MAT_CLASSID, &MAT_HIPSPARSESolveAnalysis));
266:   PetscCall(PetscLogEventRegister("MatHIPSPARSGenT", MAT_CLASSID, &MAT_HIPSPARSEGenerateTranspose));
267:   PetscCall(PetscLogEventRegister("MatVCLCopyTo", MAT_CLASSID, &MAT_ViennaCLCopyToGPU));
268:   PetscCall(PetscLogEventRegister("MatDenseCopyTo", MAT_CLASSID, &MAT_DenseCopyToGPU));
269:   PetscCall(PetscLogEventRegister("MatDenseCopyFrom", MAT_CLASSID, &MAT_DenseCopyFromGPU));
270:   PetscCall(PetscLogEventRegister("MatSetValBatch", MAT_CLASSID, &MAT_SetValuesBatch));

272:   PetscCall(PetscLogEventRegister("MatColoringApply", MAT_COLORING_CLASSID, &MATCOLORING_Apply));
273:   PetscCall(PetscLogEventRegister("MatColoringComm", MAT_COLORING_CLASSID, &MATCOLORING_Comm));
274:   PetscCall(PetscLogEventRegister("MatColoringLocal", MAT_COLORING_CLASSID, &MATCOLORING_Local));
275:   PetscCall(PetscLogEventRegister("MatColoringIS", MAT_COLORING_CLASSID, &MATCOLORING_ISCreate));
276:   PetscCall(PetscLogEventRegister("MatColoringSetUp", MAT_COLORING_CLASSID, &MATCOLORING_SetUp));
277:   PetscCall(PetscLogEventRegister("MatColoringWeights", MAT_COLORING_CLASSID, &MATCOLORING_Weights));

279:   PetscCall(PetscLogEventRegister("MatSetPreallCOO", MAT_CLASSID, &MAT_PreallCOO));
280:   PetscCall(PetscLogEventRegister("MatSetValuesCOO", MAT_CLASSID, &MAT_SetVCOO));

282:   PetscCall(PetscLogEventRegister("MatH2OpusBuild", MAT_CLASSID, &MAT_H2Opus_Build));
283:   PetscCall(PetscLogEventRegister("MatH2OpusComp", MAT_CLASSID, &MAT_H2Opus_Compress));
284:   PetscCall(PetscLogEventRegister("MatH2OpusOrth", MAT_CLASSID, &MAT_H2Opus_Orthog));
285:   PetscCall(PetscLogEventRegister("MatH2OpusLR", MAT_CLASSID, &MAT_H2Opus_LR));

287:   /* Mark non-collective events */
288:   PetscCall(PetscLogEventSetCollective(MAT_SetValues, PETSC_FALSE));
289:   PetscCall(PetscLogEventSetCollective(MAT_SetValuesBatch, PETSC_FALSE));
290:   PetscCall(PetscLogEventSetCollective(MAT_GetRow, PETSC_FALSE));
291:   /* Turn off high traffic events by default */
292:   PetscCall(PetscLogEventSetActiveAll(MAT_SetValues, PETSC_FALSE));
293:   PetscCall(PetscLogEventSetActiveAll(MAT_GetValues, PETSC_FALSE));
294:   PetscCall(PetscLogEventSetActiveAll(MAT_GetRow, PETSC_FALSE));
295:   /* Process Info */
296:   {
297:     PetscClassId classids[7];

299:     classids[0] = MAT_CLASSID;
300:     classids[1] = MAT_FDCOLORING_CLASSID;
301:     classids[2] = MAT_COLORING_CLASSID;
302:     classids[3] = MAT_TRANSPOSECOLORING_CLASSID;
303:     classids[4] = MAT_PARTITIONING_CLASSID;
304:     classids[5] = MAT_COARSEN_CLASSID;
305:     classids[6] = MAT_NULLSPACE_CLASSID;
306:     PetscCall(PetscInfoProcessClass("mat", 7, classids));
307:   }

309:   /* Process summary exclusions */
310:   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
311:   if (opt) {
312:     PetscCall(PetscStrInList("mat", logList, ',', &pkg));
313:     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_CLASSID));
314:     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_FDCOLORING_CLASSID));
315:     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_COLORING_CLASSID));
316:     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_TRANSPOSECOLORING_CLASSID));
317:     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_PARTITIONING_CLASSID));
318:     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_COARSEN_CLASSID));
319:     if (pkg) PetscCall(PetscLogEventExcludeClass(MAT_NULLSPACE_CLASSID));
320:   }

322:   /* Register the PETSc built in factorization based solvers */
323:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
324:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
325:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
326:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJ, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));

328:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
329:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
330:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
331:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJPERM, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));

333:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_LU, MatGetFactor_constantdiagonal_petsc));
334:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_CHOLESKY, MatGetFactor_constantdiagonal_petsc));
335:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_ILU, MatGetFactor_constantdiagonal_petsc));
336:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATCONSTANTDIAGONAL, MAT_FACTOR_ICC, MatGetFactor_constantdiagonal_petsc));

338: #if defined(PETSC_HAVE_MKL_SPARSE)
339:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
340:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
341:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
342:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJMKL, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));

344:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_LU, MatGetFactor_seqbaij_petsc));
345:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_CHOLESKY, MatGetFactor_seqbaij_petsc));
346:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_ILU, MatGetFactor_seqbaij_petsc));
347:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJMKL, MAT_FACTOR_ICC, MatGetFactor_seqbaij_petsc));
348: #endif
349:   /* Above, we register the PETSc built-in factorization solvers for MATSEQAIJMKL.  In the future, we may want to use
350:      * some of the MKL-provided ones instead. */

352:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_LU, MatGetFactor_seqaij_petsc));
353:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_CHOLESKY, MatGetFactor_seqaij_petsc));
354:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_ILU, MatGetFactor_seqaij_petsc));
355:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQAIJCRL, MAT_FACTOR_ICC, MatGetFactor_seqaij_petsc));

357:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_LU, MatGetFactor_seqbaij_petsc));
358:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqbaij_petsc));
359:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_ILU, MatGetFactor_seqbaij_petsc));
360:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQBAIJ, MAT_FACTOR_ICC, MatGetFactor_seqbaij_petsc));

362:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqsbaij_petsc));
363:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_ICC, MatGetFactor_seqsbaij_petsc));

365:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_LU, MatGetFactor_seqdense_petsc));
366:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_ILU, MatGetFactor_seqdense_petsc));
367:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_CHOLESKY, MatGetFactor_seqdense_petsc));
368:   PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQDENSE, MAT_FACTOR_QR, MatGetFactor_seqdense_petsc));
369: #if defined(PETSC_HAVE_CUDA)
370:   PetscCall(MatSolverTypeRegister_DENSECUDA());
371: #endif
372: #if defined(PETSC_HAVE_HIP)
373:   PetscCall(MatSolverTypeRegister_DENSEHIP());
374: #endif

376:   PetscCall(MatSolverTypeRegister(MATSOLVERBAS, MATSEQAIJ, MAT_FACTOR_ICC, MatGetFactor_seqaij_bas));

378:   /*
379:      Register the external package factorization based solvers
380:         Eventually we don't want to have these hardwired here at compile time of PETSc
381:   */
382: #if defined(PETSC_HAVE_MUMPS)
383:   PetscCall(MatSolverTypeRegister_MUMPS());
384: #endif
385: #if defined(PETSC_HAVE_CUDA)
386:   PetscCall(MatSolverTypeRegister_CUSPARSE());
387: #endif
388: #if defined(PETSC_HAVE_HIP)
389:   PetscCall(MatSolverTypeRegister_HIPSPARSE());
390: #endif
391: #if defined(PETSC_HAVE_KOKKOS_KERNELS)
392:   PetscCall(MatSolverTypeRegister_KOKKOS());
393: #endif
394: #if defined(PETSC_HAVE_VIENNACL)
395:   PetscCall(MatSolverTypeRegister_ViennaCL());
396: #endif
397: #if defined(PETSC_HAVE_ELEMENTAL)
398:   PetscCall(MatSolverTypeRegister_Elemental());
399: #endif
400: #if defined(PETSC_HAVE_SCALAPACK)
401:   PetscCall(MatSolverTypeRegister_ScaLAPACK());
402: #endif
403: #if defined(PETSC_HAVE_MATLAB)
404:   PetscCall(MatSolverTypeRegister_Matlab());
405: #endif
406: #if defined(PETSC_HAVE_ESSL)
407:   PetscCall(MatSolverTypeRegister_Essl());
408: #endif
409: #if defined(PETSC_HAVE_SUPERLU)
410:   PetscCall(MatSolverTypeRegister_SuperLU());
411: #endif
412: #if defined(PETSC_HAVE_STRUMPACK)
413:   PetscCall(MatSolverTypeRegister_STRUMPACK());
414: #endif
415: #if defined(PETSC_HAVE_PASTIX)
416:   PetscCall(MatSolverTypeRegister_Pastix());
417: #endif
418: #if defined(PETSC_HAVE_SUPERLU_DIST)
419:   PetscCall(MatSolverTypeRegister_SuperLU_DIST());
420: #endif
421: #if defined(PETSC_HAVE_ELEMENTAL)
422:   PetscCall(MatSolverTypeRegister_SparseElemental());
423: #endif
424: #if defined(PETSC_HAVE_MKL_PARDISO)
425:   PetscCall(MatSolverTypeRegister_MKL_Pardiso());
426: #endif
427: #if defined(PETSC_HAVE_MKL_CPARDISO)
428:   PetscCall(MatSolverTypeRegister_MKL_CPardiso());
429: #endif
430: #if defined(PETSC_HAVE_SUITESPARSE)
431:   PetscCall(MatSolverTypeRegister_SuiteSparse());
432: #endif
433: #if defined(PETSC_HAVE_LUSOL)
434:   PetscCall(MatSolverTypeRegister_Lusol());
435: #endif
436:   /* Register package finalizer */
437:   PetscCall(PetscRegisterFinalize(MatFinalizePackage));
438:   PetscFunctionReturn(PETSC_SUCCESS);
439: }

441: #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
442: /*
443:   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.

445:   This one registers all the matrix methods that are in the basic PETSc Matrix library.

447:  */
448: PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscmat(void)
449: {
450:   PetscFunctionBegin;
451:   PetscCall(MatInitializePackage());
452:   PetscFunctionReturn(PETSC_SUCCESS);
453: }

455: #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */