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