From 9aeed539dedb40f4e2bda8b5c39d8b4c71f1cf7a Mon Sep 17 00:00:00 2001 From: sdcm Date: Fri, 2 May 2025 14:30:08 +0200 Subject: [PATCH 1/7] [arctools,neo] Add a size method for FutureItemRange. --- arctools/neo/src/neo/Items.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arctools/neo/src/neo/Items.h b/arctools/neo/src/neo/Items.h index c146ff36a..821cbaa3f 100644 --- a/arctools/neo/src/neo/Items.h +++ b/arctools/neo/src/neo/Items.h @@ -249,6 +249,13 @@ struct FutureItemRange return std::move(new_items); } + ItemRange::size_type size() const { + if (is_data_released) + throw std::runtime_error( + "Impossible to call FutureItemRange.size(), data already released."); + return new_items.size(); + } + private: virtual ItemRange& _toItemRange() { return new_items; From 748f9257e385e12535493e1db38ea6f7e4b801b8 Mon Sep 17 00:00:00 2001 From: sdcm Date: Fri, 2 May 2025 14:34:16 +0200 Subject: [PATCH 2/7] [arctools,neo] Test new FutureItemRange::size method. --- arctools/neo/src/tests/NeoBaseTest.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arctools/neo/src/tests/NeoBaseTest.cpp b/arctools/neo/src/tests/NeoBaseTest.cpp index f758091e9..2fdbc4efa 100644 --- a/arctools/neo/src/tests/NeoBaseTest.cpp +++ b/arctools/neo/src/tests/NeoBaseTest.cpp @@ -164,9 +164,11 @@ TEST(NeoTestItemRange, test_item_range) { TEST(NeoTestFutureItemRange, test_future_item_range) { Neo::FutureItemRange future_item_range{}; + EXPECT_EQ(future_item_range.size(), 0); // Manually fill contained ItemRange std::vector lids{ 0, 2, 4, 6 }; future_item_range.new_items = Neo::ItemRange{ Neo::ItemLocalIds{ lids } }; + EXPECT_EQ(future_item_range.size(), lids.size()); Neo::ItemRange& internal_range = future_item_range; EXPECT_EQ(&future_item_range.new_items, &internal_range); auto end_update = Neo::EndOfMeshUpdate{}; @@ -175,6 +177,7 @@ TEST(NeoTestFutureItemRange, test_future_item_range) { std::vector filter{ 0, 1, 2 }; auto filtered_future_range = Neo::make_future_range(future_item_range, filter); + EXPECT_EQ(filtered_future_range.size(), 0); // Get item_ranges auto filtered_range = filtered_future_range.get(end_update); auto item_range = future_item_range.get(end_update); From 39913c7f59b3be5577fc4331f5baf1c541f13adf Mon Sep 17 00:00:00 2001 From: sdcm Date: Fri, 2 May 2025 14:36:08 +0200 Subject: [PATCH 3/7] [arctools,neo] Add isEmpty method and equal operator to Connectivity. --- arctools/neo/src/neo/Mesh.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arctools/neo/src/neo/Mesh.h b/arctools/neo/src/neo/Mesh.h index c27a7ad18..49ddeffa6 100644 --- a/arctools/neo/src/neo/Mesh.h +++ b/arctools/neo/src/neo/Mesh.h @@ -82,6 +82,14 @@ class Mesh if (nb_connected_elements.size() == 0) {return 0;} return *std::max_element(nb_connected_elements.begin(), nb_connected_elements.end()); } + + bool isEmpty() const { + return maxNbConnectedItems() == 0; + } + + friend bool operator==(Connectivity const& lhs, Connectivity const& rhs) { + return (lhs.source_family == rhs.source_family) && (lhs.target_family == rhs.target_family) && lhs.name == rhs.name; + } }; enum class ConnectivityOperation From b5b493c86fe2acfab14af6b38146780640709b0c Mon Sep 17 00:00:00 2001 From: sdcm Date: Fri, 2 May 2025 14:55:59 +0200 Subject: [PATCH 4/7] [arctools,neo] Test isEmpty method and equal operator to Connectivity. --- arctools/neo/src/tests/NeoMeshAPITest.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/arctools/neo/src/tests/NeoMeshAPITest.cpp b/arctools/neo/src/tests/NeoMeshAPITest.cpp index cbb283528..d26ddb87e 100644 --- a/arctools/neo/src/tests/NeoMeshAPITest.cpp +++ b/arctools/neo/src/tests/NeoMeshAPITest.cpp @@ -238,6 +238,17 @@ TEST(NeoMeshApiTest, SetNodeCoordsTest) { /*---------------------------------------------------------------------------*/ +TEST(NeoMeshApiTest,EmptyMeshConnectivity) { + // Check empty connectivity + Neo::Family empty_family{Neo::ItemKind::IK_None, "EmptyFamily"}; + Neo::Mesh::ConnectivityPropertyType empty_property{}; + Neo::Mesh::Connectivity empty_connectivity{empty_family,empty_family,"empty_connectivity", + empty_property,empty_property}; + EXPECT_TRUE(empty_connectivity.isEmpty()); +} + +/*---------------------------------------------------------------------------*/ + bool areEqual(Neo::Mesh::Connectivity const con1, Neo::Mesh::Connectivity const con2) { bool are_equal = con1.name == con2.name; are_equal &= &con1.source_family == &con2.source_family; @@ -301,6 +312,10 @@ TEST(NeoMeshApiTest, AddItemConnectivity) { // check connectivities // check cell_to_nodes auto cell_to_nodes = mesh.getConnectivity(cell_family, node_family, cell_to_nodes_connectivity_name); + EXPECT_FALSE(cell_to_nodes.isEmpty()); + // check operator == + auto cell_to_nodes_copy{cell_to_nodes}; + EXPECT_EQ(cell_to_nodes,cell_to_nodes_copy); EXPECT_EQ(cell_to_nodes_connectivity_name, cell_to_nodes.name); EXPECT_EQ(&cell_family, &cell_to_nodes.source_family); EXPECT_EQ(&node_family, &cell_to_nodes.target_family); From bb932be48e62e04a7c1a05f5a7e63538b254fd5e Mon Sep 17 00:00:00 2001 From: sdcm Date: Fri, 2 May 2025 15:38:34 +0200 Subject: [PATCH 5/7] [arctools,neo] Allow to add a Connectivity already existing in the graph if it was empty. --- arctools/neo/src/neo/MeshSchedule.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/arctools/neo/src/neo/MeshSchedule.cpp b/arctools/neo/src/neo/MeshSchedule.cpp index 73b17bfae..3a6f75f9e 100644 --- a/arctools/neo/src/neo/MeshSchedule.cpp +++ b/arctools/neo/src/neo/MeshSchedule.cpp @@ -34,12 +34,17 @@ void Neo::Mesh::_scheduleAddConnectivity(Neo::Family& source_family, Neo::ItemRa // Create connectivity wrapper and add it to mesh auto& connectivity_property = source_family.getConcreteProperty(connectivity_unique_name); auto& connectivity_orientation = source_family.getConcreteProperty(orientation_name); - Connectivity current_connectivity = Connectivity {source_family,target_family, - connectivity_unique_name,connectivity_property, - connectivity_orientation}; - auto [iterator, is_inserted] = m_connectivities.insert(std::make_pair(connectivity_unique_name,current_connectivity)); - m_connectivities_per_family[{source_family.itemKind(),source_family.name()}].push_back(current_connectivity); - if (!is_inserted && add_or_modify == ConnectivityOperation::Add) { + Connectivity current_connectivity = Connectivity{ source_family, target_family, + connectivity_unique_name, connectivity_property, + connectivity_orientation }; + auto [inserted_connectivity_iterator, is_inserted] = m_connectivities.insert(std::make_pair(connectivity_unique_name, current_connectivity)); + auto& source_family_con = m_connectivities_per_family[{ source_family.itemKind(), source_family.name() }]; + if (std::find(source_family_con.begin(), + source_family_con.end(), + current_connectivity) == source_family_con.end()) { + source_family_con.push_back(current_connectivity); + } + if (!is_inserted && add_or_modify == ConnectivityOperation::Add && !inserted_connectivity_iterator->second.isEmpty()) { throw std::invalid_argument("Cannot include already inserted connectivity " + connectivity_unique_name + ". Choose ConnectivityOperation::Modify"); } m_mesh_graph->addAlgorithm( From ad92b4372659f3345aa63992cdb39d32c6b3ca6e Mon Sep 17 00:00:00 2001 From: sdcm Date: Fri, 2 May 2025 15:39:22 +0200 Subject: [PATCH 6/7] [arctools,neo] Test possibility to add a Connectivity already existing in the graph if it was empty. --- arctools/neo/src/tests/NeoMeshAPITest.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/arctools/neo/src/tests/NeoMeshAPITest.cpp b/arctools/neo/src/tests/NeoMeshAPITest.cpp index d26ddb87e..0652a3870 100644 --- a/arctools/neo/src/tests/NeoMeshAPITest.cpp +++ b/arctools/neo/src/tests/NeoMeshAPITest.cpp @@ -460,14 +460,23 @@ TEST(NeoMeshApiTest, AddAndChangeItemConnectivity) { auto future_dofs = Neo::FutureItemRange{}; mesh.scheduleAddItems(cell_family, cell_uids, future_cells); mesh.scheduleAddItems(dof_family, dof_uids, future_dofs); + // Add en empty connectivity + mesh.scheduleAddConnectivity(cell_family, Neo::ItemRange{}, dof_family, 0, + {}, "cell_to_dofs"); + mesh.applyScheduledOperations(); + // It is possible to modifiy an empty connectivity using ConnectivityOperation::Add (the default) mesh.scheduleAddConnectivity(cell_family, future_cells, dof_family, 3, cell_dofs, "cell_to_dofs"); mesh.applyScheduledOperations(); - - // Change an existing connectivity : cell 0 now points to dofs uids {3,4} + // Change an existing connectivity: cell 0 now points to dofs uids {3,4} auto cell_lids = cell_family.itemUniqueIdsToLocalids({ 0 }); Neo::ItemRange cell_range{ cell_lids }; auto connected_dofs = std::vector{ 3, 4 }; + // First try using ConnectivityOperation::Add an existing connectivity: it fails + EXPECT_THROW(mesh.scheduleAddConnectivity(cell_family, cell_range, dof_family, 2, + connected_dofs, "cell_to_dofs", + Neo::Mesh::ConnectivityOperation::Add), std::invalid_argument); + // Second try using ConnectivityOperation::Add an existing connectivity: it works mesh.scheduleAddConnectivity(cell_family, cell_range, dof_family, 2, connected_dofs, "cell_to_dofs", Neo::Mesh::ConnectivityOperation::Modify); From eab251c2e4a40fda87963a4d5d9b7be9760f2dbf Mon Sep 17 00:00:00 2001 From: sdcm Date: Fri, 2 May 2025 15:47:35 +0200 Subject: [PATCH 7/7] [arctools,neo] Update Copyrights. --- arctools/neo/src/neo/Items.h | 4 ++-- arctools/neo/src/tests/NeoBaseTest.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arctools/neo/src/neo/Items.h b/arctools/neo/src/neo/Items.h index 821cbaa3f..787ed64ac 100644 --- a/arctools/neo/src/neo/Items.h +++ b/arctools/neo/src/neo/Items.h @@ -1,11 +1,11 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* Items (C) 2000-2024 */ +/* Items (C) 2000-2025 */ /* */ /* Tooling to manipulate Mesh Items */ /*---------------------------------------------------------------------------*/ diff --git a/arctools/neo/src/tests/NeoBaseTest.cpp b/arctools/neo/src/tests/NeoBaseTest.cpp index 2fdbc4efa..33ac3e103 100644 --- a/arctools/neo/src/tests/NeoBaseTest.cpp +++ b/arctools/neo/src/tests/NeoBaseTest.cpp @@ -1,11 +1,11 @@ // -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*- //----------------------------------------------------------------------------- -// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) +// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com) // See the top-level COPYRIGHT file for details. // SPDX-License-Identifier: Apache-2.0 //----------------------------------------------------------------------------- /*---------------------------------------------------------------------------*/ -/* NeoBaseTest.cpp (C) 2000-2023 */ +/* NeoBaseTest.cpp (C) 2000-2025 */ /* */ /* Base tests for Neo kernel */ /*---------------------------------------------------------------------------*/