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(PETSC_SUCCESS); 57 } 58 59 #if defined(PETSC_HAVE_CUDA) 60 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_DENSECUDA(void); 61 #endif 62 63 #if defined(PETSC_HAVE_HIP) 64 PETSC_INTERN PetscErrorCode MatSolverTypeRegister_DENSEHIP(void); 65 #endif 66 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 121 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 *); 134 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. 139 140 Level: developer 141 142 .seealso: [](chapter_matrices), `Mat`, `PetscInitialize()`, `MatFinalizePackage()` 143 @*/ 144 PetscErrorCode MatInitializePackage(void) 145 { 146 char logList[256]; 147 PetscBool opt, pkg; 148 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)); 242 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)); 252 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)); 256 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)); 271 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)); 278 279 PetscCall(PetscLogEventRegister("MatSetPreallCOO", MAT_CLASSID, &MAT_PreallCOO)); 280 PetscCall(PetscLogEventRegister("MatSetValuesCOO", MAT_CLASSID, &MAT_SetVCOO)); 281 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)); 286 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]; 298 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 } 308 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 } 321 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)); 327 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)); 332 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)); 337 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)); 343 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. */ 351 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)); 356 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)); 361 362 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_CHOLESKY, MatGetFactor_seqsbaij_petsc)); 363 PetscCall(MatSolverTypeRegister(MATSOLVERPETSC, MATSEQSBAIJ, MAT_FACTOR_ICC, MatGetFactor_seqsbaij_petsc)); 364 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 375 376 PetscCall(MatSolverTypeRegister(MATSOLVERBAS, MATSEQAIJ, MAT_FACTOR_ICC, MatGetFactor_seqaij_bas)); 377 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 } 440 441 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES) 442 /* 443 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened. 444 445 This one registers all the matrix methods that are in the basic PETSc Matrix library. 446 447 */ 448 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscmat(void) 449 { 450 PetscFunctionBegin; 451 PetscCall(MatInitializePackage()); 452 PetscFunctionReturn(PETSC_SUCCESS); 453 } 454 455 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */ 456