Files
mfem/mesh/attribute_sets.hpp
T

172 lines
6.3 KiB
C++

// Copyright (c) 2010-2025, Lawrence Livermore National Security, LLC. Produced
// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
// LICENSE and NOTICE for details. LLNL-CODE-806117.
//
// This file is part of the MFEM library. For more information and source code
// availability visit https://mfem.org.
//
// MFEM is free software; you can redistribute it and/or modify it under the
// terms of the BSD-3 license. We welcome feedback and contributions, see file
// CONTRIBUTING.md for details.
#ifndef MFEM_ATTRIBUTE_SETS
#define MFEM_ATTRIBUTE_SETS
#include "../config/config.hpp"
#include "../general/arrays_by_name.hpp"
#include <iostream>
#include <map>
#include <set>
#include <string>
namespace mfem
{
class AttributeSets
{
private:
const Array<int> & attributes;
const int def_width = 10;
public:
/// Named sets of attributes
ArraysByName<int> attr_sets;
AttributeSets(const Array<int> &attr);
/// @brief Create a copy of the internal data to the provided @a copy.
void Copy(AttributeSets &copy) const;
/// @brief Return true if any named sets are currently defined
bool SetsExist() const;
/// @brief Return all attribute set names as an STL set
std::set<std::string> GetAttributeSetNames() const;
/// @brief Return true is the named attribute set is present
bool AttributeSetExists(const std::string &name) const;
/// @brief Create an empty named attribute set
Array<int> & CreateAttributeSet(const std::string &set_name);
/// @brief Delete a named attribute set
void DeleteAttributeSet(const std::string &set_name);
/// @brief Create a new attribute set
/**
@param[in] set_name The name of the new set
@param[in] attr An array of attribute numbers making up the new set
@note If an attribute set matching this name already exists, that set
will be replaced with this new attribute set.
@note The attribute numbers are not checked for validity or
existence within the mesh.
*/
void SetAttributeSet(const std::string &set_name, const Array<int> &attr);
/// @brief Add a single entry to an existing attribute set
/**
@param[in] set_name The name of the set being augmented
@param[in] attr A single attribute number to be inserted in the set
@note If the named set does not exist an error message will be printed
and execution will halt. `AttributeSetExists()` may be used to verify
existence of a named set.
@note Duplicate entries will be ignored and the resulting sets will be
sorted.
*/
void AddToAttributeSet(const std::string &set_name, int attr);
/// @brief Add an array of entries to an existing attribute set
/**
@param[in] set_name The name of the set being augmented
@param[in] attr Array of attribute numbers to be inserted in the set
@note If the named set does not exist an error message will be printed
and execution will halt. `AttributeSetExists()` may be used to verify
existence of a named set.
@note Duplicate entries will be ignored and the resulting sets will be
sorted.
*/
void AddToAttributeSet(const std::string &set_name, const Array<int> &attr);
/// @brief Remove a single entry from an existing attribute set
/**
@param[in] set_name The name of the set being modified
@param[in] attr A single attribute number to be removed from the set
@note If the named set does not exist an error message will be printed
and execution will halt. `AttributeSetExists()` may be used to verify
existence of a named set.
@note If @a attr is not a member of the named set the set will not
be modified and no error will occur.
*/
void RemoveFromAttributeSet(const std::string &set_name, int attr);
/// @brief Print the contents of the container to an output stream
///
/// @note The array entries will contain 10 entries per line. A specific
/// number of entries per line can be used by changing the @a width argument.
void Print(std::ostream &out = mfem::out, int width = -1) const;
/// @brief Access a named attribute set
/**
@param[in] set_name The name of the set being accessed
@note If the named set does not exist an error message will be printed
and execution will halt. `AttributeSetExists()` may be used to verify
existence of a named set.
@note The reference returned by this method can be invalidated by
subsequent calls to SetAttributeSet, ClearAttributeSet, or
RemoveFromAttributeSet. AddToAttributeSet should not invalidate this
reference.
*/
Array<int> & GetAttributeSet(const std::string & set_name);
/// @brief Access a constant reference to a named attribute set
/**
@param[in] set_name The name of the set being accessed
@note If the named set does not exist an error message will be printed
and execution will halt. `AttributeSetExists()` may be used to verify
existence of a named set.
@note The reference returned by this method can be invalidated by
subsequent calls to SetAttributeSet, ClearAttributeSet, or
RemoveFromAttributeSet. AddToAttributeSet should not invalidate this
reference.
*/
const Array<int> & GetAttributeSet(const std::string & set_name) const;
/// @brief Return a marker array corresponding to a named attribute set
/**
@param[in] set_name The name of the set being accessed
@note If the named set does not exist an error message will be printed
and execution will halt. `AttributeSetExists()` may be used to verify
existence of a named set.
*/
Array<int> GetAttributeSetMarker(const std::string & set_name) const;
/// @brief Prepares a marker array corresponding to an array of element
/// attributes
/**
@param[in] max_attr Number of entries to create in the @a marker array
@param[in] attrs An array of attribute numbers which should be
activated
The returned marker array will be of size @a max_attr and it will contain
only zeroes and ones. Ones indicate which attribute numbers are present
in the @a attrs array.
*/
static Array<int> AttrToMarker(int max_attr, const Array<int> &attrs);
};
} // namespace mfem
#endif