Awesome
Survey of PDE Packages
State of the ecosystem as of: 10/02/2023
This is a brief list of packages relevant when solving partial differential equations with Julia. The information is mostly gleaned from repositories of packages or from published reports or articles. If
- you think something was missed,
- you’d like to amend or complement the information, or
- you wish your software not to be included,
file an issue, or even better, make it a PR.
For some projects the actual software is not available (or it is not clear how to get it). In that case the document would at least include a link to the paper or other source of information.
Table of contents
- General PDE approximation methods
- Transform methods
- Finite difference methods
- Finite element methods
- Finite volume methods
- Spectral element methods
- Boundary element, Boundary integral methods
- Mesh free methods and particle methods
- Virtual element methods
- Multi-method packages
- Non-classical methods
- Solvers, sparse and hierarchical matrix libraries
- Geometry and topology
- Mesh and Grid Generation
- Postprocessing, visualization
- HPC, Parallel processing
- Optimization
- Miscellanea
<a name="general"></a>General PDE approximation methods
ApproxFun.jl
ApproxFun is a package for approximating functions. It is in a similar vein to the Matlab package Chebfun and the Mathematica package RHPackage. Active and high quality project.
DiffEqDocs
DifferentialEquations.jl: Efficient Differential Equation Solving in Julia. This is a suite for numerically solving differential equations written in Julia and available for use in Julia, Python, and R. The purpose of this package is to supply efficient Julia implementations of solvers for various differential equations. Equations within the realm of this package include:
- Discrete equations (function maps, discrete stochastic (Gillespie/Markov) simulations)
- Ordinary differential equations (ODEs)
- Split and Partitioned ODEs (Symplectic integrators, IMEX Methods)
- Stochastic ordinary differential equations (SODEs or SDEs)
- Stochastic differential-algebraic equations (SDAEs)
- Random differential equations (RODEs or RDEs)
- Differential algebraic equations (DAEs)
- Delay differential equations (DDEs)
- Neutral, retarded, and algebraic delay differential equations (NDDEs, RDDEs, and DDAEs)
- Stochastic delay differential equations (SDDEs)
- Experimental support for stochastic neutral, retarded, and algebraic delay differential equations (SNDDEs, SRDDEs, and SDDAEs)
- Mixed discrete and continuous equations (Hybrid Equations, Jump Diffusions)
- (Stochastic) partial differential equations ((S)PDEs) (with both finite difference and finite element methods)
<a name="tm"></a>Transform methods
julia-pde-benchmark
Benchmarking a simple PDE integration algorithm in Julia and other languages. Fourier approach.
DFTK.jl
The density-functional toolkit is a library of Julia routines for experimentation with plane-wave-based density-functional theory (DFT): it is an engine to solve nonlinear eigenvector equations discretized in a Fourier basis, applied to the Kohn-Sham equations of electronic structure theory (as well as a couple of others).
FourierFlows.jl
Tools for solving partial differential equations on periodic domains using Fourier-based pseudospectral methods.
PencilFFTs.jl
Fast Fourier transforms of MPI-distributed Julia arrays that can be used for pseudospectral partial differential equation solvers.
<a name="fdm"></a>Finite difference methods
DiffEqOperators.jl
Automatic construction of arbitrary order finite difference stencils on regular and irregular grids. Utilizes stencil compilers and matrix-free implementations for low memory high efficiency implementation.
sbp.jl
Finite difference method, unregistered.
SummationByPartsOperators.jl
A library of classical summation-by-parts (SBP) operators used in finite difference methods to get provably stable semidiscretisations, paying special attention to boundary conditions.
EconPDEs.jl
This package solves (systems of) nonlinear ODEs/PDEs arising in economic models (i.e. parabolic/elliptic PDEs arising from HJB equations) The underlying algorithm is based on a combination of upwinding and fully implicit time stepping, using sparse Jacobians.
Partial-Differential-Equations
Solving partial differential equations using finite difference methods on Julia.
hyperbolic_PDE.jl
The examples are given from the book Numerical Solution of Hyperbolic Partial Differential Equations by John A. Trangenstein.
JuliaIBPM
An ecosystem of repositories for solving PDEs with the immersed boundary projection method on staggered Cartesian grids.
ParallelStencil.jl
Package for writing high-level code for parallel high-performance stencil computations that can be deployed on both GPUs and CPUs
ImplicitGlobalGrid.jl
Almost trivial distributed parallelization of stencil-based GPU and CPU applications on a regular staggered grid
<a name="fem"></a>Finite element methods
FEniCS.jl
FEniCS.jl is a wrapper for the FEniCS library for finite element discretizations of PDEs.
Ferrite.jl
A simple finite element toolbox written in Julia. It is actually quite powerful, and it is being actively updated. Some parallels with deal.II might help with the learning curve.
JuliaFEM
The JuliaFEM project develops open-source software for reliable, scalable, distributed Finite Element Method.
Maintains an overview page with documentation at http://www.juliafem.org/.
NESSie.jl
Paper: Efficient and intuitive finite element and boundary element methods for nonlocal protein electrostatics in the Julia language Link
GaLerKia-a-unified-Julia-implementation-of-mesh-and-meshfree-based-Galerkin-methods
Provide a modern and unified simulation platform for finite element methods, meshfree Galerkin methods and virtual element methods. The platform is being built over three Julia independent libraries: FEMLia (for finite elements), MEMLia (for meshfree methods) and VEMLia (for virtual elements).
Makhno.jl
HPFEM.jl
HP Finite elements in Julia. One-dimensional. Might have been abandoned.
EllipticFEM.jl
FEM Solver for Elliptic, Parabolic and Hyperbolic PDEs Written in Julia. No update in the past three years.
BEAST.jl
The package can support finite element discretization. Also listed as a boundary-element code. Also see TeaTalk.jl.
SauterSchwabQuadrature.jl
HyperbolicDiffEq.jl
Active with updates for Julia 1.3.
Gridap.jl
Gridap provides a rich set of tools for the grid-based approximation of PDEs, mainly finite element methods, written in the Julia programming language. Some features of the library are:
- Discretization mentods: Continuous and discontinuous Galerkin methods with Lagrangian, Raviart-Thomas, and Nédélec interpolations of arbitrary order and dimension.
- Problem types: Linear, and non-linear, single-field, and multi-physics problems, both volume-coupled and surface-coupled.
- Mesh generation: Built-in Cartesian mesh generator in arbitrary dimensions; interface with GMSH for unstructured grids via the plugin GridapGmsh.
- Linear and non-linear solvers: Interfaces with Pardiso and PETSc via the plugins GridapPardiso and GridapPETSc.
FinEtools.jl
FinEtools is a package for basic operations on finite element meshes. It also supports a number of packages for applications to heat conduction, acoustics, static and dynamic linear and nonlinear stress analysis, vibrations and fluids, model reduction, and flexible beams.
DiscretePDEs.jl
DiscretePDEs.jl is a package for discretizing partial differential equations using DiscreteExteriorCalculus.jl. In addition to functionality for discretizing arbitrary PDEs, DiscretePDEs.jl also has functionality specifically for modeling electromagnetism.
PDESolver.jl
PDESolver is a multi-physics solver primarily focused on Computational Fluid Dynamics.
juSFEM
Smoothed FEM. Paper
jPDE
Partial Differential Equations with Julia, with FEM.
CFD_Julia_A_Learning_Module_Structuring_an_Introductory_Course_on_Computational_Fluid_Dynamics
CFD Julia is a programming module developed for senior undergraduate or graduate-level coursework which teaches the foundations of computational fluid dynamics (CFD). The paper explains various concepts related to spatial and temporal discretization, explicit and implicit numerical schemes, multi-step numerical schemes, higher-order shock-capturing numerical methods, and iterative solvers in CFD.
HDiscontinuousGalerkin.jl
A finite element toolbox, with focus on Hybridizable Discontinuous Galerkin (at the moment it only works in 2D).
GalerkinSparseGrids.jl
For solving hyperbolic partial differential equations in higher dimensions, where the curse of dimensionality restricts the computational feasibility of discretization of space using regular grid methods. Instead, the employ sparse grid construction is employed.
LibTOAST.jl
LibTOAST.jl is a low-level interface to the TOAST++ library. (TOAST++ is an end-to-end solution for forward modelling and image reconstruction in Diffuse Optical Tomography).
PtFEM.jl
Programs in chapters 4, 5 and early sections of 6 as described in "Programming the Finite Element Method" by Smith, Griffiths and Margetts.
NodesAndModes.jl
A collection of routines to compute high order "modal" and "nodal" basis functions and their derivatives on 1D, 2D (triangle, quadrilateral), and 3D (hexahedral, tetrahedral, wedge, pyramid) elements. Routines are also provided for quadrature rules and for computing optimized interpolation points.
StartUpDG.jl
A translation of the core Matlab codes from Nodal Discontinuous Galerkin methods to Julia.
eFEMpart
Finite Element code in the Julia language focused on complex fluid-dynamic and porous-media applications, with the possibility of including a particle simulator in the framework of the discrete element method. The 'eFEM' component allows the use of Finite Elements discretizations to solve common problems in fluid dynamics, and the 'part' refers to mesh-free particle methods (discrete element method) primarily aimed at granular-media simulations where continuum constitutive laws are unavailable.
Elfel.jl
Elfel.jl
is an Extensible library for Finite Element methods. It provides support for the development of Finite Element Method applications, especially in continuum mechanics. Mixed methods with cooperating finite element spaces are supported. High performance is one of the focus points.
NNFEM.jl
NNFEM is a lightweight educational 2D finite element library with truss and 2D quadrilateral elements. Different constitutive relations are supported, including plane stress/strain, hyperelasticity, elasto-plasticity, etc. It supports unstructured grid. It supports learning a neural network-based constitutive relations with both direct data (i.e, strain-stress pairs) and indirect data (i.e. full displacement field) via automatic differentiation, and solving finite element problems with network-based constitutive relations.
Trixi.jl
Trixi.jl is a numerical simulation framework for hyperbolic conservation laws written in Julia. A key objective for the framework is to be useful to both scientists and students. Therefore, next to having an extensible design with a fast implementation, Trixi is focused on being easy to use for new or inexperienced users, including the installation and postprocessing procedures. Its features include:
- Hierarchical quadtree/octree grid with adaptive mesh refinement
- Native support for 1D, 2D, and 3D simulations
- High-order accuracy in space in time
- Nodal discontinuous Galerkin spectral element methods
- Kinetic energy-preserving and entropy-stable split forms
- Entropy-stable shock capturing
- Positivity-preserving limiting
- Compatible with the SciML ecosystem for ordinary differential equations
- Explicit low-storage Runge-Kutta time integration
- Strong stability preserving methods
- CFL-based and error-based time step control
- Square/cubic domains with periodic and weakly-enforced boundary conditions
- Multiple governing equations:
- Compressible Euler equations
- Magnetohydrodynamics equations
- Hyperbolic diffusion equations for elliptic problems
- Scalar advection
- Multi-physics simulations
- Shared-memory parallelization via multithreading
- Visualization of results with Julia-only tools (Trixi2Img) or ParaView/VisIt (Trixi2Vtk)
<a name="fvm"></a>Finite volume methods
FiniteVolume.jl
Finite Volume code. Not much information on the site.
VoronoiFVM.jl
Solver for coupled nonlinear partial differential equations based on the Voronoi finite volume method.
JFVM.jl
Finite volume tool for the transport phenomena in chemical and petroleum engineering and similar fields (linear transient advection-diffusion PDE). Updated for Julia 1.0.
Oceananigans.jl
Incompressible fluid flow solver written in Julia that can be run in 1-3 dimensions on CPUs and GPUs. It is designed to solve the rotating Boussinesq equations used in non-hydrostatic ocean modeling but can be used to solve for any incompressible flow.
Kinetic.jl
A lightweight finite volume toolbox for solving Boltzmann equation and its moments systems (Euler, Navier-Stokes, etc).
FiniteVolumeMethod.jl
This is a package for solving two-dimensional PDEs of type $\partial_t u + \boldsymbol{\nabla} \boldsymbol{\cdot} \boldsymbol{q}(x, y, t, u) = R(x, y, t, u)$ with the finite volume method with a user-provided triangular mesh. Builds on the DifferentialEquations.jl interface to allow for different algorithms, linear solvers, etc. to be used with ease.
HighVoronoi.jl
A Julia Package for setting up high dimensional (i.e. any dimension >= 2) Finite Volume problems on Voronoi Meshes.
<a name="sem"></a>Spectral element methods
SpectralElements.jl
Not much activity.
PolynomialBases.jl
CFD_Julia_MAE5093
This repository contains fundamental codes related to CFD that can be included in any graduate level CFD coursework. A number of codes are included in CFD_Julia module, for instance 1D inviscid Burgers equation, 1D Euler equation, 2D Poisson equation, and 2D incompressible Navier-Stokes equations.
A library of functions for polynomial bases used in spectral element methods.
<a name="bie"></a>Boundary element, boundary integral methods
BEAST.jl
This package contains common basis functions and assembly routines for the implementation of boundary element methods. Examples are included for the 2D and 3D Helmholtz equations and for the 3D Maxwell equations.
NESSie.jl
Paper: Efficient and intuitive finite element and boundary element methods for nonlocal protein electrostatics in the Julia language Link Also listed as a finite element toolkit.
<a name="mfe">Mesh free methods and particle methods
HighDimPDE.jl
A Julia package for Deep Backwards Stochastic Differential Equation (Deep BSDE), Feynman-Kac and Multi-level Picard (MLP) methods to solve high-dimensional non-local nonlinear PDEs. Reference: Boussange, V., Becker, S., Jentzen, A., Kuckuck, B., Pellissier, L., Deep learning approximations for non-local nonlinear PDEs with Neumann boundary conditions. arXiv (2022)
Peridynamics.jl
Peridynamics is a non-local formulation of continuum mechanics in which material points represent the continuum. It is particularly well suited for dynamic fracture simulations.
Programming_the_material_point_method_in_Julia
GaLerKia-a-unified-Julia-implementation-of-mesh-and-meshfree-based-Galerkin-methods
See information above for the finite element methods.
<a name="vem">Virtual element methods
jFEMTools.jl
Tools for FEM and VEM (Virtual Element) methods.
GaLerKia-a-unified-Julia-implementation-of-mesh-and-meshfree-based-Galerkin-methods
See information above for the finite element methods.
eFEMpart
Listed above under finite elements as well. Finite Element code in the Julia language focused on complex fluid-dynamic and porous-media applications, with the possibility of including a particle simulator in the framework of the discrete element method. The 'eFEM' component allows the use of Finite Elements discretizations to solve common problems in fluid dynamics, and the 'part' refers to mesh-free particle methods (discrete element method) primarily aimed at granular-media simulations where continuum constitutive laws are unavailable.
<a name="mm">Multi-method packages
CLIMA
The Climate Machine is a new Earth system model that leverages recent advances in the computational and data sciences to learn directly from a wealth of Earth observations from space and the ground.
<a name="nonclassical">Non-classical methods
NeuralNetDiffEq.jl
A library for solving (partial) differential equations with neural networks. Currently supports parabolic differential equations, though a generic NN-based PDE solver is in progress. Can solve very high dimensional (hundred or thousand) partial differential equations through universal differential equation approaches.
<a name="solvers">Solvers, sparse and hierarchical matrix libraries
DifferentialEquations.jl
A package for solving time-stepping of differential equations which result from PDE discretizations. Heavy emphasis on large-scale stiff differential equations with sparse Jacobians, i.e. DEs from PDEs. See the stiff ODE tutorial for more details.
PETSc.jl
This package provides a high level interface for PETSc.
PETSc2.jl
This package provides thin wrappers for PETSc, as well as a few convenience functions that take advantage of multiple dispatch.
PositiveFactorizations.jl
PositiveFactorizations is a package for computing a positive definite matrix decomposition (factorization) from an arbitrary symmetric input. The motivating application is optimization.
FiniteDiff.jl
This package is for calculating derivatives, gradients, Jacobians, Hessians, etc. numerically.
SparseDiffTools.jl
This package is for exploiting sparsity in Jacobians and Hessians to accelerate computations. Matrix-free Jacobian-vector product and Hessian-vector product operators are provided that are compatible with AbstractMatrix-based libraries like IterativeSolvers.jl for easy and efficient Newton-Krylov implementation. It is possible to perform matrix coloring, and utilize coloring in Jacobian and Hessian construction.
HierarchicalMatrices.jl
This package provides a flexible framework for hierarchical matrices in Julia.
LowRankApprox.jl
This Julia package provides fast low-rank approximation algorithms for BLAS/LAPACK-compatible matrices based on some of the latest technology in adaptive randomized matrix sketching.
LazyBandedMatrices.jl
This package supports lazy banded and block-banded matrices.
BlockBandedMatrices.jl
A Julia package for representing block-block-banded matrices and banded-block-banded matrices.
kernelmatrices.jl
This software suite is a companion to the manuscript Scalable Gaussian Process Computations using Hierarchical Matrices.
ClusterTrees.jl
Tree data structures for fast multipole methods and H-matrices.
Arpack.jl
Julia wrapper for the arpack library designed to solve large scale eigenvalue problems. ARPACK is a collection of Fortran77 subroutines designed to solve large scale eigenvalue problems.
AlgebraicMultigrid.jl
Solve sparse linear systems using Algebraic Multigrid (AMG). This works especially well for symmetric positive definite matrices.
NonlinearEigenproblems.jl
This package aims to provide state-of-the-art algorithms to solve the nonlinear eigenvalue problem. This currently includes (but is not restricted to) Newton-type methods, Subspace methods, Krylov methods, contour integral methods, block methods, companion matrix approaches. Problem transformation techniques such as scaling, shifting, deflating are also natively supported by the package.
BifurcationKit.jl
This organisation provides a set of tools to compute (automatically) bifurcation diagrams of ODE, DDE, PDE, nonlocal problems, etc. It can thus tackle large dimensional problems, by for example, using a GPU. The computation of periodic orbits and their bifurcations is also possible.
KrylovKit.jl
A Julia package collecting a number of Krylov-based algorithms for linear problems, singular value and eigenvalue problems and the application of functions of linear maps or operators to vectors.
LinearOperators.jl
Operators behave like matrices, but are defined by their effect when applied to a vector. They can be transposed, conjugated, or combined with other operators cheaply. The costly operation is deferred until multiplied with a vector.
LinearMaps.jl
A Julia package for defining and working with linear maps, also known as linear transformations or linear operators acting on vectors. The only requirement for a LinearMap is that it can act on a vector (by multiplication) efficiently.
AbstractOperators.jl
Abstract operators extend the syntax typically used for matrices to linear mappings of arbitrary dimensions and nonlinear functions. Unlike matrices however, abstract operators apply the mappings with specific efficient algorithms that minimize memory requirements. This is particularly useful in iterative algorithms and in first order large-scale optimization algorithms.
MUMPS.jl
MUMPS is a library for the solution of large linear systems using a factorization. Structure can be exploited, such as symmetry, or symmetry and definiteness. The factorization and solve phases can be performed in parallel.
Pardiso.jl
The Pardiso.jl package provides an interface for using PARDISO 6.0 and Intel MKL PARDISO from the Julia language.
Metis.jl
Metis.jl is a Julia wrapper to the Metis library which is a library for partitioning unstructured graphs, partitioning meshes, and computing fill-reducing orderings of sparse matrices.
IterativeSolvers.jl
IterativeSolvers is a Julia package that provides iterative algorithms for solving linear systems, eigensystems, and singular value problems.
Preconditioners.jl
Selected pre-conditioners for iterative solvers of coupled linear algebraic equations. Including AMG.
<a name="geo">Geometry and topology
Manifolds.jl
Manifolds.jl aims to provide both a unified interface to define and use manifolds as well as a library of manifolds to use for your projects.
Grassmann.jl
The Grassmann.jl package provides tools for doing computations based on multi-linear algebra, differential geometry, and spin groups using the extended tensor algebra known as Leibniz-Grassmann-Clifford-Hestenes geometric algebra.
DiscreteDifferentialGeometry.jl
The DiscreteDifferentialGeometry Julia package defines types and methods to implement Discrete Differential Geometry.
<a name="grids">Mesh and Grid Generation
Gmsh.jl
Gmsh.jl contains API for Gmsh: a three-dimensional finite element mesh generator. With the help of Gmsh.jl, it is possible add parametric model construction and/or automatic mesh generation to a FEM/FVM pipeline.
Triangulate.jl
Julia wrapper for Johnathan Richard Shewchuk's Triangle mesh generator.
TetGen.jl
The TetGen.jl package is a Julia wrapper for the C++ project TetGen. This wrapper enables TetGen based tetrahedral meshing, and (constrained) 3D Delaunay and Voronoi tesselation.
CompScienceMeshes.jl
Geometry types and algorithms for computational science. Meshes, charts, and neighborhoods.
VoronoiDelaunay.jl
Fast, robust construction of 2D Delaunay and Voronoi tessellations on generic point types.
MiniQhull.jl
A simple Julia wrapper around Qhull to compute Delaunay triangulations in arbitrary dimensions. This is a direct wrapper using ccall
(in constrast to QHull.jl
that is a wrapper around a python wrapper of Qhull.)
FMMTrees.jl
Tree data structures for H(2), hierarchical matrices, and FMM-like algorithms (fast multiple methods).
DistMesh.jl
Tetrahedral mesh refinement on signed distance/implicit functions or level sets using TetGen.
HalfEdges.jl
Halfedge data structure for navigating and querying polygonal meshes.
MeshCore.jl
Small package for the topology of meshes for the Finite Element Methods (FEM). All essential topological incidence relations are provided: see the guide. The library provides efficient storage of coordinates and connectivities in static arrays for speed of access.
MeshSteward.jl
Small package for the management of meshes for the Finite Element Methods (FEM). A convenience layer on top of MeshCore.jl.
DelaunayTriangulation.jl
Package for constructing unconstrained or constrained Delaunay triangulations of planar point sets, with support for mesh refinement with constant or custom area and angle constraints, with a generic interface for geometric primitives to allow for easy customisation. Exact predicates are used to make the procedures robust.
<a name="post"></a>Postprocessing, visualization
WriteVTK.jl.
This module allows to write VTK XML files, that can be visualised for example with ParaView. Seems pretty complete, writes compressed files.
VTKDataTypes.jl
VTKDataTypes.jl presents a Julia type system for representing and manipulating VTK data natively in Julia.
<a name="hpc"></a>HPC, Parallel processing
MPI.jl
This provides Julia interface to the Message Passing Interface (MPI), roughly inspired by mpi4py.
PumiInterface.jl
This code provides a way to use PUMI from Julia by wrapping functions in PUMIs APF API.
<a name="opt"></a>Optimization
TopOpt.jl
A WIP topology optimization package in pure Julia.
<a name="misc"></a>Miscellanea
AD4SM.jl
Automatic Differentiation for Solid Mechanics in Julia.
RHEOS.jl
RHEOS, an abbreviation of Rheology Open Source, is a software package written in the Julia programming language that provides tools for analyzing rheological data.
Tensors.jl
Efficient computations with symmetric and non-symmetric tensors with support for automatic differentiation.
TensorOperations.jl
Fast tensor operations using a convenient Einstein index notation.
TensorToolbox.jl
Julia package for tensors (dense tensors, Tucker format, Kruskal (CP) format, Hierarchical Tucker format, Tensor Train format).
NonlinearPDE
Solution of a nonlinear elliptic PDE with multi-grid.