diff --git a/src/scheme/ScalarNodalScheme.cpp b/src/scheme/ScalarNodalScheme.cpp
index c165eec6e1e111577424505708abb1de395c95bc..9c8e47dacb4f36cc2f002d7155093d9d780bc6dd 100644
--- a/src/scheme/ScalarNodalScheme.cpp
+++ b/src/scheme/ScalarNodalScheme.cpp
@@ -487,14 +487,23 @@ class ScalarNodalSchemeHandler::ScalarNodalScheme : public ScalarNodalSchemeHand
       NodeValue<TinyVector<Dimension>> compute_normal_base{mesh->connectivity()};
       compute_normal_base.fill(zero);
       for (NodeId node_id = 0; node_id < mesh->numberOfNodes(); ++node_id) {
-        const auto& node_to_face = node_to_face_matrix[node_id];
-        TinyMatrix<Dimension> A;
-        for (size_t i_face = 0; i_face < mesh->numberOfFaces(); ++i_face) {
-          FaceId face_id = node_to_face[i_face];
-          A(i_face, 0)   = nl[face_id][0] * mes_l[face_id];
-          A(i_face, 1)   = nl[face_id][1] * mes_l[face_id];
+        if (node_is_angle[node_id]) {
+          const auto& node_to_face = node_to_face_matrix[node_id];
+          TinyMatrix<Dimension> A  = zero;
+          for (size_t i_face = 0; i_face < node_to_face.size(); ++i_face) {
+            const FaceId face_id = node_to_face[i_face];
+            if (is_boundary_face[face_id]) {
+              if (A(0, 0) == 0) {
+                A(0, 0) = nl[face_id][0] * mes_l[face_id];
+                A(0, 1) = nl[face_id][1] * mes_l[face_id];
+              } else {
+                A(1, 0) = nl[face_id][0] * mes_l[face_id];
+                A(1, 1) = nl[face_id][1] * mes_l[face_id];
+              }
+            }
+          }
+          compute_normal_base[node_id] = inverse(A) * exterior_normal[node_id];
         }
-        compute_normal_base[node_id] = inverse(A) * exterior_normal[node_id];
       }
       return compute_normal_base;
     }();