diff --git a/MeshLib/ElementStatus.cpp b/MeshLib/ElementStatus.cpp index 97a6e88bd0e9e164570d3d4341bb62803990b413..683cea2fe2c6ed1bc0b075ab35399b57d24ea25c 100644 --- a/MeshLib/ElementStatus.cpp +++ b/MeshLib/ElementStatus.cpp @@ -78,6 +78,21 @@ unsigned ElementStatus::getNActiveElements() const return static_cast<unsigned>(std::count(_element_status.begin(), _element_status.end(), true)); } +void ElementStatus::setAll(bool status) +{ + std::fill(_element_status.begin(), _element_status.end(), status); + + if (status) + { + const std::vector<MeshLib::Node*> &nodes (_mesh->getNodes()); + const std::size_t nNodes (_mesh->getNNodes()); + for (std::size_t i=0; i<nNodes; ++i) + _active_nodes[i] = nodes[i]->getNElements(); + } + else + std::fill(_active_nodes.begin(), _active_nodes.end(), 0); +} + void ElementStatus::setElementStatus(unsigned i, bool status) { if (_element_status[i] != status) diff --git a/MeshLib/ElementStatus.h b/MeshLib/ElementStatus.h index 03a10d965c6b93352e2ddc3504f44250fbd872c1..90b61e47cf299d2b9fdf02912cbb04a2b5da6dd6 100644 --- a/MeshLib/ElementStatus.h +++ b/MeshLib/ElementStatus.h @@ -52,6 +52,9 @@ public: /// Returns the status of element bool isActive(unsigned i) const { return _element_status[i]; } + /// Activates/Deactives all mesh elements + void setAll(bool status); + /// Sets the status of element i void setElementStatus(unsigned i, bool status); diff --git a/Tests/MeshLib/TestElementStatus.cpp b/Tests/MeshLib/TestElementStatus.cpp new file mode 100644 index 0000000000000000000000000000000000000000..449a6c033c3ae22135b9adb64d214fe56cda29cf --- /dev/null +++ b/Tests/MeshLib/TestElementStatus.cpp @@ -0,0 +1,88 @@ +/** + * @file TestElementStatus.cpp + * @author Karsten Rink + * @date 2013-03-14 + * @brief Tests for ElementStatus class + * + * @copyright + * Copyright (c) 2013, OpenGeoSys Community (http://www.opengeosys.org) + * Distributed under a Modified BSD License. + * See accompanying file LICENSE.txt or + * http://www.opengeosys.org/LICENSE.txt + */ + +#include "gtest/gtest.h" + +#include "Mesh.h" +#include "Node.h" +#include "Elements/Element.h" +#include "ElementStatus.h" +#include "MeshGenerators/MeshGenerator.h" + + +TEST(MeshLib, ElementStatus) +{ +const unsigned width (100); + const unsigned elements_per_side (20); + MeshLib::Mesh* mesh (MeshLib::MeshGenerator::generateRegularQuadMesh(width, elements_per_side)); + MeshLib::ElementStatus status(mesh); + const std::vector<MeshLib::Element*> elements (mesh->getElements()); + + for (unsigned i=0; i<elements_per_side; ++i) + { + for (unsigned j=0; j<elements_per_side; ++j) + elements[i*elements_per_side + j]->setValue(i); + } + + // all elements active + ASSERT_EQ (status.getNActiveElements(), elements.size()); + // all nodes active + ASSERT_EQ (status.getNActiveNodes(), mesh->getNNodes()); + + // set material 1 to false + status.setMaterialStatus(1, false); + ASSERT_EQ (status.getNActiveElements(), elements.size()-elements_per_side); + + // set material 1 to false (again) + status.setMaterialStatus(1, false); + ASSERT_EQ (status.getNActiveElements(), elements.size()-elements_per_side); + + // set material 0 to false + status.setMaterialStatus(0, false); + ASSERT_EQ (status.getNActiveElements(), elements.size()-(2*elements_per_side)); + + // active elements + std::vector<unsigned> active_elements (status.getActiveElements()); + ASSERT_EQ (active_elements.size(), status.getNActiveElements()); + + // active nodes + std::vector<unsigned> active_nodes (status.getActiveNodes()); + ASSERT_EQ (active_nodes.size(), status.getNActiveNodes()); + + // set element 1 to false (yet again) + status.setElementStatus(1, false); + status.isActive(1); + ASSERT_EQ (status.getNActiveElements(), elements.size()-(2*elements_per_side)); + ASSERT_EQ (status.getNActiveNodes(), mesh->getNNodes()-(2*(elements_per_side+1))); + + // set element 1 to true + status.setElementStatus(1, true); + ASSERT_EQ (status.getNActiveElements(), elements.size()-(2*elements_per_side)+1); + ASSERT_EQ (status.getNActiveNodes(), mesh->getNNodes()-(2*(elements_per_side+1))+4); + ASSERT_EQ(status.isActive(1), true); + + std::vector<unsigned> active_elements_at_node (status.getActiveElementsAtNode(2)); + ASSERT_EQ(active_elements_at_node.size(), 1); + active_elements_at_node = status.getActiveElementsAtNode(22); + ASSERT_EQ(active_elements_at_node.size(), 1); + active_elements_at_node = status.getActiveElementsAtNode(102); + ASSERT_EQ(active_elements_at_node.size(), 4); + + status.setAll(true); + ASSERT_EQ(status.getNActiveElements(), elements.size()); + ASSERT_EQ(status.getNActiveNodes(), mesh->getNNodes()); + + status.setAll(false); + ASSERT_EQ(0, status.getNActiveElements()); + ASSERT_EQ(0, status.getNActiveNodes()); +}