Skip to content
Snippets Groups Projects
Frederik Hennig's avatar
Frederik Hennig authored
 - Add a `dtype` member to all expression nodes
 - Make the `Typifier` apply `dtype`s to all expressions
 - Adapt transformations and IterationSpace to set data types on created
   expressions
 - Refactor TypeContext and contextual typing interface to be more
   intuitive
 - Refactor the Typifier to apply more operations through the
   TypeContext

Squashed commit of the following:

commit 3e81188a318aa1dc294cf0cd11bf2ec7f62a9b55
Author: Frederik Hennig <frederik.hennig@fau.de>
Date:   Wed Mar 27 17:00:17 2024 +0100

    Improve typification of integer expressions

     - Check integer type constraint in `_apply_target_type` to correctly catch deferred expressions

commit 63d0cfa5ea1b8a41c9a74bbfcf0618fad03ffa48
Merge: 671f057 075ae357
Author: Frederik Hennig <frederik.hennig@fau.de>
Date:   Wed Mar 27 16:46:28 2024 +0100

    Merge branch 'backend-rework' into b_refactor_typing

commit 671f0578a39e452504243019dab28d93f0114082
Author: Frederik Hennig <frederik.hennig@fau.de>
Date:   Tue Mar 26 16:39:43 2024 +0100

    Fix documentation for Typifier and PsExpression

commit 3ec258517ad8a510118265184b5dc7805128dcd3
Author: Frederik Hennig <frederik.hennig@fau.de>
Date:   Mon Mar 25 17:14:21 2024 +0100

    Typing refactor:

      - Annotate all expressions with types
      - Refactor Typifier for cleaner information flow and better
        readability
      - Have iteration space and transformers typify newly created AST nodes
0e4677de

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: