From f82bc3cdd244faaf5d08e91711b2c89dd26aeac1 Mon Sep 17 00:00:00 2001
From: labourasse <labourassee@gmail.com>
Date: Thu, 23 Feb 2023 19:34:35 +0100
Subject: [PATCH] simple mesh smoother

---
 src/mesh/MeshSmoother.cpp | 70 +++++++++++++--------------------------
 1 file changed, 23 insertions(+), 47 deletions(-)

diff --git a/src/mesh/MeshSmoother.cpp b/src/mesh/MeshSmoother.cpp
index 4e5ed50eb..5b77dcdf7 100644
--- a/src/mesh/MeshSmoother.cpp
+++ b/src/mesh/MeshSmoother.cpp
@@ -167,56 +167,34 @@ class MeshSmootherHandler::MeshSmoother
 
     synchronize(max_delta_xr);
 
-    std::uniform_real_distribution<> distribution(-0.45, 0.45);
+    NodeValue<Rd> shift_r{connectivity};
 
-    NodeValue<const int> node_numbers = connectivity.nodeNumber();
-    using IdCorrespondance            = std::pair<int, NodeId>;
-    Array<IdCorrespondance> node_numbers_to_node_id{node_numbers.numberOfItems()};
     parallel_for(
-      node_numbers.numberOfItems(), PUGS_LAMBDA(const NodeId node_id) {
-        node_numbers_to_node_id[node_id] = std::make_pair(node_numbers[node_id], node_id);
-      });
-
-    std::sort(&node_numbers_to_node_id[0], &node_numbers_to_node_id[0] + node_numbers_to_node_id.size(),
-              [](IdCorrespondance a, IdCorrespondance b) { return a.first < b.first; });
-
-    RandomEngine& random_engine = RandomEngine::instance();
-
-    Assert(isSynchronized(random_engine), "seed is not synchronized when entering mesh smoothation");
+      m_given_mesh.numberOfNodes(), PUGS_LAMBDA(const NodeId node_id) {
+        const auto& node_cell_list = node_to_cell_matrix[node_id];
 
-    NodeValue<Rd> shift_r{connectivity};
+        Rd mean_position(zero);
+        size_t number_of_neighbours = 0;
+        for (size_t i_cell = 0; i_cell < node_cell_list.size(); ++i_cell) {
+          const size_t i_cell_node = node_number_in_their_cells(node_id, i_cell);
 
-    int i_node_number = 0;
-    for (size_t i = 0; i < node_numbers_to_node_id.size(); ++i) {
-      const auto [node_number, node_id] = node_numbers_to_node_id[i];
-      while (i_node_number < node_number) {
-        for (size_t j = 0; j < Dimension; ++j) {
-          distribution(random_engine.engine());
+          const CellId cell_id       = node_cell_list[i_cell];
+          const auto& cell_node_list = cell_to_node_matrix[cell_id];
+          for (size_t i_node = 0; i_node < cell_node_list.size(); ++i_node) {
+            if (i_node != i_cell_node) {
+              const NodeId cell_node_id = cell_node_list[i_node];
+              mean_position += given_xr[cell_node_id];
+              number_of_neighbours++;
+            }
+          }
         }
-        ++i_node_number;
-      }
-
-      double max_delta = max_delta_xr[node_id];
-
-      Rd shift;
-      for (size_t i_component = 0; i_component < Dimension; ++i_component) {
-        shift[i_component] = max_delta * distribution(random_engine.engine());
-      }
-
-      shift_r[node_id] = shift;
-
-      ++i_node_number;
-    }
-
-    const int max_node_number =
-      parallel::allReduceMax(node_numbers_to_node_id[node_numbers_to_node_id.size() - 1].first);
-
-    // Advances random engine to preserve CPU random number generators synchronization
-    for (; i_node_number <= max_node_number; ++i_node_number) {
-      for (size_t j = 0; j < Dimension; ++j) {
-        distribution(random_engine.engine());
-      }
-    }
+        mean_position    = 1 / number_of_neighbours * mean_position;
+        shift_r[node_id] = mean_position - given_xr[node_id];
+        double nshift    = sqrt(dot(shift_r[node_id], shift_r[node_id]));
+        if (nshift > max_delta_xr[node_id]) {
+          shift_r[node_id] = max_delta_xr[node_id] / nshift * shift_r[node_id];
+        }
+      });
 
     this->_applyBC(shift_r);
 
@@ -226,8 +204,6 @@ class MeshSmootherHandler::MeshSmoother
     }
 #endif   // NDEBUG
 
-    Assert(isSynchronized(random_engine), "seed is not synchronized after mesh smoothation");
-
     return shift_r;
   }
 
-- 
GitLab