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 /*@C 20 MatFinalizePackage - This function destroys everything in the Petsc interface to the `Mat` package. It is 21 called from `PetscFinalize()`. 22 23 Level: developer 24 25 .seealso: `Mat`, `PetscFinalize()`, `MatInitializePackage()` 26 @*/ 27 PetscErrorCode MatFinalizePackage(void) 28 { 29 MatRootName nnames, names = MatRootNameList; 30 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(0); 57 } 58 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 113 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 *); 126 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. 131 132 Level: developer 133 134 .seealso: `Mat`, `PetscInitialize()`, `MatFinalizePackage()` 135 @*/ 136 PetscErrorCode MatInitializePackage(void) 137 { 138 char logList[256]; 139 PetscBool opt, pkg; 140 141 PetscFunctionBegin; 142 if (MatPackageInitialized) PetscFunctionReturn(0); 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)); 234 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)); 244 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)); 248 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)); 263 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)); 270 271 PetscCall(PetscLogEventRegister("MatSetPreallCOO", MAT_CLASSID, &MAT_PreallCOO)); 272 PetscCall(PetscLogEventRegister("MatSetValuesCOO", MAT_CLASSID, &MAT_SetVCOO)); 273 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)); 278 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]; 290 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 } 300 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 } 313 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)); 319 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)); 324 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)); 329 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)); 335 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. */ 343 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)); 348 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)); 353 354 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqsbaij_petsc)); 355 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_ICC, MatGetFactor_seqsbaij_petsc)); 356 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 377 378 PetscCall(MatSolverTypeRegister(MATSOLVERBAS, MATSEQAIJ, MAT_FACTOR_ICC, MatGetFactor_seqaij_bas)); 379 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(0); 441 } 442 443 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES) 444 /* 445 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened. 446 447 This one registers all the matrix methods that are in the basic PETSc Matrix library. 448 449 */ 450 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscmat(void) 451 { 452 PetscFunctionBegin; 453 PetscCall(MatInitializePackage()); 454 PetscFunctionReturn(0); 455 } 456 457 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */ 458