icon4py-atmosphere-dycore
Description
Contains code ported from ICON src/atm_dyn_iconam, which is the dynamical core of the ICON model.
Treatment of stencils operating on different vertical levels
Variables in ICON can either sit on full levels or half levels. Let's denote the number of full levels is nlev. Full-level variables have nlev levels in vertical dimension, while half-level variables have nlev+1 in vertical dimension. When running a GT4Py program over nlev+1 levels, do not output full-level and half-level variables together in a field_operator until the upper vertical bound of nlev+1 because the nlev+1 level will also be written for a full-level variable, which is out-of-bounds. The following code is an example:
@field_operator
def _foo(
input_var: CellKField[wpfloat],
k_field: KField[wpfloat],
nlev: int32,
) -> tuple[CellKField[wpfloat], CellKField[wpfloat]]:
(half_level_var, full_level_var) = where(
(k_field >= 0) & (k_field < nlev),
_compute_var(input_var),
(half_level_var, full_level_var),
)
half_level_var = where(k_field == nlev, _init_cell_kdim_field_with_zero_vp(), half_level_var)
return half_level_var, full_level_var
@program
def foo(
input_var: CellKField[wpfloat],
k_field: KField[wpfloat],
nlev: int32,
full_level_var: CellField[wpfloat],
half_level_var: CellField[wpfloat],
horizontal_start: int32,
horizontal_end: int32,
vertical_start: int32,
vertical_end: int32,
) -> None:
_foo(
input_var,
k_field,
nlev,
out=(half_level_var, full_level_var),
domain={
CellDim: (horizontal_start, horizontal_end),
KDim: (vertical_start, vertical_end),
}
)
)
foo(
input_var=input_var,
full_level_var=full_level_var,
half_level_var=half_level_var,
k_field=k_field,
nlev=nlev,
horizontal_start=start_cell,
horizontal_end=end_cell,
vertical_start=0,
vertical_end=nlev + 1,
offset_provider={},
)
Here is a fix to the example above:
@program
def foo(
input_var: CellKField[wpfloat],
full_level_var: CellField[wpfloat],
half_level_var: CellField[wpfloat],
horizontal_start: int32,
horizontal_end: int32,
vertical_start: int32,
vertical_end: int32,
) -> None:
_compute_var(
input_var,
out=(half_level_var, full_level_var),
domain={
CellDim: (horizontal_start, horizontal_end),
KDim: (vertical_start, vertical_end - 1),
}
)
_init_cell_kdim_field_with_zero_vp(
out=half_level_var,
domain={
CellDim: (horizontal_start, horizontal_end),
KDim: (vertical_end - 1, vertical_end),
}
)
)
foo(
input_var=input_var,
full_level_var=full_level_var,
half_level_var=half_level_var,
horizontal_start=start_cell,
horizontal_end=end_cell,
vertical_start=0,
vertical_end=nlev + 1,
offset_provider={},
)
In the fix above, the original field_operator _foo is removed and the GT4Py program directly calls _compute_var and _init_cell_kdim_field_with_zero_vp separately with different vertical bounds.
The illegal access to nlev+1 level of the full-level variable can thus be avoided by calling _compute_var with vertical bounds of (0, nlev).
The computation on nlev+1 level half_level_var = where(k_field == nlev, _init_cell_kdim_field_with_zero_vp(), half_level_var) in the removed field_operator _foo is instead performed explicitly by calling _init_cell_kdim_field_with_zero_vp with another vertical bounds of (nlev, nlev+1).
Installation instructions
Check the README.md at the root of the model folder for installation instructions.
Metadata
Release files for icon4py-atmosphere-dycore 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| icon4py_atmosphere_dycore-0.4.1.tar.gz | 59.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| icon4py_atmosphere_dycore-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 177.9 kB
Release files / icon4py_atmosphere_dycore-0.4.1.tar.gz
| Download URL | icon4py_atmosphere_dycore-0.4.1.tar.gz |
|---|---|
| Size | 59.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ae404a89b1fcb483ee7bd4fb234f35db6e01f53d71c8af74af667b49e5abf850
|
|
BLAKE2b-256 checksum How to use checksums |
7b693e79713db193303539e7a89b374916f57dc660a430bc8208785a4461952e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / icon4py_atmosphere_dycore-0.4.1-py3-none-any.whl
| Download URL | icon4py_atmosphere_dycore-0.4.1-py3-none-any.whl |
|---|---|
| Size | 118.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
36db5ca148e07f9a4168f507276966865f196ef4444fbb459312a2dfe7b8a31d
|
|
BLAKE2b-256 checksum How to use checksums |
1ec038d18c0ecf63f79bd201aefdd6179b32677b8e6c62561b98ef5b81f2b9b1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency log