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