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