From cc4fd33681603f024c45eaa46f0c70c4e282a59f Mon Sep 17 00:00:00 2001 From: David Bold Date: Fri, 9 Aug 2024 13:46:44 +0200 Subject: [PATCH 1/7] Set parallel region by default --- src/field/field3d.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/field/field3d.cxx b/src/field/field3d.cxx index fe9fdc9263..bd8b831606 100644 --- a/src/field/field3d.cxx +++ b/src/field/field3d.cxx @@ -143,7 +143,9 @@ void Field3D::splitParallelSlices() { // Note the fields constructed here will be fully overwritten by the // ParallelTransform, so we don't need a full constructor yup_fields.emplace_back(fieldmesh); + yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", i + 1)); ydown_fields.emplace_back(fieldmesh); + yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", -i - 1)); } } From e4c7d986be427fd3e40a713b6994eee9ce8aacd2 Mon Sep 17 00:00:00 2001 From: David Bold Date: Thu, 26 Sep 2024 09:05:41 +0200 Subject: [PATCH 2/7] Only set region of parallel fields for FCI --- src/field/field3d.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/field/field3d.cxx b/src/field/field3d.cxx index bd8b831606..01c2dcc2e7 100644 --- a/src/field/field3d.cxx +++ b/src/field/field3d.cxx @@ -143,9 +143,11 @@ void Field3D::splitParallelSlices() { // Note the fields constructed here will be fully overwritten by the // ParallelTransform, so we don't need a full constructor yup_fields.emplace_back(fieldmesh); - yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", i + 1)); ydown_fields.emplace_back(fieldmesh); - yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", -i - 1)); + if (isFci()) { + yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", i + 1)); + yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", -i - 1)); + } } } From 0cdf3e2b98d14407a03a88c73f5a6159b2abe88a Mon Sep 17 00:00:00 2001 From: David Bold Date: Mon, 20 Jan 2025 16:28:15 +0100 Subject: [PATCH 3/7] Fix split parallel slices --- src/field/field3d.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field/field3d.cxx b/src/field/field3d.cxx index 01c2dcc2e7..0ad6d51ffa 100644 --- a/src/field/field3d.cxx +++ b/src/field/field3d.cxx @@ -146,7 +146,7 @@ void Field3D::splitParallelSlices() { ydown_fields.emplace_back(fieldmesh); if (isFci()) { yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", i + 1)); - yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", -i - 1)); + ydown_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", -i - 1)); } } } From 343fe342c7bd0d945eb0c3107e0deb51a4af0e02 Mon Sep 17 00:00:00 2001 From: David Bold Date: Tue, 30 Sep 2025 14:56:53 +0200 Subject: [PATCH 4/7] add resetRegionParallel to set default regions for parallel slices --- include/bout/field3d.hxx | 1 + src/field/field3d.cxx | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/include/bout/field3d.hxx b/include/bout/field3d.hxx index c6e1d1191d..54d9fb85c9 100644 --- a/include/bout/field3d.hxx +++ b/include/bout/field3d.hxx @@ -331,6 +331,7 @@ public: const Region& getValidRegionWithDefault(const std::string& region_name) const; void setRegion(const std::string& region_name) override; void resetRegion() override { regionID.reset(); }; + void resetRegionParallel(); void setRegion(size_t id) override { regionID = id; }; void setRegion(std::optional id) override { regionID = id; }; std::optional getRegionID() const override { return regionID; }; diff --git a/src/field/field3d.cxx b/src/field/field3d.cxx index 0ad6d51ffa..1cf54a9900 100644 --- a/src/field/field3d.cxx +++ b/src/field/field3d.cxx @@ -845,6 +845,16 @@ void Field3D::setRegion(const std::string& region_name) { regionID = fieldmesh->getRegionID(region_name); } +void Field3D::resetRegion() { regionID.reset(); }; +void Field3D::resetRegionParallel() { + if (isFci()) { + for (int i = 0; i < fieldmesh->ystart; ++i) { + yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", i + 1)); + ydown_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", -i - 1)); + } + } +} + Field3D& Field3D::enableTracking(const std::string& name, std::weak_ptr _tracking) { tracking = std::move(_tracking); From e7592a848f8540b8189dea8ac69447c2d4676bcf Mon Sep 17 00:00:00 2001 From: David Bold Date: Mon, 10 Nov 2025 12:43:45 +0100 Subject: [PATCH 5/7] Move parallel region creation to defaultRegions --- src/mesh/mesh.cxx | 6 ++++++ src/mesh/parallel/fci.cxx | 10 ---------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/mesh/mesh.cxx b/src/mesh/mesh.cxx index 8964a6b797..010e799b2b 100644 --- a/src/mesh/mesh.cxx +++ b/src/mesh/mesh.cxx @@ -654,6 +654,12 @@ void Mesh::createDefaultRegions() { + getRegion3D("RGN_YGUARDS") + getRegion3D("RGN_ZGUARDS")) .unique()); + for (int offset_ = -ystart; offset_ <= ystart; ++offset_) { + const auto region = fmt::format("RGN_YPAR_{:+d}", offset_); + addRegion3D(region, Region(xstart, xend, ystart + offset_, yend + offset_, 0, + LocalNz - 1, LocalNy, LocalNz)); + } + //2D regions addRegion2D("RGN_ALL", Region(0, LocalNx - 1, 0, LocalNy - 1, 0, 0, LocalNy, 1, maxregionblocksize)); diff --git a/src/mesh/parallel/fci.cxx b/src/mesh/parallel/fci.cxx index 39654519af..152ffaed2d 100644 --- a/src/mesh/parallel/fci.cxx +++ b/src/mesh/parallel/fci.cxx @@ -261,16 +261,6 @@ FCIMap::FCIMap(Mesh& mesh, [[maybe_unused]] const Coordinates::FieldMetric& dy, region_no_boundary = region_no_boundary.mask(to_remove); interp->setRegion(region_no_boundary); - - const auto region = fmt::format("RGN_YPAR_{:+d}", offset_); - if (not map_mesh->hasRegion3D(region)) { - // The valid region for this slice - map_mesh->addRegion3D(region, Region(map_mesh->xstart, map_mesh->xend, - map_mesh->ystart + offset_, - map_mesh->yend + offset_, 0, - map_mesh->LocalNz - 1, map_mesh->LocalNy, - map_mesh->LocalNz)); - } } Field3D FCIMap::integrate(Field3D& f) const { From 051387583cfc5efa6719d505fd620cd6b65d1c4d Mon Sep 17 00:00:00 2001 From: David Bold Date: Wed, 4 Mar 2026 11:04:50 +0100 Subject: [PATCH 6/7] Remove duplicate definition of resetRegion --- src/field/field3d.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/field/field3d.cxx b/src/field/field3d.cxx index 1cf54a9900..66a5dbfc18 100644 --- a/src/field/field3d.cxx +++ b/src/field/field3d.cxx @@ -845,7 +845,6 @@ void Field3D::setRegion(const std::string& region_name) { regionID = fieldmesh->getRegionID(region_name); } -void Field3D::resetRegion() { regionID.reset(); }; void Field3D::resetRegionParallel() { if (isFci()) { for (int i = 0; i < fieldmesh->ystart; ++i) { From 7dd76644f54ca455648cec9a0e584fac46274624 Mon Sep 17 00:00:00 2001 From: David Bold Date: Wed, 11 Mar 2026 10:53:19 +0100 Subject: [PATCH 7/7] Ensure consistency Co-authored-by: Peter Hill --- src/field/field3d.cxx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/field/field3d.cxx b/src/field/field3d.cxx index 66a5dbfc18..da7bd494c9 100644 --- a/src/field/field3d.cxx +++ b/src/field/field3d.cxx @@ -144,11 +144,8 @@ void Field3D::splitParallelSlices() { // ParallelTransform, so we don't need a full constructor yup_fields.emplace_back(fieldmesh); ydown_fields.emplace_back(fieldmesh); - if (isFci()) { - yup_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", i + 1)); - ydown_fields[i].setRegion(fmt::format("RGN_YPAR_{:+d}", -i - 1)); - } } + resetRegionParallel(); } void Field3D::clearParallelSlices() {