diff --git a/src/atlas/grid/StructuredGrid.cc b/src/atlas/grid/StructuredGrid.cc index 86c0c389d..7ade36468 100644 --- a/src/atlas/grid/StructuredGrid.cc +++ b/src/atlas/grid/StructuredGrid.cc @@ -76,6 +76,6 @@ inline const HealpixGrid::grid_t* healpix_grid(const Grid::Implementation* grid) HealpixGrid::HealpixGrid(const Grid& grid): StructuredGrid(grid), grid_(healpix_grid(get())) {} -HealpixGrid::HealpixGrid(int N): HealpixGrid(Grid(new HealpixGrid::grid_t(N))) {} +HealpixGrid::HealpixGrid(int N, const std::string& ordering): HealpixGrid(Grid(new HealpixGrid::grid_t(N, ordering))) {} } // namespace atlas diff --git a/src/atlas/grid/StructuredGrid.h b/src/atlas/grid/StructuredGrid.h index a78feeabb..16d3893c7 100644 --- a/src/atlas/grid/StructuredGrid.h +++ b/src/atlas/grid/StructuredGrid.h @@ -272,7 +272,7 @@ class HealpixGrid : public StructuredGrid { public: HealpixGrid(const Grid&); - HealpixGrid(int N); + HealpixGrid(int N, const std::string& ordering = "ring"); operator bool() const { return valid(); } diff --git a/src/atlas/grid/detail/grid/Healpix.cc b/src/atlas/grid/detail/grid/Healpix.cc index 9a0d4c6f3..1150b54db 100644 --- a/src/atlas/grid/detail/grid/Healpix.cc +++ b/src/atlas/grid/detail/grid/Healpix.cc @@ -14,6 +14,7 @@ #include #include #include +#include #include "atlas/grid/Spacing.h" #include "atlas/grid/StructuredGrid.h" @@ -42,16 +43,17 @@ static class HealpixGridBuilder : GridBuilder { int id; std::vector matches; if (match(name, matches, id)) { - int N = std::stoi(matches[0]); - return new detail::grid::Healpix(N); + int N = std::stoi(matches[0]); + std::string ordering = config.getString("ordering", "ring"); + return new detail::grid::Healpix(N, ordering); } return nullptr; } const Grid::Implementation* create(const Grid::Config& config) const override { - long N; - config.get("N", N); - return new detail::grid::Healpix(N); + long N = config.getLong("N", 0); + std::string ordering = config.getString("ordering", "ring"); + return new detail::grid::Healpix(N, ordering); } } healpix_builder_; @@ -110,8 +112,12 @@ Healpix::YSpace healpix_yspace(long N) { return new spacing::CustomSpacing(y.size(), y.data()); } -Healpix::Healpix(long N): - Structured("H" + std::to_string(N), healpix_xspace(N), healpix_yspace(N), Projection(), GlobalDomain()) {} +Healpix::Healpix(long N, const std::string& ordering): + Structured("H" + std::to_string(N), healpix_xspace(N), healpix_yspace(N), Projection(), GlobalDomain()) { + if (ordering != "ring") { + ATLAS_THROW_EXCEPTION("atlas Healpix Grid is only supported with ring ordering"); + } + } Healpix::Config Healpix::meshgenerator() const { diff --git a/src/atlas/grid/detail/grid/Healpix.h b/src/atlas/grid/detail/grid/Healpix.h index fbe2de34a..3d5f4dd92 100644 --- a/src/atlas/grid/detail/grid/Healpix.h +++ b/src/atlas/grid/detail/grid/Healpix.h @@ -20,7 +20,7 @@ namespace grid { class Healpix : public Structured { public: using Structured::Structured; - Healpix(long N); + Healpix(long N, const std::string& ordering = "ring"); Config meshgenerator() const override; Config partitioner() const override; static std::string static_type() { return "healpix"; } diff --git a/src/tests/mesh/test_healpixmeshgen.cc b/src/tests/mesh/test_healpixmeshgen.cc index c83be6aaa..e49bdba8f 100644 --- a/src/tests/mesh/test_healpixmeshgen.cc +++ b/src/tests/mesh/test_healpixmeshgen.cc @@ -128,10 +128,30 @@ CASE("test_create_healpix_mesh") { //----------------------------------------------------------------------------- +CASE("construction by config") { + EXPECT(Grid(util::Config("type", "healpix")("N", 3)) == Grid("H3")); +} + CASE("construction by integer") { EXPECT(HealpixGrid(3) == Grid("H3")); } +CASE("construction by integer and ordering") { + EXPECT(HealpixGrid(3, "ring") == Grid("H3")); +} + +CASE("failing construction by integer and unsupported ordering") { + EXPECT_THROWS(HealpixGrid grid(3, "nested")); +} + +CASE("failing construction by config with unsupported ordering") { + EXPECT_THROWS(Grid grid(util::Config("name", "H3")("ordering", "nested"))); +} + +CASE("failing construction by config with unsupported ordering") { + EXPECT_THROWS(Grid grid(util::Config("type", "healpix")("N", 3)("ordering", "nested"))); +} + //----------------------------------------------------------------------------- CASE("matching mesh partitioner") {