Skip to content
Snippets Groups Projects
Select Git revision
  • 840a27f0dd2fc56de1ed670100a46b97d263529e
  • develop default protected
  • feature/variational-hydro
  • origin/stage/bouguettaia
  • feature/gmsh-reader
  • feature/reconstruction
  • save_clemence
  • feature/kinetic-schemes
  • feature/local-dt-fsi
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • feature/serraille
  • feature/composite-scheme
  • hyperplastic
  • feature/polynomials
  • feature/gks
  • feature/implicit-solver-o2
  • feature/coupling_module
  • feature/implicit-solver
  • feature/merge-local-dt-fsi
  • master protected
  • v0.5.0 protected
  • v0.4.1 protected
  • v0.4.0 protected
  • v0.3.0 protected
  • v0.2.0 protected
  • v0.1.0 protected
  • Kidder
  • v0.0.4 protected
  • v0.0.3 protected
  • v0.0.2 protected
  • v0 protected
  • v0.0.1 protected
33 results

test_SubItemValuePerItem.cpp

Blame
  • Stéphane Del Pino's avatar
    Stéphane Del Pino authored
    Quite a strange warning: suggested parenthesis in a Catch2 macro
    expansion
    840a27f0
    History
    test_SubItemValuePerItem.cpp 64.13 KiB
    #include <catch2/catch_test_macros.hpp>
    #include <catch2/matchers/catch_matchers_all.hpp>
    
    #include <MeshDataBaseForTests.hpp>
    #include <mesh/Connectivity.hpp>
    #include <mesh/Mesh.hpp>
    #include <mesh/SubItemValuePerItem.hpp>
    #include <utils/Messenger.hpp>
    
    // Instantiate to ensure full coverage is performed
    template class SubItemValuePerItem<size_t, NodeOfCell>;
    
    // clazy:excludeall=non-pod-global-static
    
    TEST_CASE("SubItemValuePerItem", "[mesh]")
    {
      SECTION("default constructors")
      {
        REQUIRE_NOTHROW(NodeValuePerEdge<int>{});
        REQUIRE_NOTHROW(NodeValuePerFace<int>{});
        REQUIRE_NOTHROW(NodeValuePerCell<int>{});
    
        REQUIRE_NOTHROW(EdgeValuePerNode<int>{});
        REQUIRE_NOTHROW(EdgeValuePerFace<int>{});
        REQUIRE_NOTHROW(EdgeValuePerCell<int>{});
    
        REQUIRE_NOTHROW(FaceValuePerNode<int>{});
        REQUIRE_NOTHROW(FaceValuePerEdge<int>{});
        REQUIRE_NOTHROW(FaceValuePerCell<int>{});
    
        REQUIRE_NOTHROW(CellValuePerNode<int>{});
        REQUIRE_NOTHROW(CellValuePerEdge<int>{});
        REQUIRE_NOTHROW(CellValuePerFace<int>{});
    
        REQUIRE(not NodeValuePerEdge<int>{}.isBuilt());
        REQUIRE(not NodeValuePerFace<int>{}.isBuilt());
        REQUIRE(not NodeValuePerCell<int>{}.isBuilt());
    
        REQUIRE(not EdgeValuePerNode<int>{}.isBuilt());
        REQUIRE(not EdgeValuePerFace<int>{}.isBuilt());
        REQUIRE(not EdgeValuePerCell<int>{}.isBuilt());
    
        REQUIRE(not FaceValuePerNode<int>{}.isBuilt());
        REQUIRE(not FaceValuePerEdge<int>{}.isBuilt());
        REQUIRE(not FaceValuePerCell<int>{}.isBuilt());
    
        REQUIRE(not CellValuePerNode<int>{}.isBuilt());
        REQUIRE(not CellValuePerEdge<int>{}.isBuilt());
        REQUIRE(not CellValuePerFace<int>{}.isBuilt());
      }
    
      SECTION("dimensions")
      {
        auto number_of_values = [](const auto& sub_item_value_per_item) -> size_t {
          using SubItemValuePerItemType = std::decay_t<decltype(sub_item_value_per_item)>;
          using ItemId                  = typename SubItemValuePerItemType::ItemId;
    
          size_t number = 0;
          for (ItemId item_id = 0; item_id < sub_item_value_per_item.numberOfItems(); ++item_id) {
            number += sub_item_value_per_item.numberOfSubValues(item_id);
          }
          return number;
        };
    
        auto check_same_memory = [](const auto& sub_item_value_per_item, auto array) {
          const bool same_size = (sub_item_value_per_item.numberOfValues() == array.size());
          REQUIRE(same_size);
          bool is_same = true;
          for (size_t i = 0; i < sub_item_value_per_item.numberOfValues(); ++i) {
            is_same &= (&(sub_item_value_per_item[i]) == &(array[i]));
          }
          return is_same;
        };
    
        SECTION("1D")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all1DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_1d = named_mesh.mesh();
    
              const Connectivity<1>& connectivity = mesh_1d->connectivity();
    
              SECTION("per cell")
              {
                NodeValuePerCell<int> node_value_per_cell{connectivity};
                REQUIRE(node_value_per_cell.numberOfItems() == connectivity.numberOfCells());
                const size_t nb_values = number_of_values(node_value_per_cell);
                REQUIRE(node_value_per_cell.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                NodeValuePerCell<int> node_value_per_cell_from_array{connectivity, array};
                REQUIRE(check_same_memory(node_value_per_cell_from_array, array));
    
                auto cell_to_node_matrix = connectivity.cellToNodeMatrix();
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &=
                      (cell_to_node_matrix[cell_id].size() == node_value_per_cell.numberOfSubValues(cell_id)) and
                      (node_value_per_cell.itemArray(cell_id).size() == node_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
    
                const NodeValuePerCell<const int> const_node_value_per_cell = node_value_per_cell;
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &= (const_node_value_per_cell.itemArray(cell_id).size() ==
                                   node_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
    
                EdgeValuePerCell<int> edge_value_per_cell{connectivity};
                REQUIRE(edge_value_per_cell.numberOfItems() == connectivity.numberOfCells());
                REQUIRE(edge_value_per_cell.numberOfValues() == number_of_values(edge_value_per_cell));
    
                auto cell_to_edge_matrix = connectivity.cellToEdgeMatrix();
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &= (cell_to_edge_matrix[cell_id].size() == edge_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
    
                FaceValuePerCell<int> face_value_per_cell{connectivity};
                REQUIRE(face_value_per_cell.numberOfItems() == connectivity.numberOfCells());
                REQUIRE(face_value_per_cell.numberOfValues() == number_of_values(face_value_per_cell));
    
                auto cell_to_face_matrix = connectivity.cellToFaceMatrix();
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &= (cell_to_face_matrix[cell_id].size() == face_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
              }
    
              SECTION("per face")
              {
                CellValuePerFace<int> cell_value_per_face{connectivity};
                REQUIRE(cell_value_per_face.numberOfItems() == connectivity.numberOfFaces());
                const size_t nb_values = number_of_values(cell_value_per_face);
                REQUIRE(cell_value_per_face.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                CellValuePerFace<int> cell_value_per_face_from_array{connectivity, array};
                REQUIRE(check_same_memory(cell_value_per_face_from_array, array));
    
                auto face_to_cell_matrix = connectivity.faceToCellMatrix();
                {
                  bool is_correct = true;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    is_correct &= (face_to_cell_matrix[face_id].size() == cell_value_per_face.numberOfSubValues(face_id));
                  }
                  REQUIRE(is_correct);
                }
              }
    
              SECTION("per edge")
              {
                CellValuePerEdge<int> cell_value_per_edge{connectivity};
                REQUIRE(cell_value_per_edge.numberOfItems() == connectivity.numberOfEdges());
                const size_t nb_values = number_of_values(cell_value_per_edge);
                REQUIRE(cell_value_per_edge.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                CellValuePerEdge<int> cell_value_per_edge_from_array{connectivity, array};
                REQUIRE(check_same_memory(cell_value_per_edge_from_array, array));
    
                auto edge_to_cell_matrix = connectivity.edgeToCellMatrix();
                {
                  bool is_correct = true;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    is_correct &= (edge_to_cell_matrix[edge_id].size() == cell_value_per_edge.numberOfSubValues(edge_id));
                  }
                  REQUIRE(is_correct);
                }
              }
    
              SECTION("per node")
              {
                CellValuePerNode<int> cell_value_per_node{connectivity};
                REQUIRE(cell_value_per_node.numberOfItems() == connectivity.numberOfNodes());
                const size_t nb_values = number_of_values(cell_value_per_node);
                REQUIRE(cell_value_per_node.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                CellValuePerNode<int> cell_value_per_node_from_array{connectivity, array};
                REQUIRE(check_same_memory(cell_value_per_node_from_array, array));
    
                auto node_to_cell_matrix = connectivity.nodeToCellMatrix();
                {
                  bool is_correct = true;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    is_correct &= (node_to_cell_matrix[node_id].size() == cell_value_per_node.numberOfSubValues(node_id));
                  }
                  REQUIRE(is_correct);
                }
              }
            }
          }
        }
    
        SECTION("2D")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all2DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_2d = named_mesh.mesh();
    
              const Connectivity<2>& connectivity = mesh_2d->connectivity();
    
              SECTION("per cell")
              {
                NodeValuePerCell<int> node_value_per_cell{connectivity};
                REQUIRE(node_value_per_cell.numberOfItems() == connectivity.numberOfCells());
                const size_t nb_values = number_of_values(node_value_per_cell);
                REQUIRE(node_value_per_cell.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                NodeValuePerCell<int> node_value_per_cell_from_array{connectivity, array};
                REQUIRE(check_same_memory(node_value_per_cell_from_array, array));
    
                auto cell_to_node_matrix = connectivity.cellToNodeMatrix();
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &= (cell_to_node_matrix[cell_id].size() == node_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
    
                EdgeValuePerCell<int> edge_value_per_cell{connectivity};
                REQUIRE(edge_value_per_cell.numberOfItems() == connectivity.numberOfCells());
                REQUIRE(edge_value_per_cell.numberOfValues() == number_of_values(edge_value_per_cell));
    
                auto cell_to_edge_matrix = connectivity.cellToEdgeMatrix();
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &= (cell_to_edge_matrix[cell_id].size() == edge_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
    
                FaceValuePerCell<int> face_value_per_cell{connectivity};
                REQUIRE(face_value_per_cell.numberOfItems() == connectivity.numberOfCells());
                REQUIRE(face_value_per_cell.numberOfValues() == number_of_values(face_value_per_cell));
    
                auto cell_to_face_matrix = connectivity.cellToFaceMatrix();
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &= (cell_to_face_matrix[cell_id].size() == face_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
              }
    
              SECTION("per face")
              {
                CellValuePerFace<int> cell_value_per_face{connectivity};
                REQUIRE(cell_value_per_face.numberOfItems() == connectivity.numberOfFaces());
                const size_t nb_values = number_of_values(cell_value_per_face);
                REQUIRE(cell_value_per_face.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                CellValuePerFace<int> cell_value_per_face_from_array{connectivity, array};
                REQUIRE(check_same_memory(cell_value_per_face_from_array, array));
    
                auto face_to_cell_matrix = connectivity.faceToCellMatrix();
                {
                  bool is_correct = true;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    is_correct &= (face_to_cell_matrix[face_id].size() == cell_value_per_face.numberOfSubValues(face_id));
                  }
                  REQUIRE(is_correct);
                }
    
                NodeValuePerFace<int> node_value_per_face{connectivity};
                REQUIRE(node_value_per_face.numberOfItems() == connectivity.numberOfFaces());
                REQUIRE(node_value_per_face.numberOfValues() == number_of_values(node_value_per_face));
    
                auto face_to_node_matrix = connectivity.faceToNodeMatrix();
                {
                  bool is_correct = true;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    is_correct &= (face_to_node_matrix[face_id].size() == node_value_per_face.numberOfSubValues(face_id));
                  }
                  REQUIRE(is_correct);
                }
              }
    
              SECTION("per edge")
              {
                CellValuePerEdge<int> cell_value_per_edge{connectivity};
                REQUIRE(cell_value_per_edge.numberOfItems() == connectivity.numberOfEdges());
                const size_t nb_values = number_of_values(cell_value_per_edge);
                REQUIRE(cell_value_per_edge.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                CellValuePerEdge<int> cell_value_per_edge_from_array{connectivity, array};
                REQUIRE(check_same_memory(cell_value_per_edge_from_array, array));
    
                auto edge_to_cell_matrix = connectivity.edgeToCellMatrix();
                {
                  bool is_correct = true;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    is_correct &= (edge_to_cell_matrix[edge_id].size() == cell_value_per_edge.numberOfSubValues(edge_id));
                  }
                  REQUIRE(is_correct);
                }
    
                NodeValuePerEdge<int> node_value_per_edge{connectivity};
                REQUIRE(node_value_per_edge.numberOfItems() == connectivity.numberOfEdges());
                REQUIRE(node_value_per_edge.numberOfValues() == number_of_values(node_value_per_edge));
    
                auto edge_to_node_matrix = connectivity.edgeToNodeMatrix();
                {
                  bool is_correct = true;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    is_correct &= (edge_to_node_matrix[edge_id].size() == node_value_per_edge.numberOfSubValues(edge_id));
                  }
                  REQUIRE(is_correct);
                }
              }
    
              SECTION("per node")
              {
                EdgeValuePerNode<int> edge_value_per_node{connectivity};
                REQUIRE(edge_value_per_node.numberOfItems() == connectivity.numberOfNodes());
                const size_t nb_values = number_of_values(edge_value_per_node);
                REQUIRE(edge_value_per_node.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                EdgeValuePerNode<int> cell_value_per_node_from_array{connectivity, array};
                REQUIRE(check_same_memory(cell_value_per_node_from_array, array));
    
                auto node_to_edge_matrix = connectivity.nodeToEdgeMatrix();
                {
                  bool is_correct = true;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    is_correct &= (node_to_edge_matrix[node_id].size() == edge_value_per_node.numberOfSubValues(node_id));
                  }
                  REQUIRE(is_correct);
                }
    
                FaceValuePerNode<int> face_value_per_node{connectivity};
                REQUIRE(face_value_per_node.numberOfItems() == connectivity.numberOfNodes());
                REQUIRE(face_value_per_node.numberOfValues() == number_of_values(face_value_per_node));
    
                auto node_to_face_matrix = connectivity.nodeToFaceMatrix();
                {
                  bool is_correct = true;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    is_correct &= (node_to_face_matrix[node_id].size() == face_value_per_node.numberOfSubValues(node_id));
                  }
                  REQUIRE(is_correct);
                }
    
                CellValuePerNode<int> cell_value_per_node{connectivity};
                REQUIRE(cell_value_per_node.numberOfItems() == connectivity.numberOfNodes());
                REQUIRE(cell_value_per_node.numberOfValues() == number_of_values(cell_value_per_node));
    
                auto node_to_cell_matrix = connectivity.nodeToCellMatrix();
                {
                  bool is_correct = true;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    is_correct &= (node_to_cell_matrix[node_id].size() == cell_value_per_node.numberOfSubValues(node_id));
                  }
                  REQUIRE(is_correct);
                }
              }
            }
          }
        }
    
        SECTION("3D")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all3DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_3d = named_mesh.mesh();
    
              const Connectivity<3>& connectivity = mesh_3d->connectivity();
    
              SECTION("per cell")
              {
                NodeValuePerCell<int> node_value_per_cell{connectivity};
                REQUIRE(node_value_per_cell.numberOfItems() == connectivity.numberOfCells());
                const size_t nb_values = number_of_values(node_value_per_cell);
                REQUIRE(node_value_per_cell.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                NodeValuePerCell<int> node_value_per_cell_from_array{connectivity, array};
                REQUIRE(check_same_memory(node_value_per_cell_from_array, array));
    
                auto cell_to_node_matrix = connectivity.cellToNodeMatrix();
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &= (cell_to_node_matrix[cell_id].size() == node_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
    
                EdgeValuePerCell<int> edge_value_per_cell{connectivity};
                REQUIRE(edge_value_per_cell.numberOfItems() == connectivity.numberOfCells());
                REQUIRE(edge_value_per_cell.numberOfValues() == number_of_values(edge_value_per_cell));
    
                auto cell_to_edge_matrix = connectivity.cellToEdgeMatrix();
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &= (cell_to_edge_matrix[cell_id].size() == edge_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
    
                FaceValuePerCell<int> face_value_per_cell{connectivity};
                REQUIRE(face_value_per_cell.numberOfItems() == connectivity.numberOfCells());
                REQUIRE(face_value_per_cell.numberOfValues() == number_of_values(face_value_per_cell));
    
                auto cell_to_face_matrix = connectivity.cellToFaceMatrix();
                {
                  bool is_correct = true;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    is_correct &= (cell_to_face_matrix[cell_id].size() == face_value_per_cell.numberOfSubValues(cell_id));
                  }
                  REQUIRE(is_correct);
                }
              }
    
              SECTION("per face")
              {
                CellValuePerFace<int> cell_value_per_face{connectivity};
                REQUIRE(cell_value_per_face.numberOfItems() == connectivity.numberOfFaces());
                const size_t nb_values = number_of_values(cell_value_per_face);
                REQUIRE(cell_value_per_face.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                CellValuePerFace<int> cell_value_per_face_from_array{connectivity, array};
                REQUIRE(check_same_memory(cell_value_per_face_from_array, array));
    
                auto face_to_cell_matrix = connectivity.faceToCellMatrix();
                {
                  bool is_correct = true;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    is_correct &= (face_to_cell_matrix[face_id].size() == cell_value_per_face.numberOfSubValues(face_id));
                  }
                  REQUIRE(is_correct);
                }
    
                EdgeValuePerFace<int> edge_value_per_face{connectivity};
                REQUIRE(edge_value_per_face.numberOfItems() == connectivity.numberOfFaces());
                REQUIRE(edge_value_per_face.numberOfValues() == number_of_values(edge_value_per_face));
    
                auto face_to_edge_matrix = connectivity.faceToEdgeMatrix();
                {
                  bool is_correct = true;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    is_correct &= (face_to_edge_matrix[face_id].size() == edge_value_per_face.numberOfSubValues(face_id));
                  }
                  REQUIRE(is_correct);
                }
    
                NodeValuePerFace<int> node_value_per_face{connectivity};
                REQUIRE(node_value_per_face.numberOfItems() == connectivity.numberOfFaces());
                REQUIRE(node_value_per_face.numberOfValues() == number_of_values(node_value_per_face));
    
                auto face_to_node_matrix = connectivity.faceToNodeMatrix();
                {
                  bool is_correct = true;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    is_correct &= (face_to_node_matrix[face_id].size() == node_value_per_face.numberOfSubValues(face_id));
                  }
                  REQUIRE(is_correct);
                }
              }
    
              SECTION("per edge")
              {
                CellValuePerEdge<int> cell_value_per_edge{connectivity};
                REQUIRE(cell_value_per_edge.numberOfItems() == connectivity.numberOfEdges());
                const size_t nb_values = number_of_values(cell_value_per_edge);
                REQUIRE(cell_value_per_edge.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                CellValuePerEdge<int> cell_value_per_edge_from_array{connectivity, array};
                REQUIRE(check_same_memory(cell_value_per_edge_from_array, array));
    
                auto edge_to_cell_matrix = connectivity.edgeToCellMatrix();
                {
                  bool is_correct = true;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    is_correct &= (edge_to_cell_matrix[edge_id].size() == cell_value_per_edge.numberOfSubValues(edge_id));
                  }
                  REQUIRE(is_correct);
                }
    
                FaceValuePerEdge<int> face_value_per_edge{connectivity};
                REQUIRE(face_value_per_edge.numberOfItems() == connectivity.numberOfEdges());
                REQUIRE(face_value_per_edge.numberOfValues() == number_of_values(face_value_per_edge));
    
                auto edge_to_face_matrix = connectivity.edgeToFaceMatrix();
                {
                  bool is_correct = true;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    is_correct &= (edge_to_face_matrix[edge_id].size() == face_value_per_edge.numberOfSubValues(edge_id));
                  }
                  REQUIRE(is_correct);
                }
    
                NodeValuePerEdge<int> node_value_per_edge{connectivity};
                REQUIRE(node_value_per_edge.numberOfItems() == connectivity.numberOfEdges());
                REQUIRE(node_value_per_edge.numberOfValues() == number_of_values(node_value_per_edge));
    
                auto edge_to_node_matrix = connectivity.edgeToNodeMatrix();
                {
                  bool is_correct = true;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    is_correct &= (edge_to_node_matrix[edge_id].size() == node_value_per_edge.numberOfSubValues(edge_id));
                  }
                  REQUIRE(is_correct);
                }
              }
    
              SECTION("per node")
              {
                EdgeValuePerNode<int> edge_value_per_node{connectivity};
                REQUIRE(edge_value_per_node.numberOfItems() == connectivity.numberOfNodes());
                const size_t nb_values = number_of_values(edge_value_per_node);
                REQUIRE(edge_value_per_node.numberOfValues() == nb_values);
    
                Array<int> array{nb_values};
                EdgeValuePerNode<int> cell_value_per_node_from_array{connectivity, array};
                REQUIRE(check_same_memory(cell_value_per_node_from_array, array));
    
                auto node_to_edge_matrix = connectivity.nodeToEdgeMatrix();
                {
                  bool is_correct = true;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    is_correct &= (node_to_edge_matrix[node_id].size() == edge_value_per_node.numberOfSubValues(node_id));
                  }
                  REQUIRE(is_correct);
                }
    
                FaceValuePerNode<int> face_value_per_node{connectivity};
                REQUIRE(face_value_per_node.numberOfItems() == connectivity.numberOfNodes());
                REQUIRE(face_value_per_node.numberOfValues() == number_of_values(face_value_per_node));
    
                auto node_to_face_matrix = connectivity.nodeToFaceMatrix();
                {
                  bool is_correct = true;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    is_correct &= (node_to_face_matrix[node_id].size() == face_value_per_node.numberOfSubValues(node_id));
                  }
                  REQUIRE(is_correct);
                }
    
                CellValuePerNode<int> cell_value_per_node{connectivity};
                REQUIRE(cell_value_per_node.numberOfItems() == connectivity.numberOfNodes());
                REQUIRE(cell_value_per_node.numberOfValues() == number_of_values(cell_value_per_node));
    
                auto node_to_cell_matrix = connectivity.nodeToCellMatrix();
                {
                  bool is_correct = true;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    is_correct &= (node_to_cell_matrix[node_id].size() == cell_value_per_node.numberOfSubValues(node_id));
                  }
                  REQUIRE(is_correct);
                }
              }
            }
          }
        }
      }
    
      SECTION("access functions")
      {
        SECTION("1D")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all1DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_1d = named_mesh.mesh();
    
              const Connectivity<1>& connectivity = mesh_1d->connectivity();
    
              SECTION("per cell")
              {
                {
                  NodeValuePerCell<int> node_value_per_cell{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    for (size_t i = 0; i < node_value_per_cell.numberOfSubValues(cell_id); ++i) {
                      is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell.itemArray(cell_id)[i]));
                      is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell(cell_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == node_value_per_cell.numberOfValues());
                }
    
                {
                  EdgeValuePerCell<int> edge_value_per_cell{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    for (size_t i = 0; i < edge_value_per_cell.numberOfSubValues(cell_id); ++i) {
                      is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell.itemArray(cell_id)[i]));
                      is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell(cell_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == edge_value_per_cell.numberOfValues());
                }
    
                {
                  FaceValuePerCell<int> face_value_per_cell{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    for (size_t i = 0; i < face_value_per_cell.numberOfSubValues(cell_id); ++i) {
                      is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell.itemArray(cell_id)[i]));
                      is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell(cell_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == face_value_per_cell.numberOfValues());
                }
              }
    
              SECTION("per face")
              {
                CellValuePerFace<int> cell_value_per_face{connectivity};
    
                bool is_valid  = true;
                size_t counter = 0;
                for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                  for (size_t i = 0; i < cell_value_per_face.numberOfSubValues(face_id); ++i) {
                    is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face.itemArray(face_id)[i]));
                    is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face(face_id, i)));
                    counter++;
                  }
                }
                REQUIRE(is_valid);
                REQUIRE(counter == cell_value_per_face.numberOfValues());
              }
    
              SECTION("per edge")
              {
                CellValuePerEdge<int> cell_value_per_edge{connectivity};
    
                bool is_valid  = true;
                size_t counter = 0;
                for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                  for (size_t i = 0; i < cell_value_per_edge.numberOfSubValues(edge_id); ++i) {
                    is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge.itemArray(edge_id)[i]));
                    is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge(edge_id, i)));
                    counter++;
                  }
                }
                REQUIRE(is_valid);
                REQUIRE(counter == cell_value_per_edge.numberOfValues());
              }
    
              SECTION("per node")
              {
                CellValuePerNode<int> cell_value_per_node{connectivity};
    
                bool is_valid  = true;
                size_t counter = 0;
                for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                  for (size_t i = 0; i < cell_value_per_node.numberOfSubValues(node_id); ++i) {
                    is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node.itemArray(node_id)[i]));
                    is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node(node_id, i)));
                    counter++;
                  }
                }
                REQUIRE(is_valid);
                REQUIRE(counter == cell_value_per_node.numberOfValues());
              }
            }
          }
        }
    
        SECTION("2D")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all2DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_2d = named_mesh.mesh();
    
              const Connectivity<2>& connectivity = mesh_2d->connectivity();
    
              SECTION("per cell")
              {
                {
                  NodeValuePerCell<int> node_value_per_cell{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    for (size_t i = 0; i < node_value_per_cell.numberOfSubValues(cell_id); ++i) {
                      is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell.itemArray(cell_id)[i]));
                      is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell(cell_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == node_value_per_cell.numberOfValues());
                }
    
                {
                  EdgeValuePerCell<int> edge_value_per_cell{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    for (size_t i = 0; i < edge_value_per_cell.numberOfSubValues(cell_id); ++i) {
                      is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell.itemArray(cell_id)[i]));
                      is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell(cell_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == edge_value_per_cell.numberOfValues());
                }
    
                {
                  FaceValuePerCell<int> face_value_per_cell{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    for (size_t i = 0; i < face_value_per_cell.numberOfSubValues(cell_id); ++i) {
                      is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell.itemArray(cell_id)[i]));
                      is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell(cell_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == face_value_per_cell.numberOfValues());
                }
              }
    
              SECTION("per face")
              {
                {
                  NodeValuePerFace<int> node_value_per_face{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    for (size_t i = 0; i < node_value_per_face.numberOfSubValues(face_id); ++i) {
                      is_valid &= (&(node_value_per_face[face_id][i]) == &(node_value_per_face.itemArray(face_id)[i]));
                      is_valid &= (&(node_value_per_face[face_id][i]) == &(node_value_per_face(face_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == node_value_per_face.numberOfValues());
                }
    
                {
                  CellValuePerFace<int> cell_value_per_face{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    for (size_t i = 0; i < cell_value_per_face.numberOfSubValues(face_id); ++i) {
                      is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face.itemArray(face_id)[i]));
                      is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face(face_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == cell_value_per_face.numberOfValues());
                }
              }
    
              SECTION("per edge")
              {
                {
                  NodeValuePerEdge<int> node_value_per_edge{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    for (size_t i = 0; i < node_value_per_edge.numberOfSubValues(edge_id); ++i) {
                      is_valid &= (&(node_value_per_edge[edge_id][i]) == &(node_value_per_edge.itemArray(edge_id)[i]));
                      is_valid &= (&(node_value_per_edge[edge_id][i]) == &(node_value_per_edge(edge_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == node_value_per_edge.numberOfValues());
                }
    
                {
                  CellValuePerEdge<int> cell_value_per_edge{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    for (size_t i = 0; i < cell_value_per_edge.numberOfSubValues(edge_id); ++i) {
                      is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge.itemArray(edge_id)[i]));
                      is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge(edge_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == cell_value_per_edge.numberOfValues());
                }
              }
    
              SECTION("per node")
              {
                {
                  EdgeValuePerNode<int> edge_value_per_node{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    for (size_t i = 0; i < edge_value_per_node.numberOfSubValues(node_id); ++i) {
                      is_valid &= (&(edge_value_per_node[node_id][i]) == &(edge_value_per_node.itemArray(node_id)[i]));
                      is_valid &= (&(edge_value_per_node[node_id][i]) == &(edge_value_per_node(node_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == edge_value_per_node.numberOfValues());
                }
    
                {
                  FaceValuePerNode<int> face_value_per_node{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    for (size_t i = 0; i < face_value_per_node.numberOfSubValues(node_id); ++i) {
                      is_valid &= (&(face_value_per_node[node_id][i]) == &(face_value_per_node.itemArray(node_id)[i]));
                      is_valid &= (&(face_value_per_node[node_id][i]) == &(face_value_per_node(node_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == face_value_per_node.numberOfValues());
                }
    
                {
                  CellValuePerNode<int> cell_value_per_node{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    for (size_t i = 0; i < cell_value_per_node.numberOfSubValues(node_id); ++i) {
                      is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node.itemArray(node_id)[i]));
                      is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node(node_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == cell_value_per_node.numberOfValues());
                }
              }
            }
          }
        }
    
        SECTION("3D")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all3DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_3d = named_mesh.mesh();
    
              const Connectivity<3>& connectivity = mesh_3d->connectivity();
    
              SECTION("per cell")
              {
                {
                  NodeValuePerCell<int> node_value_per_cell{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    for (size_t i = 0; i < node_value_per_cell.numberOfSubValues(cell_id); ++i) {
                      is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell.itemArray(cell_id)[i]));
                      is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell(cell_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == node_value_per_cell.numberOfValues());
                }
    
                {
                  EdgeValuePerCell<int> edge_value_per_cell{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    for (size_t i = 0; i < edge_value_per_cell.numberOfSubValues(cell_id); ++i) {
                      is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell.itemArray(cell_id)[i]));
                      is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell(cell_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == edge_value_per_cell.numberOfValues());
                }
    
                {
                  FaceValuePerCell<int> face_value_per_cell{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                    for (size_t i = 0; i < face_value_per_cell.numberOfSubValues(cell_id); ++i) {
                      is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell.itemArray(cell_id)[i]));
                      is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell(cell_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == face_value_per_cell.numberOfValues());
                }
              }
    
              SECTION("per face")
              {
                {
                  NodeValuePerFace<int> node_value_per_face{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    for (size_t i = 0; i < node_value_per_face.numberOfSubValues(face_id); ++i) {
                      is_valid &= (&(node_value_per_face[face_id][i]) == &(node_value_per_face.itemArray(face_id)[i]));
                      is_valid &= (&(node_value_per_face[face_id][i]) == &(node_value_per_face(face_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == node_value_per_face.numberOfValues());
                }
    
                {
                  EdgeValuePerFace<int> edge_value_per_face{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    for (size_t i = 0; i < edge_value_per_face.numberOfSubValues(face_id); ++i) {
                      is_valid &= (&(edge_value_per_face[face_id][i]) == &(edge_value_per_face.itemArray(face_id)[i]));
                      is_valid &= (&(edge_value_per_face[face_id][i]) == &(edge_value_per_face(face_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == edge_value_per_face.numberOfValues());
                }
    
                {
                  CellValuePerFace<int> cell_value_per_face{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                    for (size_t i = 0; i < cell_value_per_face.numberOfSubValues(face_id); ++i) {
                      is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face.itemArray(face_id)[i]));
                      is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face(face_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == cell_value_per_face.numberOfValues());
                }
              }
    
              SECTION("per edge")
              {
                {
                  NodeValuePerEdge<int> node_value_per_edge{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    for (size_t i = 0; i < node_value_per_edge.numberOfSubValues(edge_id); ++i) {
                      is_valid &= (&(node_value_per_edge[edge_id][i]) == &(node_value_per_edge.itemArray(edge_id)[i]));
                      is_valid &= (&(node_value_per_edge[edge_id][i]) == &(node_value_per_edge(edge_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == node_value_per_edge.numberOfValues());
                }
    
                {
                  FaceValuePerEdge<int> face_value_per_edge{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    for (size_t i = 0; i < face_value_per_edge.numberOfSubValues(edge_id); ++i) {
                      is_valid &= (&(face_value_per_edge[edge_id][i]) == &(face_value_per_edge.itemArray(edge_id)[i]));
                      is_valid &= (&(face_value_per_edge[edge_id][i]) == &(face_value_per_edge(edge_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == face_value_per_edge.numberOfValues());
                }
    
                {
                  CellValuePerEdge<int> cell_value_per_edge{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
                    for (size_t i = 0; i < cell_value_per_edge.numberOfSubValues(edge_id); ++i) {
                      is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge.itemArray(edge_id)[i]));
                      is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge(edge_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == cell_value_per_edge.numberOfValues());
                }
              }
    
              SECTION("per node")
              {
                {
                  EdgeValuePerNode<int> edge_value_per_node{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    for (size_t i = 0; i < edge_value_per_node.numberOfSubValues(node_id); ++i) {
                      is_valid &= (&(edge_value_per_node[node_id][i]) == &(edge_value_per_node.itemArray(node_id)[i]));
                      is_valid &= (&(edge_value_per_node[node_id][i]) == &(edge_value_per_node(node_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == edge_value_per_node.numberOfValues());
                }
    
                {
                  FaceValuePerNode<int> face_value_per_node{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    for (size_t i = 0; i < face_value_per_node.numberOfSubValues(node_id); ++i) {
                      is_valid &= (&(face_value_per_node[node_id][i]) == &(face_value_per_node.itemArray(node_id)[i]));
                      is_valid &= (&(face_value_per_node[node_id][i]) == &(face_value_per_node(node_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == face_value_per_node.numberOfValues());
                }
    
                {
                  CellValuePerNode<int> cell_value_per_node{connectivity};
    
                  bool is_valid  = true;
                  size_t counter = 0;
                  for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                    for (size_t i = 0; i < cell_value_per_node.numberOfSubValues(node_id); ++i) {
                      is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node.itemArray(node_id)[i]));
                      is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node(node_id, i)));
                      counter++;
                    }
                  }
                  REQUIRE(is_valid);
                  REQUIRE(counter == cell_value_per_node.numberOfValues());
                }
              }
            }
          }
        }
      }
    
      SECTION("array view")
      {
        SECTION("1D")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all1DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_1d = named_mesh.mesh();
    
              const Connectivity<1>& connectivity = mesh_1d->connectivity();
    
              EdgeValuePerCell<size_t> edge_values_per_cell{connectivity};
              {
                size_t value = 0;
                for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                  for (size_t i_edge = 0; i_edge < edge_values_per_cell.numberOfSubValues(cell_id); ++i_edge) {
                    edge_values_per_cell(cell_id, i_edge) = value++;
                  }
                }
              }
              {
                bool is_same = true;
                for (size_t i = 0; i < edge_values_per_cell.numberOfValues(); ++i) {
                  is_same &= (edge_values_per_cell[i] == i);
                }
                REQUIRE(is_same);
              }
    
              for (size_t i = 0; i < edge_values_per_cell.numberOfValues(); ++i) {
                edge_values_per_cell[i] = i * i + 1;
              }
              {
                bool is_same = true;
                size_t i     = 0;
                for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                  for (size_t i_edge = 0; i_edge < edge_values_per_cell.numberOfSubValues(cell_id); ++i_edge, ++i) {
                    is_same &= (edge_values_per_cell(cell_id, i_edge) == i * i + 1);
                  }
                }
                REQUIRE(is_same);
              }
            }
          }
        }
    
        SECTION("2D")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all2DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_2d = named_mesh.mesh();
    
              const Connectivity<2>& connectivity = mesh_2d->connectivity();
    
              CellValuePerFace<size_t> cell_values_per_face{connectivity};
              {
                size_t value = 0;
                for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                  for (size_t i_cell = 0; i_cell < cell_values_per_face.numberOfSubValues(face_id); ++i_cell) {
                    cell_values_per_face(face_id, i_cell) = value++;
                  }
                }
              }
              {
                bool is_same = true;
                for (size_t i = 0; i < cell_values_per_face.numberOfValues(); ++i) {
                  is_same &= (cell_values_per_face[i] == i);
                }
                REQUIRE(is_same);
              }
              for (size_t i = 0; i < cell_values_per_face.numberOfValues(); ++i) {
                cell_values_per_face[i] = 3 * i + 1;
              }
              {
                bool is_same = true;
                size_t i     = 0;
                for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
                  for (size_t i_cell = 0; i_cell < cell_values_per_face.numberOfSubValues(face_id); ++i_cell, ++i) {
                    is_same &= (cell_values_per_face(face_id, i_cell) == 3 * i + 1);
                  }
                }
                REQUIRE(is_same);
              }
            }
          }
        }
    
        SECTION("3D")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all3DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_3d = named_mesh.mesh();
    
              const Connectivity<3>& connectivity = mesh_3d->connectivity();
    
              FaceValuePerNode<size_t> face_values_per_node{connectivity};
              {
                size_t value = 0;
                for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                  for (size_t i_face = 0; i_face < face_values_per_node.numberOfSubValues(node_id); ++i_face) {
                    face_values_per_node.itemArray(node_id)[i_face] = value++;
                  }
                }
              }
              {
                bool is_same = true;
                for (size_t i = 0; i < face_values_per_node.numberOfValues(); ++i) {
                  is_same &= (face_values_per_node[i] == i);
                }
                REQUIRE(is_same);
              }
    
              for (size_t i = 0; i < face_values_per_node.numberOfValues(); ++i) {
                face_values_per_node[i] = 3 + i * i;
              }
              {
                bool is_same = true;
                size_t i     = 0;
                for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
                  for (size_t i_face = 0; i_face < face_values_per_node.numberOfSubValues(node_id); ++i_face, ++i) {
                    is_same &= (face_values_per_node.itemArray(node_id)[i_face] == 3 + i * i);
                  }
                }
                REQUIRE(is_same);
              }
            }
          }
        }
      }
    
      SECTION("copy")
      {
        std::array mesh_list = MeshDataBaseForTests::get().all3DMeshes();
    
        for (auto named_mesh : mesh_list) {
          SECTION(named_mesh.name())
          {
            auto mesh_3d = named_mesh.mesh();
    
            const Connectivity<3>& connectivity = mesh_3d->connectivity();
    
            SECTION("classic")
            {
              NodeValuePerCell<size_t> node_value_per_cell{connectivity};
    
              {
                size_t value = 0;
                for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                  for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) {
                    node_value_per_cell.itemArray(cell_id)[i_node] = value++;
                  }
                }
              }
    
              NodeValuePerCell<size_t> copy_node_value_per_cell = copy(node_value_per_cell);
    
              {
                bool is_same = true;
                for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) {
                  is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]);
                }
    
                REQUIRE(is_same);
              }
    
              {
                for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                  for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) {
                    node_value_per_cell.itemArray(cell_id)[i_node] = i_node;
                  }
                }
              }
    
              {
                bool is_same = true;
                for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) {
                  is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]);
                }
    
                REQUIRE(not is_same);
              }
            }
    
            SECTION("from weak")
            {
              WeakNodeValuePerCell<size_t> node_value_per_cell{connectivity};
    
              {
                size_t value = 0;
                for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                  for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) {
                    node_value_per_cell.itemArray(cell_id)[i_node] = value++;
                  }
                }
              }
    
              WeakNodeValuePerCell<const size_t> node_const_value_per_cell = node_value_per_cell;
              NodeValuePerCell<size_t> copy_node_value_per_cell            = copy(node_const_value_per_cell);
    
              {
                bool is_same = true;
                for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) {
                  is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]);
                }
    
                REQUIRE(is_same);
              }
    
              {
                for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
                  for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) {
                    node_value_per_cell.itemArray(cell_id)[i_node] = i_node;
                  }
                }
              }
    
              {
                bool is_same = true;
                for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) {
                  is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]);
                }
    
                REQUIRE(not is_same);
              }
            }
          }
        }
      }
    
      SECTION("WeakSubItemValuePerItem")
      {
        std::array mesh_list = MeshDataBaseForTests::get().all2DMeshes();
    
        for (auto named_mesh : mesh_list) {
          SECTION(named_mesh.name())
          {
            auto mesh_2d = named_mesh.mesh();
    
            const Connectivity<2>& connectivity = mesh_2d->connectivity();
    
            WeakFaceValuePerCell<int> weak_face_value_per_cell{connectivity};
    
            for (size_t i = 0; i < weak_face_value_per_cell.numberOfValues(); ++i) {
              weak_face_value_per_cell[i] = i;
            }
    
            FaceValuePerCell<const int> face_value_per_cell{weak_face_value_per_cell};
    
            REQUIRE(face_value_per_cell.connectivity_ptr() == weak_face_value_per_cell.connectivity_ptr());
    
            bool is_same = true;
            for (size_t i = 0; i < weak_face_value_per_cell.numberOfValues(); ++i) {
              is_same &= (face_value_per_cell[i] == weak_face_value_per_cell[i]);
            }
            REQUIRE(is_same);
          }
        }
      }
    
    #ifndef NDEBUG
      SECTION("error")
      {
        SECTION("checking for build SubItemValuePerItem")
        {
          CellValuePerNode<int> cell_value_per_node;
          REQUIRE_THROWS_WITH(cell_value_per_node[0], "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_node.itemArray(NodeId{0}), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_node[NodeId{0}], "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_node(NodeId{0}, 0), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_node.numberOfValues(), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_node.numberOfItems(), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_node.numberOfSubValues(NodeId{0}), "SubItemValuePerItem is not built");
    
          FaceValuePerCell<int> face_value_per_cell;
          REQUIRE_THROWS_WITH(face_value_per_cell[0], "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(face_value_per_cell.itemArray(CellId{0}), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(face_value_per_cell[CellId{0}], "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(face_value_per_cell(CellId{0}, 0), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(face_value_per_cell.numberOfValues(), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(face_value_per_cell.numberOfItems(), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(face_value_per_cell.numberOfSubValues(CellId{0}), "SubItemValuePerItem is not built");
    
          CellValuePerEdge<int> cell_value_per_edge;
          REQUIRE_THROWS_WITH(cell_value_per_edge[0], "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_edge.itemArray(EdgeId{0}), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_edge[EdgeId{0}], "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_edge(EdgeId{0}, 0), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_edge.numberOfValues(), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_edge.numberOfItems(), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(cell_value_per_edge.numberOfSubValues(EdgeId{0}), "SubItemValuePerItem is not built");
    
          NodeValuePerFace<int> node_value_per_face;
          REQUIRE_THROWS_WITH(node_value_per_face[0], "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(node_value_per_face.itemArray(FaceId{0}), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(node_value_per_face[FaceId{0}], "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(node_value_per_face(FaceId{0}, 0), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(node_value_per_face.numberOfValues(), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(node_value_per_face.numberOfItems(), "SubItemValuePerItem is not built");
          REQUIRE_THROWS_WITH(node_value_per_face.numberOfSubValues(FaceId{0}), "SubItemValuePerItem is not built");
        }
    
        SECTION("checking invalid array size in constructor")
        {
          auto mesh_3d = MeshDataBaseForTests::get().hybrid3DMesh();
    
          const Connectivity<3>& connectivity = mesh_3d->connectivity();
    
          {
            Array<int> array{connectivity.getMatrix(ItemType::node, ItemType::cell).numberOfValues() + 3};
            REQUIRE_THROWS_WITH(CellValuePerNode<int>(connectivity, array), "invalid size of provided values");
          }
    
          {
            Array<int> array{connectivity.getMatrix(ItemType::face, ItemType::edge).numberOfValues() + 3};
            REQUIRE_THROWS_WITH(EdgeValuePerFace<int>(connectivity, array), "invalid size of provided values");
          }
        }
    
        SECTION("checking for bounds violation")
        {
          std::array mesh_list = MeshDataBaseForTests::get().all3DMeshes();
    
          for (auto named_mesh : mesh_list) {
            SECTION(named_mesh.name())
            {
              auto mesh_3d = named_mesh.mesh();
    
              const Connectivity<3>& connectivity = mesh_3d->connectivity();
    
              CellValuePerFace<int> cell_value_per_face{connectivity};
              {
                FaceId invalid_face_id = connectivity.numberOfFaces();
                REQUIRE_THROWS_WITH(cell_value_per_face(invalid_face_id, 0), "invalid item_id");
                REQUIRE_THROWS_WITH(cell_value_per_face[invalid_face_id], "invalid item_id");
              }
              if (connectivity.numberOfFaces() > 0) {
                FaceId face_id          = 0;
                const auto& cell_values = cell_value_per_face.itemArray(face_id);
                REQUIRE_THROWS_WITH(cell_value_per_face(face_id, cell_values.size()), "invalid index");
                REQUIRE_THROWS_WITH(cell_values[cell_values.size()], "invalid index");
                REQUIRE_THROWS_WITH(cell_value_per_face.itemArray(face_id)[cell_values.size()] = 2, "invalid index");
                REQUIRE_THROWS_WITH(cell_value_per_face[face_id][cell_values.size()] = 2, "invalid index");
              }
    
              FaceValuePerNode<int> face_value_per_node{connectivity};
              {
                NodeId invalid_node_id = connectivity.numberOfNodes();
                REQUIRE_THROWS_WITH(face_value_per_node(invalid_node_id, 0), "invalid item_id");
                REQUIRE_THROWS_WITH(face_value_per_node[invalid_node_id], "invalid item_id");
              }
              if (connectivity.numberOfNodes() > 0) {
                NodeId node_id          = 0;
                const auto& face_values = face_value_per_node.itemArray(node_id);
                REQUIRE_THROWS_WITH(face_value_per_node(node_id, face_values.size()), "invalid index");
                REQUIRE_THROWS_WITH(face_values[face_values.size()], "invalid index");
                REQUIRE_THROWS_WITH(face_value_per_node.itemArray(node_id)[face_values.size()] = 2, "invalid index");
                REQUIRE_THROWS_WITH(face_value_per_node[node_id][face_values.size()] = 2, "invalid index");
              }
    
              EdgeValuePerCell<int> edge_value_per_cell{connectivity};
              {
                CellId invalid_cell_id = connectivity.numberOfCells();
                REQUIRE_THROWS_WITH(edge_value_per_cell(invalid_cell_id, 0), "invalid item_id");
                REQUIRE_THROWS_WITH(edge_value_per_cell[invalid_cell_id], "invalid item_id");
              }
              if (connectivity.numberOfCells() > 0) {
                CellId cell_id          = 0;
                const auto& edge_values = edge_value_per_cell.itemArray(cell_id);
                REQUIRE_THROWS_WITH(edge_value_per_cell(cell_id, edge_values.size()), "invalid index");
                REQUIRE_THROWS_WITH(edge_values[edge_values.size()], "invalid index");
                REQUIRE_THROWS_WITH(edge_value_per_cell.itemArray(cell_id)[edge_values.size()] = 2, "invalid index");
                REQUIRE_THROWS_WITH(edge_value_per_cell[cell_id][edge_values.size()] = 2, "invalid index");
              }
    
              NodeValuePerEdge<int> node_value_per_edge{connectivity};
              {
                EdgeId invalid_edge_id = connectivity.numberOfEdges();
                REQUIRE_THROWS_WITH(node_value_per_edge(invalid_edge_id, 0), "invalid item_id");
                REQUIRE_THROWS_WITH(node_value_per_edge[invalid_edge_id], "invalid item_id");
              }
              if (connectivity.numberOfEdges() > 0) {
                EdgeId edge_id          = 0;
                const auto& node_values = node_value_per_edge.itemArray(edge_id);
                REQUIRE_THROWS_WITH(node_value_per_edge(edge_id, node_values.size()), "invalid index");
                REQUIRE_THROWS_WITH(node_values[node_values.size()], "invalid index");
                REQUIRE_THROWS_WITH(node_value_per_edge.itemArray(edge_id)[node_values.size()] = 2, "invalid index");
                REQUIRE_THROWS_WITH(node_value_per_edge[edge_id][node_values.size()] = 2, "invalid index");
              }
            }
          }
        }
      }
    #endif   // NDEBUG
    }