Skip to content

Halo add corners#1005

Open
TomMelt wants to merge 19 commits intodevelopfrom
halo-add-corners
Open

Halo add corners#1005
TomMelt wants to merge 19 commits intodevelopfrom
halo-add-corners

Conversation

@TomMelt
Copy link
Contributor

@TomMelt TomMelt commented Dec 16, 2025

Add corner neighbours into halo exchange logic

Task List

  • Linked an issue above that captures the requirements of this PR
  • Defined the tests that specify a complete and functioning change
  • Implemented the source code change that satisfies the tests
  • Commented all code so that it can be understood without additional context
  • No new warnings are generated or they are mentioned below
  • The documentation has been updated (or an issue has been created to do so)
  • Relevant labels (e.g., enhancement, bug) have been applied to this PR
  • This change conforms to the conventions described in the README

Change Description

This PR has the following key changes:

  • adds support for corner neighbours to the existing halo exchange logic (which previously just exchanged edges)
  • add support for CGVector and DGVectorHolder exchange (this is required for corners and edges)
  • updates metadata tests and closed-boundary (CB) halo test to work with corner neighbours
  • removes the Periodic-Boundary (PB) halo exchange test for now, this will be addressed in a subsequent PR Halo add pb test for halo exchange #1044

Test Description

HaloExchangePB_test.cpp

HaloExchangeCB_test.cpp creates test data for all the array types:

  • HField
  • VertexField
  • DGField
  • DGVector
  • CGVector

I modified the previous version, so that the model data are created in such a way that the value of each cell can be calculated based on its indices. Therefore we can check after exchange that all of the cells have been exchanged successfully. This also now allows us to change the number of ranks arbitrarily (assuming you also provide the appropriate partition_metadata file.

ModelMetadataCB_test.cpp and ModelMetadataPB_test.cpp

Small modifications have been made to the periodic and closed boundary ModelMetadata tests.

The changes now add the additional corner neighbour metadata and check that it is ready correctly.

partition_metadata_3_cb.cdl and partition_metadata_3_pb.cdl

These files are now generated at compile time by running the decomp tool on a new file halo_test_mask.cdl. This is in line with similar changes introduced by @joewallwork on the XIOS tests.


Other Details

  • domain_decop git commit has now been bumped to the latest version on main. This version of the decomp tool contains the corner neighbour metadata.

Further work

@TomMelt TomMelt self-assigned this Dec 16, 2025
@TomMelt TomMelt added the ICCS Tasks or reviews for the ICCS team label Dec 16, 2025
@TomMelt TomMelt changed the base branch from halo-dynamics to develop February 16, 2026 08:50
@TomMelt TomMelt added the enhancement New feature or request label Feb 16, 2026
Copy link
Contributor

@joewallwork joewallwork left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this @TomMelt. Here's some initial feedback. I haven't checked all of the logic but let me know if there's anything in particular you want checking.

Comment on lines 59 to 88
template <int N> Halo(DGVectorHolder<N>& dgvh)
{
m_numComps = N;
setSpatialDims();
intializeHaloMetadata();
}

/*!
* @brief Constructs a halo object from DGVector
* @param dgv DGVector object to create halo from
*/
template <int N> Halo(DGVector<N>& dgv)
{
m_numComps = N;
isVertex = false;
setSpatialDims();
intializeHaloMetadata();
}

/*!
* @brief Constructs a halo object from CGVector
* @param cgv CGVector object to create halo from
*/
template <int N> Halo(CGVector<N>& cgv)
{
m_numComps = 1;
isCG = true;
CGdegree = N;
nCells = CGdegree;
setSpatialDims();
intializeHaloMetadata();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In none of these cases do the constructors depend on their argument, right? The only information that's being used is the value of N and the type. So do we actually need to provide dgv, dgvh, or cgv as arguments?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we do, because we need to templated N from dgv and dgvh.

You are right that Halo(DGVectorHolder<N>& dgvh) and Halo(DGVector<N>& dgv) are essentially the same. But Halo(ModelArray& ma) and Halo(CGVector<N>& cgv) set different member variables from dgv.

What I could do however, is change Halo(DGVectorHolder<N>& dgvh) to call Halo(DGVector<N>& dgv) with static_cast<DGVector<DGadvection>&>() like we do in dynamics:

Halo halo(hice);
halo.exchangeHalos(static_cast<DGVector<DGadvection>&>(hice));
halo.exchangeHalos(static_cast<DGVector<DGadvection>&>(cice));
halo.exchangeHalos(static_cast<DGVector<DGadvection>&>(damage));

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have simplified this in f1829af

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There seems to be quite a lot of implementation in this header file. Might it be better to separate it out into core/src/Halo.cpp?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. Function definitions should go in a source file if possible. Exceptions are (public) template functions which have to be defined in the header and maybe one-liners.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @joewallwork and @Thanduriel . I have split the implementation as suggested and I also tidied up a bit.

  • Split implementation out from Halo.hpp into core/src/Halo.cpp
  • Moved implementation of non-templated functions to core/src/Halo.cpp
  • Made the following functions private:
    • setSpatialDims()
    • intializeHaloMetadata()
    • sendBufferPositions()
    • sourceToSendBuffer()
    • recvBufferPositions()
    • recvBufferToTarget()
    • recvBufferToTarget()
    • transposeCorners()
    • populateTarget()

See commit c213634

Copy link
Member

@Thanduriel Thanduriel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is my feedback.

@TomMelt TomMelt force-pushed the halo-add-corners branch from 6af5840 to eb26a81 Compare March 4, 2026 10:32
@TomMelt TomMelt force-pushed the halo-add-corners branch from b8507c9 to b693869 Compare March 5, 2026 14:58
TomMelt added 3 commits March 5, 2026 16:41
- Split implementation out from `Halo.hpp` into `core/src/Halo.cpp`
- Moved implementation of non-templated functions to `core/src/Halo.cpp`
- Added `Halo.cpp` to `core/src/CMakeLists.txt`
- Made the following functions private:
  - `setSpatialDims()`
  - `intializeHaloMetadata()`
  - `sendBufferPositions()`
  - `sourceToSendBuffer()`
  - `recvBufferPositions()`
  - `recvBufferToTarget()`
  - `recvBufferToTarget()`
  - `transposeCorners()`
  - `populateTarget()`

All tests pass: `ctest` (6/6 tests passed)
Copy link
Member

@Thanduriel Thanduriel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have one alternative suggestion for the shorter enum types but you decide if you want to make the change. From my side the code is ready for merge.

Copy link
Contributor

@joewallwork joewallwork left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great, thanks @TomMelt. I have a few small requests but I think it's otherwise good to go!

* │ │x│x│ │ (empty) = unused data in DGVector
* └─┴─┴─┴─┘
*/
template <typename T> void exchangeHalos(T& target)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please could you add a docstring for this function?

*
* Halo supports the main data structures of NextSim e.g., ModelArray, DGVector and CGVector.
*
* The halos are exchange via one-sided MPI communication using RMA.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps spell out RMA here for clarity.


void Halo::populateRecvBuffers()
{

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request ICCS Tasks or reviews for the ICCS team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants