From cf3a43a5d2d116ef13cffe572f19c05af343e80d Mon Sep 17 00:00:00 2001 From: coco-yeung Date: Mon, 2 Feb 2026 17:14:26 +0000 Subject: [PATCH 1/6] Removed optional secondBoundaryConds() --- .../include/FVM_ANDS/AdvDiffSystem.hpp | 4 +- .../include/FVM_ANDS/BoundaryCondition.hpp | 10 ++-- Code.v05-00/src/FVM_ANDS/AdvDiffSystem.cpp | 52 ++++++++++++------- 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/Code.v05-00/include/FVM_ANDS/AdvDiffSystem.hpp b/Code.v05-00/include/FVM_ANDS/AdvDiffSystem.hpp index 136ff7335..3667d0685 100644 --- a/Code.v05-00/include/FVM_ANDS/AdvDiffSystem.hpp +++ b/Code.v05-00/include/FVM_ANDS/AdvDiffSystem.hpp @@ -337,8 +337,8 @@ namespace FVM_ANDS{ if(point->bcDirection() == direction){ return point->corrPoint(); } - else if (point->secondBoundaryConds() && point->secondBoundaryConds().value().direction == direction){ - return point->secondBoundaryConds().value().corrPoint; + else if (const auto* bc = point->secondBoundaryConds(); bc && bc->direction == direction) { + return bc->corrPoint; } return neighbor_point_interior(direction, pointID); } diff --git a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp index fc6d0b85e..470d5e4c9 100644 --- a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp +++ b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp @@ -50,8 +50,8 @@ namespace FVM_ANDS{ inline virtual void setSecondaryBC(BoundaryCondDescription bc) { return; } - virtual inline std::optional secondBoundaryConds() const { - return std::nullopt; + virtual inline BoundaryCondDescription* secondBoundaryConds() const { + return nullptr; } protected: BoundaryCondDescription bc_; @@ -75,12 +75,12 @@ namespace FVM_ANDS{ inline void setSecondaryBC(BoundaryCondDescription bc) override { secondary_bc_ = bc; } - inline std::optional secondBoundaryConds() const override{ - return secondary_bc_; + inline BoundaryCondDescription* secondBoundaryConds() const override{ + return &secondary_bc_; } private: - std::optional secondary_bc_; + BoundaryCondDescription secondary_bc_; }; struct BoundaryConditions { BoundaryConditionFlag bcType_top; diff --git a/Code.v05-00/src/FVM_ANDS/AdvDiffSystem.cpp b/Code.v05-00/src/FVM_ANDS/AdvDiffSystem.cpp index d4b6c823d..460b8dc7a 100644 --- a/Code.v05-00/src/FVM_ANDS/AdvDiffSystem.cpp +++ b/Code.v05-00/src/FVM_ANDS/AdvDiffSystem.cpp @@ -263,8 +263,9 @@ namespace FVM_ANDS{ isSouthBoundary = points_[i]->bcDirection() == FaceDirection::SOUTH; //Corner cases... - bool secondaryWestBound = (points_[i]->secondBoundaryConds() && points_[i]->secondBoundaryConds().value().direction == FaceDirection::WEST); - bool secondaryEastBound = (points_[i]->secondBoundaryConds() && points_[i]->secondBoundaryConds().value().direction == FaceDirection::EAST); + const auto* secondBC = points_[i]->secondBoundaryConds(); + bool secondaryWestBound = (secondBC && secondBC->direction == FaceDirection::WEST); + bool secondaryEastBound = (secondBC && secondBC->direction == FaceDirection::EAST); isWestBoundary = (points_[i]->bcDirection() == FaceDirection::WEST || secondaryWestBound); isEastBoundary = (points_[i]->bcDirection() == FaceDirection::EAST || secondaryEastBound); @@ -358,14 +359,15 @@ namespace FVM_ANDS{ case FaceDirection::ERROR: throw std::runtime_error("Invalid FaceDirection in Dirichlet boundary condition"); } - if (!points_[i]->secondBoundaryConds()) break; - BoundaryCondDescription bc_2 = points_[i]->secondBoundaryConds().value(); - switch(bc_2.direction){ + const auto* bc_2 = points_[i]->secondBoundaryConds(); + if (!bc_2) break; + + switch(bc_2->direction){ case FaceDirection::EAST: - rhs_[i] -= u_vec_[i] * dt_ / dx_ * bc_2.bcVal; + rhs_[i] -= u_vec_[i] * dt_ / dx_ * bc_2->bcVal; break; case FaceDirection::WEST: - rhs_[i] += u_vec_[i] * dt_ / dx_ * bc_2.bcVal; + rhs_[i] += u_vec_[i] * dt_ / dx_ * bc_2->bcVal; break; default: throw std::runtime_error("Can't have anything but EAST or WEST as secondary BC!"); @@ -420,8 +422,12 @@ namespace FVM_ANDS{ //corner cases if(j == 0 || j == ny_ - 1){ int bPointID_cornerLeft = twoDIdx_to_vecIdx(0, j, nx_, ny_, format_); - int ghostPointID = points_[bPointID_cornerLeft]->secondBoundaryConds().value().corrPoint; - double bcVal = points_[bPointID_cornerLeft]->secondBoundaryConds().value().bcVal; + const auto* bc_left = points_[bPointID_cornerLeft]->secondBoundaryConds(); + if (!bc_left) { + throw std::runtime_error("Expected secondary BC on corner left point"); + } + int ghostPointID = bc_left->corrPoint; + double bcVal = bc_left->bcVal; switch(bcType_left_){ case BoundaryConditionFlag::DIRICHLET_INT_BPOINT: { phi_[ghostPointID] = 2 * bcVal - phi_[bPointID_cornerLeft]; @@ -433,8 +439,12 @@ namespace FVM_ANDS{ } int bPointID_cornerRight = twoDIdx_to_vecIdx(nx_ - 1, j, nx_, ny_, format_); - ghostPointID = points_[bPointID_cornerRight]->secondBoundaryConds().value().corrPoint; - bcVal = points_[bPointID_cornerRight]->secondBoundaryConds().value().bcVal; + const auto* bc_right = points_[bPointID_cornerRight]->secondBoundaryConds(); + if (!bc_right) { + throw std::runtime_error("Expected secondary BC on corner right point"); + } + ghostPointID = bc_right->corrPoint; + bcVal = bc_right->bcVal; switch(bcType_right_){ case BoundaryConditionFlag::DIRICHLET_INT_BPOINT: { @@ -558,26 +568,28 @@ namespace FVM_ANDS{ int idx_N = i + 1; int idx_S = i - 1; + Point* point = points_[i].get(); + const auto* secondBC = point->secondBoundaryConds(); + //commenting out this results in ~30% speedup //The calls involving the optional are maybe 1/3 of the cost. Maybe something to look at later. if(points_[i]->bcType() != BoundaryConditionFlag::INTERIOR){ - Point* point = points_[i].get(); FaceDirection direction = point->bcDirection(); isNorthBoundary = direction == FaceDirection::NORTH; isSouthBoundary = direction == FaceDirection::SOUTH; //Corner cases... - bool secondaryWestBound = (point->secondBoundaryConds() && point->secondBoundaryConds()->direction == FaceDirection::WEST); - bool secondaryEastBound = (point->secondBoundaryConds() && point->secondBoundaryConds()->direction == FaceDirection::EAST); + bool secondaryWestBound = (secondBC && secondBC->direction == FaceDirection::WEST); + bool secondaryEastBound = (secondBC && secondBC->direction == FaceDirection::EAST); isWestBoundary = (direction == FaceDirection::WEST || secondaryWestBound); isEastBoundary = (direction == FaceDirection::EAST || secondaryEastBound); //only call this lookup function on boundary nodes which are inconsequential in number - idx_N = isNorthBoundary? point->corrPoint() : idx_N; - idx_S = isSouthBoundary? point->corrPoint() : idx_S; - idx_E = isEastBoundary? (secondaryEastBound ? point->secondBoundaryConds()->corrPoint : point->corrPoint()) : idx_E; - idx_W = isWestBoundary? (secondaryEastBound ? point->secondBoundaryConds()->corrPoint : point->corrPoint()) : idx_W; + idx_N = isNorthBoundary ? point->corrPoint() : idx_N; + idx_S = isSouthBoundary ? point->corrPoint() : idx_S; + idx_E = isEastBoundary ? (secondaryEastBound ? secondBC->corrPoint : point->corrPoint()) : idx_E; + idx_W = isWestBoundary ? (secondaryWestBound ? secondBC->corrPoint : point->corrPoint()) : idx_W; } //When you declare these vars (inside or outside loop) has 0 impact) //takes ~ 6 out of 18 ns on background var calcs @@ -627,7 +639,7 @@ namespace FVM_ANDS{ } if(isWestBoundary){ - phi_W = secondaryWestBound ? points_[i]->secondBoundaryConds().value().bcVal : points_[i]->bcVal(); + phi_W = secondaryWestBound ? secondBC->bcVal : points_[i]->bcVal(); } else if (u_local >= 0){ phi_W = phi_[idx_W] + 0.5 * minmod_W_vPos(i) * (phi_[i] - phi_[idx_W]); @@ -637,7 +649,7 @@ namespace FVM_ANDS{ } if(isEastBoundary){ - phi_E = secondaryEastBound ? points_[i]->secondBoundaryConds().value().bcVal : points_[i]->bcVal(); + phi_E = secondaryEastBound ? secondBC->bcVal : points_[i]->bcVal(); } else if (u_local >= 0){ phi_E = phi_[i] + 0.5 * minmod_E_vPos(i) * (phi_[idx_E] - phi_[i]); From 1fddcccac3fbd641ef72d5d62a3841c510155b87 Mon Sep 17 00:00:00 2001 From: coco-yeung Date: Mon, 2 Feb 2026 17:22:23 +0000 Subject: [PATCH 2/6] remove const --- Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp index 470d5e4c9..1f01d6e8f 100644 --- a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp +++ b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp @@ -75,7 +75,7 @@ namespace FVM_ANDS{ inline void setSecondaryBC(BoundaryCondDescription bc) override { secondary_bc_ = bc; } - inline BoundaryCondDescription* secondBoundaryConds() const override{ + inline BoundaryCondDescription* secondBoundaryConds() override{ return &secondary_bc_; } From 75f8dbb533b3b68596da01821e0e4674e8bec3f7 Mon Sep 17 00:00:00 2001 From: coco-yeung Date: Mon, 2 Feb 2026 17:29:18 +0000 Subject: [PATCH 3/6] remove const --- Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp | 2 +- Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp index 1f01d6e8f..2f12a9cb6 100644 --- a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp +++ b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp @@ -50,7 +50,7 @@ namespace FVM_ANDS{ inline virtual void setSecondaryBC(BoundaryCondDescription bc) { return; } - virtual inline BoundaryCondDescription* secondBoundaryConds() const { + virtual inline BoundaryCondDescription* secondBoundaryConds() { return nullptr; } protected: diff --git a/Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp b/Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp index 08b2c0d7e..277489dbb 100644 --- a/Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp +++ b/Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp @@ -16,12 +16,10 @@ namespace FVM_ANDS { setBC(bc); } IntBoundPoint::IntBoundPoint(BoundaryCondDescription bc1) - : Point(bc1) { - secondary_bc_= std::nullopt; + : Point(bc1), secondary_bc_() { } IntBoundPoint::IntBoundPoint(BoundaryCondDescription bc1, BoundaryCondDescription bc2) - : Point(bc1) { - secondary_bc_ = bc2; + : Point(bc1), secondary_bc_(bc2){ } BoundaryCondDescription::BoundaryCondDescription() From 178f20cc660ddaead12b25ef8016fd6bbc4b1c04 Mon Sep 17 00:00:00 2001 From: coco-yeung Date: Mon, 2 Feb 2026 17:37:47 +0000 Subject: [PATCH 4/6] added boolean flag --- Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp | 2 +- Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp index 2f12a9cb6..85cf6d721 100644 --- a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp +++ b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp @@ -76,7 +76,7 @@ namespace FVM_ANDS{ secondary_bc_ = bc; } inline BoundaryCondDescription* secondBoundaryConds() override{ - return &secondary_bc_; + return &secondary_bc_ ? &secondary_bc_ : nullptr; } private: diff --git a/Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp b/Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp index 277489dbb..09107e678 100644 --- a/Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp +++ b/Code.v05-00/src/FVM_ANDS/BoundaryCondition.cpp @@ -16,10 +16,10 @@ namespace FVM_ANDS { setBC(bc); } IntBoundPoint::IntBoundPoint(BoundaryCondDescription bc1) - : Point(bc1), secondary_bc_() { + : Point(bc1), secondary_bc_(), has_secondary_bc_(false) { } IntBoundPoint::IntBoundPoint(BoundaryCondDescription bc1, BoundaryCondDescription bc2) - : Point(bc1), secondary_bc_(bc2){ + : Point(bc1), secondary_bc_(bc2), has_secondary_bc_(true){ } BoundaryCondDescription::BoundaryCondDescription() From 1e5c55ceb16a799095f32924a8036ba6ce1ebfe1 Mon Sep 17 00:00:00 2001 From: coco-yeung Date: Mon, 2 Feb 2026 17:39:14 +0000 Subject: [PATCH 5/6] fixing error --- Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp index 85cf6d721..bfea7b567 100644 --- a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp +++ b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp @@ -81,6 +81,7 @@ namespace FVM_ANDS{ private: BoundaryCondDescription secondary_bc_; + bool has_secondary_bc_; }; struct BoundaryConditions { BoundaryConditionFlag bcType_top; From 590423f0c22ee47e688efc1a78959ffce6959006 Mon Sep 17 00:00:00 2001 From: coco-yeung Date: Mon, 2 Feb 2026 17:49:58 +0000 Subject: [PATCH 6/6] fixing error --- Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp index bfea7b567..6e2b1ebe8 100644 --- a/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp +++ b/Code.v05-00/include/FVM_ANDS/BoundaryCondition.hpp @@ -76,7 +76,7 @@ namespace FVM_ANDS{ secondary_bc_ = bc; } inline BoundaryCondDescription* secondBoundaryConds() override{ - return &secondary_bc_ ? &secondary_bc_ : nullptr; + return has_secondary_bc_ ? &secondary_bc_ : nullptr; } private: