15 releases

0.2.0 Aug 31, 2024
0.1.9 Jul 10, 2024
0.1.6 Jun 12, 2024
0.1.5 May 28, 2024
0.1.1 Mar 19, 2024

#300 in Programming languages

Download history 73/week @ 2024-07-14 4/week @ 2024-07-21 66/week @ 2024-07-28 2/week @ 2024-08-04 127/week @ 2024-08-25 37/week @ 2024-09-01 1/week @ 2024-09-08 321/week @ 2024-09-15 47/week @ 2024-09-22 30/week @ 2024-09-29 1/week @ 2024-10-06 65/week @ 2024-10-13 13/week @ 2024-10-20 14/week @ 2024-10-27

93 downloads per month
Used in diffsol

Custom license and GPL-3.0-or-later

11MB
149K SLoC

C++ 69K SLoC // 0.1% comments LLVM 64K SLoC // 0.4% comments Rust 12K SLoC // 0.0% comments C 3K SLoC // 0.2% comments Bazel 729 SLoC // 0.0% comments Forge Config 253 SLoC // 0.9% comments Julia 145 SLoC // 0.1% comments FORTRAN Modern 113 SLoC // 0.2% comments Python 82 SLoC // 0.3% comments Shell 75 SLoC // 0.0% comments Pest 50 SLoC

DiffSL

CI build status badge

A compiler for a domain-specific language for ordinary differential equations (ODEs) of the following form:

$$ M(t) \frac{d\mathbf{u}}{dt} = F(\mathbf{u}, t) $$

As an example, the following code defines a classic DAE testcase, the Robertson (1966) problem, which models the kinetics of an autocatalytic reaction, given by the following set of equations:

$$ \begin{align} \frac{dx}{dt} &= -0.04x + 10^4 y z \ \frac{dy}{dt} &= 0.04x - 10^4 y z - 3 \cdot 10^7 y^2 \ 0 &= x + y + z - 1 \end{align} $$

The DiffSL code for this problem is as follows:

in = [k1, k2, k3]
k1 { 0.04 }
k2 { 10000 }
k3 { 30000000 }
u_i {
  x = 1,
  y = 0,
  z = 0,
}
dudt_i {
  dxdt = 1,
  dydt = 0,
  dzdt = 0,
}
M_i {
  dxdt,
  dydt,
  0,
}
F_i {
  -k1 * x + k2 * y * z,
  k1 * x - k2 * y * z - k3 * y * y,
  1 - x - y - z,
}
out_i {
  x,
  y,
  z,
}

DiffSL Language Features

See the DiffSL language documentation for a full description.

  • Tensor types:
    • Scalars (double precision floating point numbers)
    • Vectors (1D arrays of scalars)
    • N-dimensional tensor of scalars
    • Sparse/dense/diagonal tensors
  • Tensor operations:
    • Elementwise operations
    • Broadcasting
    • Tensor contractions/matmul/translation etc via index notation

Usage

Generally the easiest way to make use of DiffSL is via an ode solver that supports the language, for example the diffsol library. Please see the diffsol documentation and consult the DiffSL language documentation for more information.

If you are writing your own ode solver and want to make use of the DiffSL compiler, please either get in touch by opening an issue, contacting the author or by looking at the diffsol source code.

Dependencies

You will need to install the LLVM project. The easiest way to install this is to use the package manager for your operating system. For example, on Ubuntu you can install these with the following command:

sudo apt-get install llvm

Installation

You can install DiffSL using cargo. You will need to indicate the llvm version you have installed using a feature flag. For example, for llvm 14:

cargo add diffsl --features llvm14-0

Other versions of llvm are also supported given by the features llvm13-0, llvm14-0, llvm15-0, llvm16-0, llvm17-0.

Dependencies

~14–22MB
~355K SLoC