ICON Grid Generator
Pure Python generation of ICON-style triangular grids.
ICON Grid Generator creates spherical ICON R<n>B<k> grids, planar triangular
grids, limited-area extracts, and ICON-style NetCDF files without depending on
ICON model runtimes or stencil frameworks.
Quick Start
Most users only need generate_grid():
from grid_generator import generate_grid
grid = generate_grid("R2B4")
print(grid.name)
print(grid.dims)
grid.to_netcdf("icon_grid_R02B04.nc")
Example output:
R02B04
{'cell': 20480, 'vertex': 10242, 'edge': 30720}
Global grids are optimized by default and are suitable for normal ICON-style
grid-file use. Use optimize_global=False only when you explicitly need the
raw bisection topology for diagnostics or tests.
What Optimization Means
The package exposes three related but distinct operations:
| Operation | Actual update | Typical use |
|---|---|---|
| Default global optimization | Damped spherical spring relaxation after refinement stages | Regular production-style global grids |
optimize_grid() |
Simultaneous Laplacian smoothing, or incident-edge target-length smoothing | Improve an existing global, planar, or cut grid |
diffuse_grid() |
Explicit graph-Laplacian diffusion | Controlled experimental smoothing |
All three preserve cells, edges, connectivity, and refinement relationships. They move eligible vertices, project them back onto the grid geometry, and recompute centers, metric fields, normals, statistics metadata, and grid UUIDs. Open-boundary vertices are fixed by default. Periodic grids use their coupled minimum-image lattice during every update.
optimize_grid() and diffuse_grid() do not prove that every quality measure
improves: aggressive settings can flatten or invert cells. Inspect the result
with check_grid(), triangle_properties(), or application-specific quality
criteria; check_grid() itself is a structural check, not a scientific
certificate. See the
optimization guide
for the update equations, option semantics, and examples.
What You Can Generate
- Global spherical ICON grids from standard
R<n>B<k>names. - Planar triangular torus, channel, and parallelogram grids for experiments.
- Limited-area grids extracted from generated global parent grids.
- ICON-style NetCDF grid files when the optional
netCDF4dependency is installed. - In-memory topology, geometry, metric, refinement, and metadata arrays for plotting, diagnostics, and downstream conversion.
IconGrid.to_xarray() preserves those field groups and their zero-based
in-memory connectivity. Parent-provenance arrays retain their ICON-compatible
one-based indices; every xarray index variable carries a start_index
attribute and its missing-value convention. IconGrid.to_netcdf() converts
connectivity to the one-based ICON grid-file convention.
Which Grid Should I Use?
| Goal | Use |
|---|---|
| Standard spherical grid file | generate_grid("R2B4") |
| Raw topology checks | generate_grid("R2B4", optimize_global=False) |
| Periodic planar experiment | TorusGridSpec(...) |
| Open planar experiment | ChannelGridSpec(...) or ParallelogramGridSpec(...) |
| Regional extract from a global parent | LimitedAreaGridSpec(...) |
| Cut an existing in-memory grid | grid_generator.cutting.cut_grid(...) |
Important Conventions
- Spherical
lon/latarrays are in degrees in memory; ICON NetCDF longitude and latitude variables are written in radians. radiussets the Cartesian display sphere (default1.0), whilesphere_radiussets physical spherical lengths and areas. Changingradiusdoes not rescale physical metrics.- Planar
verticesand metrics use the length unit supplied by the spec. Use metres if metre-labelled xarray and NetCDF output is required. Planarlon/latarrays are normalized plotting coordinates, not geographic coordinates. - In-memory topology is zero-based and uses
-1for a missing open-boundary neighbor. ICON NetCDF connectivity is one-based and uses0where required. - Treat a completed
IconGridand its NumPy arrays as immutable.to_dict()exposes the existing arrays rather than defensive copies.
The API guide describes coordinate units, option precedence, regional selection, output indexing, and diagnostic limitations in detail.
Installation
Python 3.10 or newer is required. The base installation depends only on NumPy.
Install from PyPI:
python -m pip install "icon-grid-generator[netcdf]"
From a local checkout:
python -m pip install -e .
Install optional NetCDF and xarray support with:
python -m pip install -e ".[netcdf,xarray]"
Install optional Numba acceleration support with:
python -m pip install -e ".[accelerate]"
Install development dependencies with:
python -m pip install -e ".[test,docs]"
| Extra | Adds |
|---|---|
netcdf |
ICON-style NetCDF writing through netCDF4 |
xarray |
IconGrid.to_xarray() |
accelerate |
Optional Numba acceleration for larger generation work |
test, docs |
Contributor test and documentation tools |
Grid Naming
The ICON documentation describes grid file names with the generic nomenclature
R<n>B<k>,
where n is the number of root divisions and k is the number of subsequent
bisections.
Resource Expectations
Global grid size grows by a factor of four with each bisection:
| Grid | Cells | Edges | Vertices |
|---|---|---|---|
R1B0 |
20 | 30 | 12 |
R1B1 |
80 | 120 | 42 |
R2B3 |
5,120 | 7,680 | 2,562 |
R2B4 |
20,480 | 30,720 | 10,242 |
R2B6 |
327,680 | 491,520 | 163,842 |
generate_grid() has a default safety limit of 2,000,000 cells. Set
max_cells=None only when the allocation is intentional.
Common Recipes
Disable the default safety limit when a large allocation is intentional:
from grid_generator import generate_grid
grid = generate_grid("R2B4", max_cells=None)
Generate a raw diagnostic grid without global optimization:
raw_grid = generate_grid("R2B4", optimize_global=False)
Generate a planar torus grid:
from grid_generator import TorusGridSpec, generate_grid
grid = generate_grid(TorusGridSpec(nx=32, ny=16, edge_length=1_000.0))
print(grid.metadata["grid_geometry"])
print(grid.metadata["domain_length"])
Extract a limited-area grid from a generated global parent:
from grid_generator import LimitedAreaGridSpec, Region, generate_grid
spec = LimitedAreaGridSpec(
parent="R02B03",
region=Region.lonlat_box(lon_min=-20.0, lon_max=20.0, lat_min=35.0, lat_max=60.0),
boundary_depth=2,
)
grid = generate_grid(spec, max_cells=None)
print(grid.dims)
Cut an existing grid with advanced region predicates:
from grid_generator import Region, generate_grid
from grid_generator.cutting import CutGridSpec, cut_grid
parent = generate_grid("R2B4")
cut = cut_grid(
parent,
CutGridSpec(regions=Region.circle(lon=8.0, lat=47.0, radius_degrees=10.0)),
)
For the common single-region case, pass the region directly:
from grid_generator import Region, generate_grid
from grid_generator.cutting import cut_grid
parent = generate_grid("R2B4")
cut = cut_grid(parent, Region.circle(lon=8.0, lat=47.0, radius_degrees=10.0))
NetCDF export requires the netcdf optional extra. See
examples/write_global_grid.py,
examples/write_limited_area.py, and
examples/planar_torus.py for runnable scripts.
Documentation
The full usage and design documentation lives in docs:
To preview the docs locally:
mkdocs serve
Development
See CONTRIBUTING.md for contribution guidelines, review expectations, and domain-specific requirements for grid math and NetCDF changes.
Run the checks used by CI:
make check
The package is laid out as a standalone Python project. If this directory is
split out of a larger checkout, keep .github/, docs/, CITATION.cff,
CHANGELOG.md, LICENSE, README.md, mkdocs.yml, pyproject.toml, src/,
and tests/ at the new repository root.
Citation
If you use ICON Grid Generator in published work, cite it using CITATION.cff. For research releases, connect the public GitHub repository to Zenodo before creating a GitHub Release so a DOI can be minted.
Release History
See CHANGELOG.md.
License
ICON Grid Generator is distributed under the BSD 3-Clause License.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file icon_grid_generator-0.4.0.tar.gz.
File metadata
- Download URL: icon_grid_generator-0.4.0.tar.gz
- Upload date:
- Size: 1.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
72376ed350baeffd77141bde3dc7e146290d22c4927033336c1b3152a78d0d70
|
|
| MD5 |
c983edeed9c1f36f8df901b96c3e386b
|
|
| BLAKE2b-256 |
888c030a81277c4407d64ffeac6d596b84bc84e82764afc25258338043cc6fe9
|
Provenance
The following attestation bundles were made for icon_grid_generator-0.4.0.tar.gz:
Publisher:
release.yml on ofuhrer/icon-grid-generator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
icon_grid_generator-0.4.0.tar.gz -
Subject digest:
72376ed350baeffd77141bde3dc7e146290d22c4927033336c1b3152a78d0d70 - Sigstore transparency entry: 2349693868
- Sigstore integration time:
-
Permalink:
ofuhrer/icon-grid-generator@5994a05462f894812586577213ac8866261e8047 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/ofuhrer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5994a05462f894812586577213ac8866261e8047 -
Trigger Event:
push
-
Statement type:
File details
Details for the file icon_grid_generator-0.4.0-py3-none-any.whl.
File metadata
- Download URL: icon_grid_generator-0.4.0-py3-none-any.whl
- Upload date:
- Size: 67.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7a1cc31cc18c27d34a228c4e8176ee0cf5018a694cf7bb7befbf6786096b793
|
|
| MD5 |
71965fb11c892b53a954ea9f411932e7
|
|
| BLAKE2b-256 |
a95c1827bf26c3d691c77edd4d6f982f80c64fe7ce005718435b641612a75e8f
|
Provenance
The following attestation bundles were made for icon_grid_generator-0.4.0-py3-none-any.whl:
Publisher:
release.yml on ofuhrer/icon-grid-generator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
icon_grid_generator-0.4.0-py3-none-any.whl -
Subject digest:
b7a1cc31cc18c27d34a228c4e8176ee0cf5018a694cf7bb7befbf6786096b793 - Sigstore transparency entry: 2349694635
- Sigstore integration time:
-
Permalink:
ofuhrer/icon-grid-generator@5994a05462f894812586577213ac8866261e8047 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/ofuhrer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5994a05462f894812586577213ac8866261e8047 -
Trigger Event:
push
-
Statement type: