Skip to content
Snippets Groups Projects
Frederik Hennig's avatar
Frederik Hennig authored
 - Set not-yet-migrated stages to manual and allow_failure
 - Fix flake8 errors

Squashed commit of the following:

commit fb5c7f843791730450759775580f290e9b323d3a
Author: Frederik Hennig <frederik.hennig@fau.de>
Date:   Wed Mar 27 18:12:03 2024 +0100

    set legacy tests to manual execution

commit 1538a1f31e5eadaeaebd5c2adafee36cb2240817
Author: Frederik Hennig <frederik.hennig@fau.de>
Date:   Wed Mar 27 18:09:46 2024 +0100

    rename test stage

commit e55bb72157e2796e80fce0c86a4fe63ecfde2753
Author: Frederik Hennig <frederik.hennig@fau.de>
Date:   Wed Mar 27 18:08:36 2024 +0100

    fix flake8

commit 3d365ffa00898a1f2b2f7fcd41c9db0857a7169c
Author: Frederik Hennig <frederik.hennig@fau.de>
Date:   Wed Mar 27 18:05:18 2024 +0100

    refactor CI: Only fail on nbackend unit tests

commit d5af84f9ef766625dba3f0f21e16d01cea89538e
Author: Frederik Hennig <frederik.hennig@fau.de>
Date:   Wed Mar 27 17:59:22 2024 +0100

    fix iteration space test cases
e842ed85

pystencils

Binder Docs pypi-package pipeline status coverage report

Run blazingly fast stencil codes on numpy arrays.

pystencils uses sympy to define stencil operations, that can be executed on numpy arrays. Exploiting the stencil structure makes pystencils run faster than normal numpy code and even as Cython and numba, as demonstrated in this notebook.

Here is a code snippet that computes the average of neighboring cells:

import pystencils as ps
import numpy as np

f, g = ps.fields("f, g : [2D]")
stencil = ps.Assignment(g[0, 0],
                       (f[1, 0] + f[-1, 0] + f[0, 1] + f[0, -1]) / 4)
kernel = ps.create_kernel(stencil).compile()

f_arr = np.random.rand(1000, 1000)
g_arr = np.empty_like(f_arr)
kernel(f=f_arr, g=g_arr)

pystencils is mostly used for numerical simulations using finite difference or finite volume methods. It comes with automatic finite difference discretization for PDEs:

import pystencils as ps
import sympy as sp

c, v = ps.fields("c, v(2): [2D]")
adv_diff_pde = ps.fd.transient(c) - ps.fd.diffusion(c, sp.symbols("D")) + ps.fd.advection(c, v)
discretize = ps.fd.Discretization2ndOrder(dx=1, dt=0.01)
discretization = discretize(adv_diff_pde)

Installation

pip install pystencils[interactive]

Without [interactive] you get a minimal version with very little dependencies.

All options:

  • gpu: use this if an NVIDIA or AMD GPU is available and CUDA or ROCm is installed
  • alltrafos: pulls in additional dependencies for loop simplification e.g. libisl
  • bench_db: functionality to store benchmark result in object databases
  • interactive: installs dependencies to work in Jupyter including image I/O, plotting etc.
  • doc: packages to build documentation

Options can be combined e.g.

pip install pystencils[interactive, gpu, doc]

pystencils is also fully compatible with Windows machines. If working with visual studio and cupy makes sure to run example files first to ensure that cupy can find the compiler's executable.

Documentation

Read the docs here and check out the Jupyter notebooks in doc/notebooks. The Changelog of pystencils can be found here.

Authors

Many thanks go to the contributors of pystencils.

Please cite us

If you use pystencils in a publication, please cite the following articles:

Overview:

Performance Modelling: