Skip to content

Commit 4a5d4e9

Browse files
committed
Merge branch 'release/0.44.0'
* release/0.44.0: (76 commits) Version 0.44.0 Support building of StructuredColumns with halos for grids with uneven points at poles e.g. N80 grid Allow BlockStructuredColumns to be used for MatchingPartitioner Revert "Disable atlas_test_interpolation_structured2D_regional, to be fixed with PR #322" Fix RegionalLinear2D and test by using make_indexview for index fields Expose out-of-range in RegionalLinear2D Disable atlas_test_interpolation_structured2D_regional, to be fixed with PR #322 Add matrix halo exchange to "binning" interpolation method. (#315) Improvement in the conservative interpolation for general meshes (#318) Add tests for app atlas-interpolations Introduce an applications atlas-interpolations Workaround issue of ORCA NodeColumns in distribute_global_matrix Make FFT backend pocketfft optional (#320) Only store dependencies cache on default branch Test finite-element interpolation with pentagon elements Add SECTIONS to a atlas_test_mesh_node2cell CASE No need for halo exchange of target field in ConservativeSphericalPolygonInterpolation Improvements to CellColumns::checksum CellColumns::ghost() returns CellColumns::halo() Make pentagons the default for HealpixMeshGenerator ...
2 parents 8adff30 + 793385c commit 4a5d4e9

152 files changed

Lines changed: 16499 additions & 7432 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/static-analyzer-skip.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# This file can be used to suppress warnings
2+
# For syntax, see https://codechecker.readthedocs.io/en/latest/analyzer/user_guide/#skip-file
3+
4+
# Avoid warnings from external pocket_hdronly.h
5+
-*/atlas/linalg/fft/pocketfft.cc
6+

.github/workflows/build-wheel-wrapper.yml

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,28 @@ name: Build Python Wrapper Wheel
1111

1212
on:
1313
# Trigger the workflow manually
14-
workflow_dispatch: ~
14+
workflow_dispatch:
15+
inputs:
16+
use_test_pypi:
17+
description: Use test pypi instead of the regular one
18+
required: false
19+
type: boolean
20+
default: false
1521

1622
# Allow to be called from another workflow -- eg `cd.yml`
17-
workflow_call: ~
23+
workflow_call:
24+
inputs:
25+
use_test_pypi:
26+
description: Use test pypi instead of the regular one
27+
required: false
28+
type: boolean
29+
default: false
1830

1931
jobs:
2032
python-wrapper-wheel:
2133
name: Python Wrapper Wheel
2234
uses: ecmwf/reusable-workflows/.github/workflows/python-wrapper-wheel.yml@main
2335
with:
36+
use_test_pypi: ${{ inputs.use_test_pypi }}
2437
wheel_directory: python/atlaslib-ecmwf
2538
secrets: inherit

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ jobs:
242242
243243
- name: Save cached dependencies
244244
# There seems to be a problem with cached NVHPC dependencies, leading to SIGILL perhaps due to slightly different architectures
245-
if: matrix.caching && matrix.build_type == 'Debug'
245+
if: matrix.caching && matrix.build_type == 'Debug' && github.ref_name == github.event.repository.default_branch
246246
id: deps-save-cache
247247
uses: actions/cache/save@v4
248248
with:

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
private-downstream-ci:
3535
name: private-downstream-ci
3636
needs: [downstream-ci]
37-
if: (success() || failure()) && ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
37+
if: ${{ (success() || failure()) && (!github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci') }}
3838
runs-on: ubuntu-latest
3939
permissions:
4040
pull-requests: write
@@ -61,7 +61,7 @@ jobs:
6161
private-downstream-ci-hpc:
6262
name: private-downstream-ci-hpc
6363
needs: [downstream-ci-hpc]
64-
if: (success() || failure()) && ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
64+
if: ${{ (success() || failure()) && (!github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci') }}
6565
runs-on: ubuntu-latest
6666
permissions:
6767
pull-requests: write
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
name: static-analyzer
2+
on:
3+
pull_request:
4+
types: [opened, synchronize, reopened, closed]
5+
jobs:
6+
build:
7+
if: ${{ github.event_name == 'pull_request' && github.event.action != 'closed' || github.event_name == 'push'}}
8+
runs-on: ubuntu-latest
9+
outputs:
10+
artifact-id: ${{ steps.upload-sareport.outputs.artifact-id }}
11+
steps:
12+
- name: Checkout atlas
13+
uses: actions/checkout@v4
14+
with:
15+
path: atlas
16+
- name: Checkout ecbuild
17+
uses: actions/checkout@v4
18+
with:
19+
repository: ecmwf/ecbuild
20+
path: ecbuild
21+
ref: 'develop'
22+
- name: Checkout eckit
23+
uses: actions/checkout@v4
24+
with:
25+
repository: ecmwf/eckit
26+
path: eckit
27+
ref: 'develop'
28+
- name: Checkout fckit
29+
uses: actions/checkout@v4
30+
with:
31+
repository: ecmwf/fckit
32+
path: fckit
33+
ref: 'develop'
34+
- name: Install dependencies
35+
run: |
36+
python -m pip install CodeChecker
37+
38+
- name: Generate CMakeLists.txt
39+
shell: bash # default on ubuntu-latest
40+
run: |
41+
# Write the file atomically; fail if anything goes wrong
42+
cat > CMakeLists.txt <<'CML'
43+
cmake_minimum_required(VERSION 3.18 FATAL_ERROR)
44+
45+
####################################################################
46+
47+
macro(ecbundle_add_project package_name)
48+
#
49+
# add_subdirectory depending on BUILD_${package_name}
50+
#
51+
set(BUILD_${package_name} ON CACHE BOOL "")
52+
53+
if(BUILD_${package_name})
54+
set(dir ${ARGV1})
55+
if(NOT dir)
56+
set(dir ${package_name})
57+
endif()
58+
add_subdirectory(${dir})
59+
endif()
60+
endmacro()
61+
62+
macro(ecbundle_set key value)
63+
set(${key} ${value} CACHE STRING "")
64+
if("${${key}}" STREQUAL "${value}")
65+
message(" - ${key} = ${value}")
66+
else()
67+
message(" - ${key} = ${${key}} [default=${value}]")
68+
endif()
69+
endmacro()
70+
71+
####################################################################
72+
73+
message(" - source : ${CMAKE_CURRENT_SOURCE_DIR}")
74+
message(" - build : ${CMAKE_CURRENT_BINARY_DIR}")
75+
message(" - install : ${CMAKE_INSTALL_PREFIX}")
76+
message(" - build type : ${CMAKE_BUILD_TYPE}")
77+
message("Bundle variables set for this build:")
78+
79+
ecbundle_set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
80+
ecbundle_set(ENABLE_ECKIT_CMD OFF)
81+
ecbundle_set(ENABLE_ECKIT_SQL OFF)
82+
ecbundle_set(ENABLE_ECKIT_GEO OFF)
83+
ecbundle_set(ENABLE_OMP OFF)
84+
ecbundle_set(ECKIT_ENABLE_TESTS OFF)
85+
ecbundle_set(FCKIT_ENABLE_TESTS OFF)
86+
87+
message("")
88+
89+
####################################################################
90+
91+
find_package(ecbuild 3.8 REQUIRED HINTS ${CMAKE_CURRENT_SOURCE_DIR}/ecbuild)
92+
project(bundle VERSION 0.0.0)
93+
94+
## Initialize
95+
include(${CMAKE_CURRENT_BINARY_DIR}/init.cmake OPTIONAL)
96+
97+
## Projects
98+
ecbundle_add_project(ecbuild)
99+
ecbundle_add_project(eckit)
100+
ecbundle_add_project(fckit)
101+
ecbundle_add_project(atlas)
102+
103+
## Finalize
104+
include(${CMAKE_CURRENT_BINARY_DIR}/final.cmake OPTIONAL)
105+
106+
ecbuild_install_project(NAME ${PROJECT_NAME})
107+
ecbuild_print_summary()
108+
CML
109+
110+
111+
- name: Build sources
112+
run: |
113+
mkdir build
114+
cd build
115+
cmake -GNinja .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
116+
ninja
117+
118+
- name: Analyze sources
119+
run: |
120+
jq '[ .[] | select(.file | test(".*/atlas/src/.*") ) ]' build/compile_commands.json > atlas_compile_commands.json
121+
jq '[ .[] | select(.file | test(".*/pluto/src/.*") ) ]' build/compile_commands.json > pluto_compile_commands.json
122+
jq -n --slurpfile atlas atlas_compile_commands.json --slurpfile pluto pluto_compile_commands.json '$atlas[] + $pluto[]' \
123+
> build/filtered_compile_commands.json
124+
CodeChecker analyze build/filtered_compile_commands.json -o cc_out --analyzers clangsa -j 4 \
125+
-i atlas/.github/static-analyzer-skip.txt
126+
CodeChecker parse -e html cc_out -o ./reports_html --trim-path-prefix ${PWD} || true
127+
- name: Archive static-analyzer report
128+
id: upload-sareport
129+
uses: actions/upload-artifact@v4
130+
with:
131+
name: sareport
132+
path: reports_html
133+
preview-publish:
134+
if: ${{ github.event_name == 'pull_request' && github.event.action != 'closed' }}
135+
needs: build
136+
uses: ecmwf/reusable-workflows/.github/workflows/pr-preview-publish.yml@main
137+
with:
138+
artifact-id: ${{ needs.build.outputs.artifact-id }}
139+
space: docs
140+
name: atlas
141+
path: static-analyzer
142+
link-text: 💣💥☠️ Static Analyzer Report ☠️💥💣
143+
link-tag: STATIC-ANALYSIS
144+
secrets:
145+
sites-token: ${{ secrets.ECMWF_SITES_TOKEN }}
146+
preview-unpublish:
147+
if: ${{ github.event_name == 'pull_request' && github.event.action == 'closed' }}
148+
uses: ecmwf/reusable-workflows/.github/workflows/pr-preview-unpublish.yml@main
149+
with:
150+
space: docs
151+
name: atlas
152+
path: static-analyzer
153+
secrets:
154+
sites-token: ${{ secrets.ECMWF_SITES_TOKEN }}

CHANGELOG.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,35 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
77

88
## [Unreleased]
99

10+
## [0.44.0] - 2025-10-06
11+
12+
### Added
13+
- Add Collect communication pattern by @wdeconinck in https://github.com/ecmwf/atlas/pull/301
14+
- Add array::View interoperability with mdspan by @wdeconinck in https://github.com/ecmwf/atlas/pull/304
15+
- Add support for pocketfft by @wdeconinck in https://github.com/ecmwf/atlas/pull/308, https://github.com/ecmwf/atlas/pull/320
16+
- Improvement in spherical-polygon intersection by @sbrdar in https://github.com/ecmwf/atlas/pull/310
17+
- Improvement in the conservative interpolation for general meshes by @sbrdar in https://github.com/ecmwf/atlas/pull/318
18+
- Add Field::syncHost and Field::syncDevice by @wdeconinck in https://github.com/ecmwf/atlas/pull/311
19+
- Add more GPU tracing capabilities for device allocations and host-device data transfers by @wdeconinck in https://github.com/ecmwf/atlas/pull/312
20+
- Improve HaloExchange on_device, checking state flags by @wdeconinck in https://github.com/ecmwf/atlas/pull/313
21+
- Update interpolation to support hicsparse backend by @l90lpa in https://github.com/ecmwf/atlas/pull/275
22+
- Add Locator to find at which partition and at which index a global index is located by @wdeconinck in https://github.com/ecmwf/atlas/pull/317
23+
- Add matrix halo exchange to "binning" interpolation method. by @odlomax in https://github.com/ecmwf/atlas/pull/315
24+
- Introduce atlas-interpolations app by @wdeconinck in https://github.com/ecmwf/atlas/pull/321
25+
- Support building of StructuredColumns with halos for grids with uneven points at poles e.g. N80 grid
26+
27+
### Changed
28+
- Move mdspan from atlas to pluto and update mdspan to latest by @wdeconinck in https://github.com/ecmwf/atlas/pull/303
29+
- Update MeshBuilder API by @wdeconinck in https://github.com/ecmwf/atlas/pull/305
30+
31+
### Fixed
32+
- Fix out-of-range in RegionalLinear2D with FORTRAN feature disabled by @wdeconinck in https://github.com/ecmwf/atlas/pull/322
33+
- Fix empty adjoint matrix for SphericalVector for scalar fields by @wdeconinck in https://github.com/ecmwf/atlas/pull/314
34+
- Support CUDA 13.0 by @wdeconinck in https://github.com/ecmwf/atlas/pull/316
35+
- Fix out-of-range in RegionalLinear2D with FORTRAN feature disabled by @wdeconinck in https://github.com/ecmwf/atlas/pull/322
36+
- Allow BlockStructuredColumns to be used for MatchingPartitioner
37+
38+
1039
## [0.43.1] - 2025-07-09
1140

1241
### Fixed
@@ -659,6 +688,7 @@ Fix StructuredInterpolation2D with retry for failed stencils
659688
## 0.13.0 - 2018-02-16
660689

661690
[Unreleased]: https://github.com/ecmwf/atlas/compare/master...develop
691+
[0.44.0]: https://github.com/ecmwf/atlas/compare/0.43.1...0.44.0
662692
[0.43.1]: https://github.com/ecmwf/atlas/compare/0.43.0...0.43.1
663693
[0.43.0]: https://github.com/ecmwf/atlas/compare/0.42.0...0.43.0
664694
[0.42.0]: https://github.com/ecmwf/atlas/compare/0.41.0...0.42.0

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ include( features/FORTRAN )
8686
include( features/CUDA )
8787
include( features/MPI )
8888
include( features/OMP )
89+
include( features/POCKETFFT )
8990
include( features/FFTW )
9091
include( features/ECTRANS )
9192
include( features/TESSELATION )

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.43.1
1+
0.44.0

cmake/Findpocketfft.cmake

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# (C) Copyright 2025- ECMWF.
2+
#
3+
# This software is licensed under the terms of the Apache Licence Version 2.0
4+
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5+
# In applying this licence, ECMWF does not waive the privileges and immunities
6+
# granted to it by virtue of its status as an intergovernmental organisation
7+
# nor does it submit to any jurisdiction.
8+
9+
# - Try to find the pocketfft library
10+
# Once done this will define
11+
#
12+
# pocketfft_FOUND - pocketfft found
13+
# pocketfft_INCLUDE_DIRS - the pocketfft include directories
14+
# pocketfft_VERSION - semantic version of pocketfft
15+
#
16+
17+
### Set search paths from environment
18+
if ( NOT pocketfft_PATH AND pocketfft_ROOT )
19+
set( pocketfft_PATH ${pocketfft_ROOT} )
20+
endif()
21+
if ( NOT pocketfft_PATH AND NOT "$ENV{pocketfft_ROOT}" STREQUAL "" )
22+
set( pocketfft_PATH "$ENV{pocketfft_ROOT}" )
23+
endif()
24+
if ( NOT pocketfft_PATH AND NOT "$ENV{pocketfft_PATH}" STREQUAL "" )
25+
set( pocketfft_PATH "$ENV{pocketfft_PATH}" )
26+
endif()
27+
28+
### If search paths given, use it
29+
if( pocketfft_PATH )
30+
find_path(pocketfft_INCLUDE_DIR NAMES pocketfft_hdronly.h PATHS ${pocketfft_PATH} ${pocketfft_PATH}/include pocketfft NO_DEFAULT_PATH )
31+
else()
32+
if( NOT pocketfft_INCLUDE_DIR )
33+
find_path(pocketfft_INCLUDE_DIR NAMES pocketfft_hdronly.h )
34+
endif()
35+
endif()
36+
37+
### As of 2025 pocketfft does not yet have any version.
38+
39+
### Handle the QUIETLY and REQUIRED arguments and set pocketfft_FOUND
40+
include(FindPackageHandleStandardArgs)
41+
find_package_handle_standard_args(pocketfft
42+
REQUIRED_VARS pocketfft_INCLUDE_DIR)
43+
44+
set( POCKETFFT_INCLUDE_DIRS ${pocketfft_INCLUDE_DIR} )
45+
46+
mark_as_advanced( pocketfft_INCLUDE_DIR )

cmake/features/CUDA.cmake

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,22 @@ endif()
2929
set( HAVE_CUDA ${atlas_HAVE_CUDA} )
3030
set( HAVE_HIP ${atlas_HAVE_HIP} )
3131
set( HAVE_GPU ${atlas_HAVE_GPU} )
32-
3332
if( HAVE_GPU )
3433
ecbuild_info("GPU support enabled")
3534
else()
3635
ecbuild_info("GPU support not enabled")
37-
endif()
36+
endif()
37+
38+
if( HAVE_GPU )
39+
set( GPU_AWARE_MPI_default ON )
40+
else()
41+
set( GPU_AWARE_MPI_default OFF )
42+
endif()
43+
ecbuild_add_option( FEATURE GPU_AWARE_MPI
44+
DESCRIPTION "MPI supports GPU to GPU transfers"
45+
DEFAULT ${GPU_AWARE_MPI_default} )
46+
if( HAVE_GPU_AWARE_MPI )
47+
ecbuild_info("GPU aware MPI support enabled")
48+
else()
49+
ecbuild_info("GPU aware MPI support not enabled")
50+
endif()

0 commit comments

Comments
 (0)