From 2ad1e1200ffb5781daf736908a0da37105f52707 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 13 May 2019 18:34:36 +0200
Subject: [PATCH] Fix boundary condition checking in 1D

Now checks that each boundary has only one node in parallel and *not* on each processor...
---
 src/mesh/MeshNodeBoundary.hpp | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/mesh/MeshNodeBoundary.hpp b/src/mesh/MeshNodeBoundary.hpp
index 8f3b6362d..5742d0c5d 100644
--- a/src/mesh/MeshNodeBoundary.hpp
+++ b/src/mesh/MeshNodeBoundary.hpp
@@ -162,12 +162,21 @@ MeshFlatNodeBoundary<2>::_checkBoundaryIsFlat(const TinyVector<2, double>& norma
 template <>
 template <typename MeshType>
 PUGS_INLINE TinyVector<1, double>
-MeshFlatNodeBoundary<1>::_getNormal(const MeshType&)
+MeshFlatNodeBoundary<1>::_getNormal(const MeshType& mesh)
 {
   static_assert(MeshType::Dimension == 1);
   using R = TinyVector<1, double>;
 
-  if (m_node_list.size() != 1) {
+  const size_t number_of_bc_nodes = [&]() {
+    size_t number_of_bc_nodes = 0;
+    auto node_is_owned        = mesh.connectivity().nodeIsOwned();
+    for (size_t i_node = 0; i_node < m_node_list.size(); ++i_node) {
+      number_of_bc_nodes += (node_is_owned[m_node_list[i_node]]);
+    }
+    return parallel::allReduceMax(number_of_bc_nodes);
+  }();
+
+  if (number_of_bc_nodes != 1) {
     perr() << "Node boundaries in 1D require to have exactly 1 node\n";
     std::exit(1);
   }
-- 
GitLab