Skip to main content

A Generic Particle+Grid Interface

Project description

GPGI

PyPI PyPI pre-commit.ci status Code style: black Ruff

Fast particle deposition at post-processing time

This small Python library implements fundamental grid deposition algorithms to analyse (rectilinear) grid + particle datasets, with an emphasize on performance. Core algorithms are implemented as Cython extensions.

GPGI stands for Generic Particle + Grid data Interface

Table of Contents

Installation

python -m pip install --upgrade pip
python -m pip install gpgi

Supported applications

A rectilinear grid is defined as 1D arrays representing cell left edges in each directions. Note that the last point of such an array is interpreted as the right edge of the rightmost cell, so for instance, a 1D grid containing 100 cells is defined by 101 edges.

Particles are defined as points that live within the grid's bounds.

Deposition is the action of going from particle description to a grid description of a field. It is useful to analyze, compare and combine simulation data that exists in a combination of the two formalisms. This process is not reversible as it degrades information.

For instance, here's a simple overlay of a particle set (red dots) against a background that represents the deposited particle count.

This example illustrates the simplest possible deposition method "Particle in Cell", in which each particle contributes only to the cell that contains it.

More refined methods are also available.

Supported deposition methods

method name abreviated name order
Nearest Grid Point NGP 0
Cloud in Cell CIC 1
Triangular Shaped Cloud TSC 2

Supported geometries

geometry name axes order
cartesian x, y, z
polar radius, z, azimuth
cylindrical radius, azimuth, z
spherical radius, colatitude, azimuth
equatorial radius, azimuth, latitude

Time complexity

An important step in perfoming deposition is to associate particle indices to cell indices. This step is called "particle indexing". In directions where the grid is uniformly stepped (if any), indexing a particle is an O(1) operation. In the more general case, indexing is performed by bisection, which is a O(log(nx))) operation (where nx represents the number of cells in the direction of interest).

Usage

The API consists in a load function, which returns a Dataset object.

Load data

import numpy as np
import gpgi

nx = ny = 64
nparticles = 600_000

prng = np.random.RandomState(0)
ds = gpgi.load(
    geometry="cartesian",
    grid={
        "cell_edges": {
            "x": np.linspace(-1, 1, nx),
            "y": np.linspace(-1, 1, ny),
        },
    },
    particles={
        "coordinates": {
            "x": 2 * (prng.normal(0.5, 0.25, nparticles) % 1 - 0.5),
            "y": 2 * (prng.normal(0.5, 0.25, nparticles) % 1 - 0.5),
        },
        "fields": {
            "mass": np.ones(nparticles),
        },
    },
)

The Dataset object holds a grid and a particles attribute, which both hold a fields attribute for accessing their data. But more importantly, the Dataset has a deposit method to translate particle fields to the grid formalism.

Deposit Particle fields on the grid

particle_mass = ds.deposit("mass", method="nearest_grid_point")  # or "ngp" for shorts

Visualize In this example we'll use matplotlib for rendering, but note that matplotlib is not a dependency to gpgi

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.set(aspect=1, xlabel="x", ylabel="y")

im = ax.pcolormesh(
    "x",
    "y",
    particle_mass.T,
    data=ds.grid.cell_edges,
    cmap="viridis",
)
fig.colorbar(im, ax=ax)

The example script given here takes about a second (top to bottom).

Supplying arbitrary metadata

new in gpgi 0.4.0

Dataset objects have a special attribute metadata which is a dictionary with string keys. This attribute is meant to hold any special metadata that may be relevant for labelling or processing (e.g. simulation time, author, ...). Metadata can be supplied at load time as

ds = gpgi.load(
    geometry="cartesian",
    grid=...,
    particles=...,
    metadata={"simulation_time": 12.5, "author": "Clément Robert"}
)

Boundary conditions

new in gpgi 0.5.0

With CIC and TSC deposition, particles contribute to cells neighbouring the one that contains them. For particles that live in the outermost layer of the domain, this means some of their contribution is lost. This behaviour corresponds to the default 'open' boundary condition, but gpgi has builtin support for more conservative boundary conditions.

Boundary conditions can selected per field, per axis and per side. Builtin recipes all perform linear combinations of ghost layers (same-side and opposite side) and active domain layers (same-side and opposite side), and replace the same-side active layer with the result.

User-selected boundary conditions take the form of an optional argument to Dataset.deposit, as dictionnary with keys being axes names, and values being 2-tuples of boundary conditions names (for left and right side respectively). For instance, here's how one would require periodic boundary conditions on all axes:

ds.deposit(
    "mass",
    method="cic",
    boundaries={
        "x": ("periodic", "periodic"),
        "y": ("periodic", "periodic"),
    }
)

Unspecified axes will use the default 'open' boundary.

Builtin recipes

boundary conditions description conservative ?
open (default) no special treatment no
periodic add opposite ghost layer to the active domain yes
wall add same-side ghost layer to the active domain yes
antisymmetric substract same-side ghost layer from the active domain no

Define custom recipes

gpgi's boundary recipes can be customized. Let's illustrate this feature with a simple example. Say we want to fix the value of the deposited field in some outer layer. This is done by defining a new function on the user side:

def ones(
    same_side_active_layer,
    same_side_ghost_layer,
    opposite_side_active_layer,
    opposite_side_ghost_layer,
    weight_same_side_active_layer,
    weight_same_side_ghost_layer,
    weight_opposite_side_active_layer,
    weight_opposite_side_ghost_layer,
    side,
    metadata,
):
   return 1.0

where all first eight arguments are numpy.ndarray objects with the same shape (which includes ghost padding !), to which the return value must be broadcastable, side can only be either "left" or "right", and metadata is the special Dataset.metadata attribute. Not all arguments need be used in the body of the function, but this signature is required.

The method must then be registered as a boundary condition recipe as

ds.boundary_recipes.register("ones", ones)

where the associated key (here "ones") is arbitrary. The recipe can now be used exactly as builtin ones, and all of them can be mixed arbitrarily.

ds.deposit(
    "mass",
    method="cic",
    boundaries={
        "x": ("ones", "wall"),
        "y": ("periodic", "periodic"),
    }
)

Note that all first eight arguments in a boundary recipe function should represent an extensive physical quantity (as opposed to intensive). When depositing an intensive quantity u, a weight field w should be supplied (see next section), in which case, the first four arguments represent u*w and the following four represent w, so that u can still be obtained within the function as a ratio if needed.

Weight fields (Depositing intensive quantities)

new in gpgi 0.7.0

Fundamentally, deposition algorithms construct on-grid fields by performing summations. An implication is that the physical quantities being deposited are required to be extensive (like mass or momentum). Intensive quantities (like velocity or temperature) require additional operations, and necessitate the use of an additional weight field.

This section provides showcases their usage. For a detailled explanation of the deposition algorithm for intensive quantities, see Deposition algorithm.

In order to deposit an intensive field (e.g., vx), an additional weight_field argument must be provided as

ds.deposit(
    "vx",
    method="cic",
    boundaries={
        "y": ("periodic", "periodic"),
        "x": ("antisymmetric", "antisymmetric"),
    },
    weight_field="mass",
    weight_field_boundaries={
        "y": ("periodic", "periodic"),
        "x": ("open", "open"),
    },
)

Boundary recipes may be also associated to the weight field with the weight_field_boundaries argument. This arguments becomes required if boundaries and weight_field are both provided.

Call help(ds.deposit) for more detail.

Deposition algorithm

This section provides details on the general deposition algorithm, as implemented in gpgi.

Without loss of generality, we will illustrate how an intensive field (v) is deposited, since this case requires the most computational steps. As it happens, depositing an extensive field (w) separately is actually part of the algorithm.

Definitions

  • v is an intensive field that we want to deposit on the grid
  • w is an extensive field that will be used as weights
  • u = v * w is an extensive equivalent to v (conceptually, if v is a velocity and w is a mass, u corresponds to a momentum)

u(i), v(i) and w(i) are defined for each particle i.

We note U(x), V(x) and W(x) the corresponding on-grid fields, where V(x) is the final output of the algorithm. These are defined at grid cell centers x, within the active domain.

Last, we note U'(x), V'(x) and W'(x) the raw deposited fields, meaning no special treatment is applied to the outermost layers (boundary conditions). These are defined at grid cell centers, including one ghost layer that will be used to apply boundary conditions.

Algorithm

  1. W' and U' are computed as
W'(x) = Σ c(i,x) w(i)
U'(x) = Σ c(i,x) w(i) v(i)

where c(i,x) are geometric coefficients associated with the deposition method. Taking the nearest grid point (NGP) method for illustration, c(i,x) = 1 if particle i is contained in the cell whose center is x, and c(i,x) = 0 elsewhere.

  1. boundary conditions are applied
W(x) = W_BCO(W', 1, metadata)
U(x) = U_BCO(U', W', metadata)

where W_BCO and U_BCO denote arbitrary boundary condition operators associated with W and U respectively, and which take 3 arguments, representing the field to be transformed, its associated weight field and a wildcard metadata argument which may contain any additional data relevant to the operator.

Note 1 is used a placeholder "weight" for W, for symmetry reasons: all boundary condition operators must expose a similar interface, as explained in Define custom recipes.

  1. Finally, V(x) is obtained as
V(x) = (U/W)(x)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gpgi-0.11.1.tar.gz (28.8 kB view details)

Uploaded Source

Built Distributions

gpgi-0.11.1-cp311-cp311-win_amd64.whl (204.3 kB view details)

Uploaded CPython 3.11 Windows x86-64

gpgi-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

gpgi-0.11.1-cp311-cp311-macosx_10_9_x86_64.whl (241.0 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

gpgi-0.11.1-cp310-cp310-win_amd64.whl (206.3 kB view details)

Uploaded CPython 3.10 Windows x86-64

gpgi-0.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

gpgi-0.11.1-cp310-cp310-macosx_10_9_x86_64.whl (244.9 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

gpgi-0.11.1-cp39-cp39-win_amd64.whl (207.9 kB view details)

Uploaded CPython 3.9 Windows x86-64

gpgi-0.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

gpgi-0.11.1-cp39-cp39-macosx_10_9_x86_64.whl (243.6 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

gpgi-0.11.1-cp38-cp38-win_amd64.whl (208.3 kB view details)

Uploaded CPython 3.8 Windows x86-64

gpgi-0.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

gpgi-0.11.1-cp38-cp38-macosx_10_9_x86_64.whl (240.6 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

File details

Details for the file gpgi-0.11.1.tar.gz.

File metadata

  • Download URL: gpgi-0.11.1.tar.gz
  • Upload date:
  • Size: 28.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for gpgi-0.11.1.tar.gz
Algorithm Hash digest
SHA256 91dff20fa707a78d7fc911aead4380aaf43c703641bd8f4c36d6ce996bef4440
MD5 c50ecfead034ddcab3dd8b367385be85
BLAKE2b-256 4a00abba0f5e198d1da6db7de90ad3d9141ecfd9caf0c002e89b3fc94a7e86da

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: gpgi-0.11.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 204.3 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for gpgi-0.11.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 37c76056baf35bd1da7d0738aef52e16aa4f41207d03ef751d62168c17bff1c8
MD5 bd58e186c1487f591eefd93f93df28b0
BLAKE2b-256 b817a62e28e6d800211287cb430c2766768e3866ab409e19f2c39bdc08106115

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gpgi-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f7ab72f8956cb6d2e4eda4e5aca40d17df04069b2b8e86c1a659b51a4d6cd9ac
MD5 485796b4e405bc1a75fd4304ad5414b8
BLAKE2b-256 474a55ee203bb2d073c28d2cd79ecf253a3fe24482cf6b95235b8487f205edbd

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for gpgi-0.11.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5e2b53001315d5d393fa5ff024ec5e92f4a5f9dc252a491b2e748ed2e33e8086
MD5 7adbc9deafc852282912c9d3a8128fa0
BLAKE2b-256 cc1ba8180b73d299353de575bb484d4aebc289610c1ed36cf89baed72ad215d2

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: gpgi-0.11.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 206.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for gpgi-0.11.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 d6f3a0141b75898aa2b64d3c2282273074f9ea44509b5d632459876a9b67b23a
MD5 f6155a6f7e0e0a81da85b7d90f130cf6
BLAKE2b-256 05284ac5db381af1d85ea0b96870f5ff0cd43590962f118feee5e46f55c44aed

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gpgi-0.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e347813afca58bdbba06420dec6f637984df94ab8a482deafd7e6b0bfe0e9a4d
MD5 057517d065b794cacd9ec5fef6308bd6
BLAKE2b-256 51b0096ac5b99efce56654f561f1c074116a8bcbe3c6991353a85c5bb25544ad

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for gpgi-0.11.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 727c188781e27c9efec8ce0d39148e5a18fe612ef444d5d1e9af3e7f21e1d583
MD5 9879c94a42140eaa4e17712cf6686135
BLAKE2b-256 a9cfce59d2445c75a181c777b5671bd2203099bc15cf1957942561675b510c1f

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: gpgi-0.11.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 207.9 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for gpgi-0.11.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5080cfc557b2adff2e3507112fe33d8750b8e4e414d85d4d538eb20dbb8a8eda
MD5 977233faab925fcfe7f1404bd00c5ecf
BLAKE2b-256 dfd0aa01fa8bd5a69aeebc1efeaf873fdcd1a0fbfac6cbebe8a715db6d4c0316

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gpgi-0.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a2293c2225c93038084c6ed0a488826698511e5656e406c79a65239a76308931
MD5 a3513e0f1ddfae2b9889fdfd595e002a
BLAKE2b-256 7f1f7c1a76550bc8b9a581f5775ccb60bb7ed85504d107871fdd2cf14d89b801

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for gpgi-0.11.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 01c3e9b0d19fb1dab503e274814775d0e2261cff43a08facbc73972838951e99
MD5 6f75aa003a951eec8125ca774edb0f51
BLAKE2b-256 bb4ec56e9d74e0d7a2855447681c9c78a5d8f8537ebf4343807bb8146e62a82d

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: gpgi-0.11.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 208.3 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.3

File hashes

Hashes for gpgi-0.11.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 0205f301b1e029950f369c1a011592de2abf7d9d707cc5cce63ded9645e1a51a
MD5 dd08c19008efb9aa50ff53bda83489a7
BLAKE2b-256 eea9c0bbf93964845a848df8bf5e6bc706b52cfa0b948f7d6957f88cd56919df

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for gpgi-0.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8a8ada12894c4c250fc671976c84f72a4f7012ce80ce7beed410f4b569cfa398
MD5 9355a4ab2eb722be40affab4851e67b0
BLAKE2b-256 2fcf97974f038eed055d06b0ae8c733fa3ed26c5b2f6df0eedb01f816920f4ff

See more details on using hashes here.

File details

Details for the file gpgi-0.11.1-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for gpgi-0.11.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4ae173e348b3c4a36217ad92ba557999475801c34f736b34cf11e5a5a3b130ef
MD5 9c33b9e2f3bde7738e3186bcbc051e34
BLAKE2b-256 9c6087daa1631d5641c54fac2aafa5a18c6a6f6c04c9caae03fd5526791364e2

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page