A pure Python library for finite element assembly, transforming bilinear forms into sparse matrices and linear forms into vectors.
scikit-fem is a Python library for finite element assembly, specifically designed to transform bilinear forms into sparse matrices and linear forms into vectors. It provides tools for solving partial differential equations using various finite element types, all implemented in pure Python with minimal dependencies.
Researchers, engineers, and computational scientists who need a lightweight, Python-based tool for prototyping and solving finite element problems without relying on compiled languages or large frameworks.
Developers choose scikit-fem for its simplicity, pure Python implementation, and ease of integration into existing Python workflows, offering a balance between performance and accessibility for educational and research purposes.
Simple finite element assemblers
Open-Awesome is built by the community, for the community. Submit a project, suggest an awesome list, or help improve the catalog on GitHub.
Only requires NumPy and SciPy as core dependencies, making installation straightforward and reducing conflicts in Python environments, as stated in the README.
No compiled code ensures cross-platform compatibility and ease of debugging, ideal for educational use and prototyping without complex build steps.
Supports specialized elements like Raviart-Thomas and Nédélec, enabling a wide range of finite element methods beyond basic Lagrange elements.
Compatible with quadratic and higher-order elements for accurate simulations, as demonstrated in examples with ElementTetP2.
API stays close to variational formulations, with decorators like @BilinearForm, making it accessible for researchers familiar with FEM theory.
Pure Python assembly can be slow for large meshes, and reliance on SciPy's sparse solvers may not scale well for very large systems, as shown in the benchmark where linear solve times dominate.
Focuses on assembly only, lacking integrated mesh generation, visualization, or advanced solvers without optional dependencies like meshio and matplotlib.
Major version updates often introduce backwards-incompatible changes, as seen in the changelog (e.g., version 12.0.0), requiring code adjustments and ongoing maintenance.
Optional dependencies for full functionality (e.g., JAX for autodiff, PETSc for parallel assembly) add complexity and may lead to inconsistent setups across teams.