Skip to content
Snippets Groups Projects
Select Git revision
  • 6a9f3e72ac873cacaa2ecfe5e980a9141f548239
  • develop default protected
  • save_clemence
  • feature/composite-scheme-other-fluxes
  • feature/advection
  • origin/stage/bouguettaia
  • 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_DiamondDualMeshBuilder.cpp

Blame
  • test_DiamondDualMeshBuilder.cpp 5.82 KiB
    #include <catch2/catch_test_macros.hpp>
    #include <catch2/matchers/catch_matchers_all.hpp>
    
    #include <MeshDataBaseForTests.hpp>
    #include <mesh/DualMeshManager.hpp>
    #include <mesh/MeshData.hpp>
    #include <mesh/MeshDataManager.hpp>
    
    #include <mesh/Connectivity.hpp>
    #include <mesh/ItemValueUtils.hpp>
    #include <mesh/Mesh.hpp>
    
    // clazy:excludeall=non-pod-global-static
    
    TEST_CASE("DiamondDualMeshBuilder", "[mesh]")
    {
      SECTION("2D")
      {
        constexpr static size_t Dimension = 2;
    
        using ConnectivityType = Connectivity<Dimension>;
        using MeshType         = Mesh<ConnectivityType>;
    
        std::shared_ptr p_mesh      = MeshDataBaseForTests::get().hybrid2DMesh();
        const MeshType& primal_mesh = *p_mesh;
    
        REQUIRE(primal_mesh.numberOfNodes() == 53);
        REQUIRE(primal_mesh.numberOfFaces() == 110);
        REQUIRE(primal_mesh.numberOfCells() == 58);
    
        std::shared_ptr p_diamond_dual_mesh = DualMeshManager::instance().getDiamondDualMesh(primal_mesh);
        const MeshType& dual_mesh           = *p_diamond_dual_mesh;
    
        REQUIRE(dual_mesh.numberOfNodes() == 111);
        REQUIRE(dual_mesh.numberOfFaces() == 220);
        REQUIRE(dual_mesh.numberOfCells() == 110);
    
        auto dual_cell_volume = MeshDataManager::instance().getMeshData(dual_mesh).Vj();
    
        REQUIRE(sum(dual_cell_volume) == Catch::Approx(2));
    
        auto coord_comp = [](const TinyVector<Dimension>& a, const TinyVector<Dimension>& b) -> bool {
          return (a[0] < b[0]) or ((a[0] == b[0]) and (a[1] < b[1]));
        };
    
        auto dual_cell_to_node   = dual_mesh.connectivity().cellToNodeMatrix();
        auto primal_face_to_node = primal_mesh.connectivity().faceToNodeMatrix();
        auto primal_face_to_cell = primal_mesh.connectivity().faceToCellMatrix();
    
        auto dual_xr   = dual_mesh.xr();
        auto primal_xr = primal_mesh.xr();
        auto primal_xj = MeshDataManager::instance().getMeshData(primal_mesh).xj();
    
        using CoordSet = std::set<TinyVector<Dimension>,
                                  std::function<bool(const TinyVector<Dimension>& a, const TinyVector<Dimension>& b)>>;
    
        CellId dual_cell_id   = 0;
        FaceId primal_face_id = 0;
        for (; dual_cell_id < dual_mesh.numberOfCells(); ++dual_cell_id, ++primal_face_id) {
          CoordSet dual_cell_node_coords{coord_comp};
          {
            auto dual_cell_node_list = dual_cell_to_node[dual_cell_id];
            for (size_t i_node = 0; i_node < dual_cell_node_list.size(); ++i_node) {
              dual_cell_node_coords.insert(dual_xr[dual_cell_node_list[i_node]]);
            }
          }
    
          CoordSet primal_coords{coord_comp};
          {
            auto primal_face_node_list = primal_face_to_node[primal_face_id];
            for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) {
              primal_coords.insert(primal_xr[primal_face_node_list[i_node]]);
            }
            auto primal_face_cell_list = primal_face_to_cell[primal_face_id];
            for (size_t i_cell = 0; i_cell < primal_face_cell_list.size(); ++i_cell) {
              primal_coords.insert(primal_xj[primal_face_cell_list[i_cell]]);
            }
          }
    
          REQUIRE(primal_coords == dual_cell_node_coords);
        }
      }
    
      SECTION("3D")
      {
        constexpr static size_t Dimension = 3;
    
        using ConnectivityType = Connectivity<Dimension>;
        using MeshType         = Mesh<ConnectivityType>;
    
        std::shared_ptr p_mesh      = MeshDataBaseForTests::get().hybrid3DMesh();
        const MeshType& primal_mesh = *p_mesh;
    
        REQUIRE(primal_mesh.numberOfNodes() == 132);
        REQUIRE(primal_mesh.numberOfEdges() == 452);
        REQUIRE(primal_mesh.numberOfFaces() == 520);
        REQUIRE(primal_mesh.numberOfCells() == 199);
    
        std::shared_ptr p_diamond_dual_mesh = DualMeshManager::instance().getDiamondDualMesh(primal_mesh);
        const MeshType& dual_mesh           = *p_diamond_dual_mesh;
    
        REQUIRE(dual_mesh.numberOfNodes() == 331);
        REQUIRE(dual_mesh.numberOfEdges() == 1461);
        REQUIRE(dual_mesh.numberOfFaces() == 1651);
        REQUIRE(dual_mesh.numberOfCells() == 520);
    
        auto dual_cell_volume = MeshDataManager::instance().getMeshData(dual_mesh).Vj();
    
        REQUIRE(sum(dual_cell_volume) == Catch::Approx(2));
    
        auto coord_comp = [](const TinyVector<Dimension>& a, const TinyVector<Dimension>& b) -> bool {
          return (a[0] < b[0]) or ((a[0] == b[0]) and (a[1] < b[1])) or
                 ((a[0] == b[0]) and (a[1] == b[1]) and (a[2] < b[2]));
        };
    
        auto dual_cell_to_node   = dual_mesh.connectivity().cellToNodeMatrix();
        auto primal_face_to_node = primal_mesh.connectivity().faceToNodeMatrix();
        auto primal_face_to_cell = primal_mesh.connectivity().faceToCellMatrix();
    
        auto dual_xr   = dual_mesh.xr();
        auto primal_xr = primal_mesh.xr();
        auto primal_xj = MeshDataManager::instance().getMeshData(primal_mesh).xj();
    
        using CoordSet = std::set<TinyVector<Dimension>,
                                  std::function<bool(const TinyVector<Dimension>& a, const TinyVector<Dimension>& b)>>;
    
        CellId dual_cell_id   = 0;
        FaceId primal_face_id = 0;
        for (; dual_cell_id < dual_mesh.numberOfCells(); ++dual_cell_id, ++primal_face_id) {
          CoordSet dual_cell_node_coords{coord_comp};
          {
            auto dual_cell_node_list = dual_cell_to_node[dual_cell_id];
            for (size_t i_node = 0; i_node < dual_cell_node_list.size(); ++i_node) {
              dual_cell_node_coords.insert(dual_xr[dual_cell_node_list[i_node]]);
            }
          }
    
          CoordSet primal_coords{coord_comp};
          {
            auto primal_face_node_list = primal_face_to_node[primal_face_id];
            for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) {
              primal_coords.insert(primal_xr[primal_face_node_list[i_node]]);
            }
            auto primal_face_cell_list = primal_face_to_cell[primal_face_id];
            for (size_t i_cell = 0; i_cell < primal_face_cell_list.size(); ++i_cell) {
              primal_coords.insert(primal_xj[primal_face_cell_list[i_cell]]);
            }
          }
    
          REQUIRE(primal_coords == dual_cell_node_coords);
        }
      }
    }