dolfinx uses PETSc for solving the matrices of the system. PETSc can be built with many options, including external solvers like MUMPS, SuperLU and SuperLU-Dist.
The petsc4py interface will tell you if a given external package is available, via PETSc.Sys()hasExternalPackage("mumps"). But that requires you to know the registered name of the package to enquire about.
In legacy dolfin there were functions like list_linear_solver_methods() to list PETSc’s available solvers, but these utility functions are removed from dolfinx.
Is there a function I missed in dolfinx or in petsc4py.PETSc to list which solvers are available at runtime?
@dparsons
I thought about this for a bit longer, and here is a solution:
from petsc4py import PETSc
import inspect
def check_petsc_packages():
st = PETSc.Mat.SolverType
# Get all attributes of the SolverType class
rs = inspect.getmembers(st, lambda a: not inspect.isroutine(a))
# Remove all dunder methods
rs = [r for r in rs if not (r[0].startswith("__") and r[0].endswith("__"))]
for r in rs:
name = r[0]
is_available = PETSc.Sys().hasExternalPackage(name)
print(f"Package {name}: {'Available' if is_available else 'Not Available'}")
check_petsc_packages()
yields:
Package BAS: Not Available
Package CHOLMOD: Available
Package CUDA: Not Available
Package CUSPARSE: Not Available
Package ELEMENTAL: Not Available
Package ESSL: Not Available
Package KLU: Available
Package LUSOL: Not Available
Package MATLAB: Not Available
Package MKL_CPARDISO: Not Available
Package MKL_PARDISO: Not Available
Package MUMPS: Available
Package PASTIX: Not Available
Package PETSC: Not Available
Package SCALAPACK: Available
Package SPQR: Available
Package STRUMPACK: Not Available
Package SUPERLU: Available
Package SUPERLU_DIST: Available
Package UMFPACK: Available
It is not perfect, as for instance PETSC should always be available, but it is not an external package.