From b864ac170cc7cfd37b88f84d80eebfa66466d6db Mon Sep 17 00:00:00 2001
From: LABOURASSE Emmanuel <labourassee@gmail.com>
Date: Fri, 23 Oct 2020 16:24:39 +0200
Subject: [PATCH] some geometrical improvements in Elasticity(3D) and more
 cleaning for Heat

---
 .../algorithms/ElasticityDiamondAlgorithm.cpp | 140 ++++++++++++------
 .../algorithms/HeatDiamondAlgorithm.cpp       |   8 -
 2 files changed, 92 insertions(+), 56 deletions(-)

diff --git a/src/language/algorithms/ElasticityDiamondAlgorithm.cpp b/src/language/algorithms/ElasticityDiamondAlgorithm.cpp
index 949397d46..0ddfa7774 100644
--- a/src/language/algorithms/ElasticityDiamondAlgorithm.cpp
+++ b/src/language/algorithms/ElasticityDiamondAlgorithm.cpp
@@ -422,36 +422,7 @@ ElasticityDiamondScheme<Dimension>::ElasticityDiamondScheme(
         return compute_mes_j;
       }();
 
-      const CellValue<const double> primal_Vj = mesh_data.Vj();
-
-      FaceValue<const double> alpha_lambda_l = [&] {
-        CellValue<double> alpha_j{diamond_mesh->connectivity()};
-
-        parallel_for(
-          diamond_mesh->numberOfCells(), PUGS_LAMBDA(CellId diamond_cell_id) {
-            alpha_j[diamond_cell_id] =
-              dual_mes_l_j[diamond_cell_id] * dual_lambdaj[diamond_cell_id] / dual_Vj[diamond_cell_id];
-          });
-
-        FaceValue<double> computed_alpha_l{mesh->connectivity()};
-        mapper->fromDualCell(alpha_j, computed_alpha_l);
-        return computed_alpha_l;
-      }();
-
-      FaceValue<const double> alpha_mu_l = [&] {
-        CellValue<double> alpha_j{diamond_mesh->connectivity()};
-
-        parallel_for(
-          diamond_mesh->numberOfCells(), PUGS_LAMBDA(CellId diamond_cell_id) {
-            alpha_j[diamond_cell_id] =
-              dual_mes_l_j[diamond_cell_id] * dual_muj[diamond_cell_id] / dual_Vj[diamond_cell_id];
-          });
-
-        FaceValue<double> computed_alpha_l{mesh->connectivity()};
-        mapper->fromDualCell(alpha_j, computed_alpha_l);
-        return computed_alpha_l;
-      }();
-
+      const CellValue<const double> primal_Vj   = mesh_data.Vj();
       FaceValue<const CellId> face_dual_cell_id = [=]() {
         FaceValue<CellId> computed_face_dual_cell_id{mesh->connectivity()};
         CellValue<CellId> dual_cell_id{diamond_mesh->connectivity()};
@@ -479,24 +450,100 @@ ElasticityDiamondScheme<Dimension>::ElasticityDiamondScheme(
         return computed_dual_node_primal_node_id;
       }();
 
+      CellValue<NodeId> primal_cell_dual_node_id = [=]() {
+        CellValue<NodeId> cell_id{mesh->connectivity()};
+        NodeValue<NodeId> node_ignored_id{mesh->connectivity()};
+        node_ignored_id.fill(NodeId{std::numeric_limits<unsigned int>::max()});
+
+        NodeValue<NodeId> dual_node_id{diamond_mesh->connectivity()};
+
+        parallel_for(
+          diamond_mesh->numberOfNodes(), PUGS_LAMBDA(NodeId node_id) { dual_node_id[node_id] = node_id; });
+
+        CellValue<NodeId> computed_primal_cell_dual_node_id{mesh->connectivity()};
+
+        mapper->fromDualNode(dual_node_id, node_ignored_id, cell_id);
+
+        return cell_id;
+      }();
+      const auto& dual_Cjr                     = diamond_mesh_data.Cjr();
+      FaceValue<TinyVector<Dimension>> dualClj = [&] {
+        FaceValue<TinyVector<Dimension>> computedClj{mesh->connectivity()};
+        const auto& dual_node_to_cell_matrix = diamond_mesh->connectivity().nodeToCellMatrix();
+        const auto& dual_cell_to_node_matrix = diamond_mesh->connectivity().cellToNodeMatrix();
+        parallel_for(
+          mesh->numberOfFaces(), PUGS_LAMBDA(FaceId face_id) {
+            const auto& primal_face_to_cell = face_to_cell_matrix[face_id];
+            for (size_t i = 0; i < primal_face_to_cell.size(); i++) {
+              CellId cell_id            = primal_face_to_cell[i];
+              const NodeId dual_node_id = primal_cell_dual_node_id[cell_id];
+              for (size_t i_dual_cell = 0; i_dual_cell < dual_node_to_cell_matrix[dual_node_id].size(); i_dual_cell++) {
+                const CellId dual_cell_id = dual_node_to_cell_matrix[dual_node_id][i_dual_cell];
+                if (face_dual_cell_id[face_id] == dual_cell_id) {
+                  for (size_t i_dual_node = 0; i_dual_node < dual_cell_to_node_matrix[dual_cell_id].size();
+                       i_dual_node++) {
+                    const NodeId final_dual_node_id = dual_cell_to_node_matrix[dual_cell_id][i_dual_node];
+                    if (final_dual_node_id == dual_node_id) {
+                      computedClj[face_id] = dual_Cjr(dual_cell_id, i_dual_node);
+                    }
+                  }
+                }
+              }
+            }
+          });
+        return computedClj;
+      }();
+
+      FaceValue<TinyVector<Dimension>> nlj = [&] {
+        FaceValue<TinyVector<Dimension>> computedNlj{mesh->connectivity()};
+        parallel_for(
+          mesh->numberOfFaces(),
+          PUGS_LAMBDA(FaceId face_id) { computedNlj[face_id] = 1. / l2Norm(dualClj[face_id]) * dualClj[face_id]; });
+        return computedNlj;
+      }();
+
+      FaceValue<const double> alpha_lambda_l = [&] {
+        CellValue<double> alpha_j{diamond_mesh->connectivity()};
+
+        parallel_for(
+          diamond_mesh->numberOfCells(), PUGS_LAMBDA(CellId diamond_cell_id) {
+            alpha_j[diamond_cell_id] = dual_lambdaj[diamond_cell_id] / dual_Vj[diamond_cell_id];
+          });
+
+        FaceValue<double> computed_alpha_l{mesh->connectivity()};
+        mapper->fromDualCell(alpha_j, computed_alpha_l);
+        return computed_alpha_l;
+      }();
+
+      FaceValue<const double> alpha_mu_l = [&] {
+        CellValue<double> alpha_j{diamond_mesh->connectivity()};
+
+        parallel_for(
+          diamond_mesh->numberOfCells(), PUGS_LAMBDA(CellId diamond_cell_id) {
+            alpha_j[diamond_cell_id] = dual_muj[diamond_cell_id] / dual_Vj[diamond_cell_id];
+          });
+
+        FaceValue<double> computed_alpha_l{mesh->connectivity()};
+        mapper->fromDualCell(alpha_j, computed_alpha_l);
+        return computed_alpha_l;
+      }();
+
       TinyMatrix<Dimension, double> eye = identity;
 
-      const auto& primal_face_cell_is_reversed      = mesh->connectivity().cellFaceIsReversed();
-      const auto& face_local_numbers_in_their_cells = mesh->connectivity().faceLocalNumbersInTheirCells();
       SparseMatrixDescriptor S{number_of_dof * Dimension};
       for (FaceId face_id = 0; face_id < mesh->numberOfFaces(); ++face_id) {
-        const double beta_mu_l          = (1. / Dimension) * alpha_mu_l[face_id] * mes_l[face_id];
-        const double beta_lambda_l      = (1. / Dimension) * alpha_lambda_l[face_id] * mes_l[face_id];
+        const double beta_mu_l          = l2Norm(dualClj[face_id]) * alpha_mu_l[face_id] * mes_l[face_id];
+        const double beta_lambda_l      = l2Norm(dualClj[face_id]) * alpha_lambda_l[face_id] * mes_l[face_id];
         const auto& primal_face_to_cell = face_to_cell_matrix[face_id];
         for (size_t i_cell = 0; i_cell < primal_face_to_cell.size(); ++i_cell) {
-          const CellId i_id = primal_face_to_cell[i_cell];
-          const bool is_face_reversed_for_cell_i =
-            primal_face_cell_is_reversed(i_id, face_local_numbers_in_their_cells(face_id, i_cell));
+          const CellId i_id                      = primal_face_to_cell[i_cell];
+          const bool is_face_reversed_for_cell_i = ((dualClj[face_id], xl[face_id] - xj[i_id]) < 0);
+
           const TinyVector<Dimension> nil = [&] {
             if (is_face_reversed_for_cell_i) {
-              return -primal_nlr(face_id, 0);
+              return -nlj[face_id];
             } else {
-              return primal_nlr(face_id, 0);
+              return nlj[face_id];
             }
           }();
           for (size_t j_cell = 0; j_cell < primal_face_to_cell.size(); ++j_cell) {
@@ -531,27 +578,24 @@ ElasticityDiamondScheme<Dimension>::ElasticityDiamondScheme(
         }
       }
 
-      const auto& dual_Cjr                   = diamond_mesh_data.Cjr();
       const auto& dual_cell_to_node_matrix   = diamond_mesh->connectivity().cellToNodeMatrix();
       const auto& primal_node_to_cell_matrix = mesh->connectivity().nodeToCellMatrix();
       for (FaceId face_id = 0; face_id < mesh->numberOfFaces(); ++face_id) {
-        const double alpha_mu_face_id     = alpha_mu_l[face_id];
-        const double alpha_lambda_face_id = alpha_lambda_l[face_id];
+        const double alpha_mu_face_id     = mes_l[face_id] * alpha_mu_l[face_id];
+        const double alpha_lambda_face_id = mes_l[face_id] * alpha_lambda_l[face_id];
 
         for (size_t i_face_cell = 0; i_face_cell < face_to_cell_matrix[face_id].size(); ++i_face_cell) {
-          CellId i_id = face_to_cell_matrix[face_id][i_face_cell];
-          const bool is_face_reversed_for_cell_i =
-            primal_face_cell_is_reversed(i_id, face_local_numbers_in_their_cells(face_id, i_face_cell));
+          CellId i_id                            = face_to_cell_matrix[face_id][i_face_cell];
+          const bool is_face_reversed_for_cell_i = ((dualClj[face_id], xl[face_id] - xj[i_id]) < 0);
 
           for (size_t i_node = 0; i_node < primal_face_to_node_matrix[face_id].size(); ++i_node) {
             NodeId node_id = primal_face_to_node_matrix[face_id][i_node];
 
-            //            if (not primal_node_is_on_boundary[node_id]) {
             const TinyVector<Dimension> nil = [&] {
               if (is_face_reversed_for_cell_i) {
-                return -primal_nlr(face_id, i_node);
+                return -nlj[face_id];
               } else {
-                return primal_nlr(face_id, i_node);
+                return nlj[face_id];
               }
             }();
 
diff --git a/src/language/algorithms/HeatDiamondAlgorithm.cpp b/src/language/algorithms/HeatDiamondAlgorithm.cpp
index 3a30d0485..5f66eb48e 100644
--- a/src/language/algorithms/HeatDiamondAlgorithm.cpp
+++ b/src/language/algorithms/HeatDiamondAlgorithm.cpp
@@ -514,9 +514,6 @@ HeatDiamondScheme<Dimension>::HeatDiamondScheme(
 
       const auto& dual_cell_to_node_matrix = diamond_mesh->connectivity().cellToNodeMatrix();
 
-      const NodeValuePerFace<const TinyVector<Dimension>> primal_nlr = mesh_data.nlr();
-      // const auto& primal_face_cell_is_reversed                       = mesh->connectivity().cellFaceIsReversed();
-      // const auto& face_local_numbers_in_their_cells = mesh->connectivity().faceLocalNumbersInTheirCells();
       const auto& primal_node_to_cell_matrix = mesh->connectivity().nodeToCellMatrix();
       for (FaceId face_id = 0; face_id < mesh->numberOfFaces(); ++face_id) {
         const double alpha_face_id = mes_l[face_id] * alpha_l[face_id];
@@ -524,17 +521,12 @@ HeatDiamondScheme<Dimension>::HeatDiamondScheme(
         for (size_t i_face_cell = 0; i_face_cell < face_to_cell_matrix[face_id].size(); ++i_face_cell) {
           CellId i_id                            = face_to_cell_matrix[face_id][i_face_cell];
           const bool is_face_reversed_for_cell_i = ((dualClj[face_id], xl[face_id] - xj[i_id]) < 0);
-          //            primal_face_cell_is_reversed(i_id, face_local_numbers_in_their_cells(face_id, i_face_cell));
 
           for (size_t i_node = 0; i_node < primal_face_to_node_matrix[face_id].size(); ++i_node) {
             NodeId node_id = primal_face_to_node_matrix[face_id][i_node];
 
             const TinyVector<Dimension> nil = [&] {
               if (is_face_reversed_for_cell_i) {
-                //   return -primal_nlr(face_id, i_node);
-                // } else {
-                //   return primal_nlr(face_id, i_node);
-                // }
                 return -nlj[face_id];
               } else {
                 return nlj[face_id];
-- 
GitLab