Revision 32e4bfbf98a60e761b1a1ac679774f6cb4f98b21 authored by Wenqing Wang on 30 June 2021, 13:26:29 UTC, committed by Dmitry Yu. Naumov on 05 July 2021, 10:50:41 UTC
1 parent be8cfd9
Raw File
TestElementStatus.cpp
/**
 * \file
 * \author Karsten Rink
 * \date 2013-03-14
 * \brief Tests for ElementStatus class
 *
 * \copyright
 * Copyright (c) 2012-2021, OpenGeoSys Community (http://www.opengeosys.org)
 *            Distributed under a Modified BSD License.
 *              See accompanying file LICENSE.txt or
 *              http://www.opengeosys.org/project/license
 */

#include <gtest/gtest.h>

#include <memory>

#include "MeshLib/ElementStatus.h"
#include "MeshLib/Elements/Element.h"
#include "MeshLib/Mesh.h"
#include "MeshLib/MeshGenerators/MeshGenerator.h"
#include "MeshLib/Node.h"

TEST(MeshLib, ElementStatus)
{
    const unsigned width(100);
    const unsigned elements_per_side(20);
    auto const mesh = std::unique_ptr<MeshLib::Mesh>{
        MeshLib::MeshGenerator::generateRegularQuadMesh(width,
                                                        elements_per_side)};

    auto* const material_id_properties =
        mesh->getProperties().createNewPropertyVector<int>(
            "MaterialIDs", MeshLib::MeshItemType::Cell);
    ASSERT_NE(nullptr, material_id_properties);
    material_id_properties->resize(mesh->getNumberOfElements());

    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)
        {
            (*material_id_properties)[elements[i * elements_per_side + j]
                                          ->getID()] = i;
        }
    }

    {
        // all elements and nodes active
        MeshLib::ElementStatus status(mesh.get());
        ASSERT_EQ(elements.size(), status.getNumberOfActiveElements());
        ASSERT_EQ(mesh->getNumberOfNodes(), status.getNumberOfActiveNodes());
    }

    {
        // set material 1 to false
        std::vector<int> inactiveMat{1};
        MeshLib::ElementStatus status(mesh.get(), inactiveMat);
        ASSERT_EQ(elements.size() - elements_per_side,
                  status.getNumberOfActiveElements());
    }

    {
        // set material 0 and 1 to false
        std::vector<int> inactiveMat{0, 1};
        MeshLib::ElementStatus status(mesh.get(), inactiveMat);
        ASSERT_EQ(elements.size() - (2 * elements_per_side),
                  status.getNumberOfActiveElements());

        // active elements
        auto& active_elements(status.getActiveElements());
        ASSERT_EQ(active_elements.size(), status.getNumberOfActiveElements());

        // active nodes
        auto& active_nodes(status.getActiveNodes());
        ASSERT_EQ(active_nodes.size(), status.getNumberOfActiveNodes());
    }
}
back to top