Skip to content
Snippets Groups Projects
Select Git revision
  • 6d7965846fd748bf411424bb757bbfa00386a464
  • develop default protected
  • feature/advection
  • feature/composite-scheme-other-fluxes
  • origin/stage/bouguettaia
  • save_clemence
  • feature/local-dt-fsi
  • feature/variational-hydro
  • feature/gmsh-reader
  • feature/reconstruction
  • feature/kinetic-schemes
  • feature/composite-scheme-sources
  • 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
  • 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_ItemValue.cpp

Blame
  • test_ItemValue.cpp 10.04 KiB
    #include <catch2/catch_test_macros.hpp>
    #include <catch2/matchers/catch_matchers_all.hpp>
    
    #include <MeshDataBaseForTests.hpp>
    #include <mesh/Connectivity.hpp>
    #include <mesh/ItemValue.hpp>
    #include <mesh/Mesh.hpp>
    #include <utils/Messenger.hpp>
    
    // clazy:excludeall=non-pod-global-static
    
    TEST_CASE("ItemValue", "[mesh]")
    {
      SECTION("default constructors")
      {
        REQUIRE_NOTHROW(NodeValue<int>{});
        REQUIRE_NOTHROW(EdgeValue<int>{});
        REQUIRE_NOTHROW(FaceValue<int>{});
        REQUIRE_NOTHROW(CellValue<int>{});
    
        REQUIRE(not NodeValue<int>{}.isBuilt());
        REQUIRE(not EdgeValue<int>{}.isBuilt());
        REQUIRE(not FaceValue<int>{}.isBuilt());
        REQUIRE(not CellValue<int>{}.isBuilt());
      }
    
      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();
    
            REQUIRE_NOTHROW(NodeValue<int>{connectivity});
            REQUIRE_NOTHROW(EdgeValue<int>{connectivity});
            REQUIRE_NOTHROW(FaceValue<int>{connectivity});
            REQUIRE_NOTHROW(CellValue<int>{connectivity});
    
            REQUIRE(NodeValue<int>{connectivity}.isBuilt());
            REQUIRE(EdgeValue<int>{connectivity}.isBuilt());
            REQUIRE(FaceValue<int>{connectivity}.isBuilt());
            REQUIRE(CellValue<int>{connectivity}.isBuilt());
    
            NodeValue<int> node_value{connectivity};
            EdgeValue<int> edge_value{connectivity};
            FaceValue<int> face_value{connectivity};
            CellValue<int> cell_value{connectivity};
    
            REQUIRE(edge_value.numberOfItems() == node_value.numberOfItems());
            REQUIRE(face_value.numberOfItems() == node_value.numberOfItems());
            REQUIRE(cell_value.numberOfItems() + 1 == node_value.numberOfItems());
          }
        }
      }
    
      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();
    
            REQUIRE_NOTHROW(NodeValue<int>{connectivity});
            REQUIRE_NOTHROW(EdgeValue<int>{connectivity});
            REQUIRE_NOTHROW(FaceValue<int>{connectivity});
            REQUIRE_NOTHROW(CellValue<int>{connectivity});
    
            REQUIRE(NodeValue<int>{connectivity}.isBuilt());
            REQUIRE(EdgeValue<int>{connectivity}.isBuilt());
            REQUIRE(FaceValue<int>{connectivity}.isBuilt());
            REQUIRE(CellValue<int>{connectivity}.isBuilt());
    
            EdgeValue<int> edge_value{connectivity};
            FaceValue<int> face_value{connectivity};
    
            REQUIRE(edge_value.numberOfItems() == face_value.numberOfItems());
          }
        }
      }
    
      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();
    
            REQUIRE_NOTHROW(NodeValue<int>{connectivity});
            REQUIRE_NOTHROW(EdgeValue<int>{connectivity});
            REQUIRE_NOTHROW(FaceValue<int>{connectivity});
            REQUIRE_NOTHROW(CellValue<int>{connectivity});
    
            REQUIRE(NodeValue<int>{connectivity}.isBuilt());
            REQUIRE(EdgeValue<int>{connectivity}.isBuilt());
            REQUIRE(FaceValue<int>{connectivity}.isBuilt());
            REQUIRE(CellValue<int>{connectivity}.isBuilt());
          }
        }
      }
    
      SECTION("set values from array")
      {
        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();
    
            Array<size_t> values{connectivity.numberOfCells()};
            for (size_t i = 0; i < values.size(); ++i) {
              values[i] = i;
            }
    
            CellValue<size_t> cell_value{connectivity, values};
    
            {
              bool is_same = true;
              for (CellId i_cell = 0; i_cell < mesh_3d->numberOfCells(); ++i_cell) {
                is_same &= (cell_value[i_cell] == i_cell);
              }
              REQUIRE(is_same);
              REQUIRE(&(cell_value[CellId{0}]) == &(values[0]));
            }
          }
        }
      }
    
      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();
    
            CellValue<int> cell_value{connectivity};
            cell_value.fill(parallel::rank());
    
            CellValue<const int> const_cell_value;
            const_cell_value = copy(cell_value);
    
            cell_value.fill(0);
    
            {
              bool is_same = true;
              for (CellId i_cell = 0; i_cell < mesh_3d->numberOfCells(); ++i_cell) {
                is_same &= (cell_value[i_cell] == 0);
              }
              REQUIRE(is_same);
            }
    
            {
              bool is_same = true;
              for (CellId i_cell = 0; i_cell < mesh_3d->numberOfCells(); ++i_cell) {
                is_same &= (const_cell_value[i_cell] == static_cast<std::int64_t>(parallel::rank()));
              }
              REQUIRE(is_same);
            }
          }
        }
      }
    
      SECTION("WeakItemValue")
      {
        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();
    
            WeakFaceValue<int> weak_face_value{connectivity};
            for (FaceId face_id = 0; face_id < mesh_2d->numberOfFaces(); ++face_id) {
              weak_face_value[face_id] = 2 * face_id + 1;
            }
    
            FaceValue<const int> face_value{weak_face_value};
    
            REQUIRE(face_value.connectivity_ptr() == weak_face_value.connectivity_ptr());
    
            FaceValue<int> copied_face_value = copy(weak_face_value);
            REQUIRE(copied_face_value.connectivity_ptr() == weak_face_value.connectivity_ptr());
    
            weak_face_value.fill(0);
            for (FaceId face_id = 0; face_id < mesh_2d->numberOfFaces(); ++face_id) {
              REQUIRE(face_value[face_id] == static_cast<int>(0));
            }
    
            {
              bool is_same = true;
              for (FaceId face_id = 0; face_id < mesh_2d->numberOfFaces(); ++face_id) {
                is_same &= (copied_face_value[face_id] == static_cast<int>(2 * face_id + 1));
              }
              REQUIRE(is_same);
            }
          }
        }
      }
    
      SECTION("output")
      {
        auto mesh = MeshDataBaseForTests::get().unordered1DMesh();
    
        Array<int> array{mesh->numberOfCells()};
        for (size_t i = 0; i < array.size(); ++i) {
          array[i] = 2 * i + 1;
        }
    
        CellValue<int> cell_value{mesh->connectivity(), array};
    
        std::ostringstream array_ost;
        array_ost << array;
        std::ostringstream cell_value_ost;
        cell_value_ost << cell_value;
        REQUIRE(array_ost.str() == cell_value_ost.str());
      }
    
    #ifndef NDEBUG
      SECTION("error")
      {
        SECTION("checking for build ItemValue")
        {
          CellValue<int> cell_value;
          REQUIRE_THROWS_WITH(cell_value[CellId{0}], "ItemValue is not built");
    
          FaceValue<int> face_value;
          REQUIRE_THROWS_WITH(face_value[FaceId{0}], "ItemValue is not built");
    
          EdgeValue<int> edge_value;
          REQUIRE_THROWS_WITH(edge_value[EdgeId{0}], "ItemValue is not built");
    
          NodeValue<int> node_value;
          REQUIRE_THROWS_WITH(node_value[NodeId{0}], "ItemValue is not built");
        }
    
        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();
    
              CellValue<int> cell_value{connectivity};
              CellId invalid_cell_id = connectivity.numberOfCells();
              REQUIRE_THROWS_WITH(cell_value[invalid_cell_id], "invalid item_id");
    
              FaceValue<int> face_value{connectivity};
              FaceId invalid_face_id = connectivity.numberOfFaces();
              REQUIRE_THROWS_WITH(face_value[invalid_face_id], "invalid item_id");
    
              EdgeValue<int> edge_value{connectivity};
              EdgeId invalid_edge_id = connectivity.numberOfEdges();
              REQUIRE_THROWS_WITH(edge_value[invalid_edge_id], "invalid item_id");
    
              NodeValue<int> node_value{connectivity};
              NodeId invalid_node_id = connectivity.numberOfNodes();
              REQUIRE_THROWS_WITH(node_value[invalid_node_id], "invalid item_id");
            }
          }
        }
    
        SECTION("set values from invalid array size")
        {
          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();
    
              Array<size_t> values{3 + connectivity.numberOfCells()};
              REQUIRE_THROWS_WITH(CellValue<size_t>(connectivity, values), "invalid values size");
            }
          }
        }
    
        SECTION("invalid copy_to")
        {
          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_2d = mesh_2d->connectivity();
    
              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_3d = mesh_3d->connectivity();
    
                  CellValue<int> cell_2d_value{connectivity_2d};
                  CellValue<int> cell_3d_value{connectivity_3d};
                  REQUIRE_THROWS_WITH(copy_to(cell_2d_value, cell_3d_value), "different connectivities");
                }
              }
            }
          }
        }
      }
    #endif   // NDEBUG
    }