Forked from
ogs / ogs
1493 commits behind the upstream repository.
-
Dmitri Naumov authoredDmitri Naumov authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
SpatialPosition.h 2.84 KiB
/**
* \file
* \copyright
* Copyright (c) 2012-2024, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.org/project/license
*
*/
#pragma once
#include <optional>
#include "MathLib/Point3d.h"
namespace ParameterLib
{
//! Represents a position in space which can be either one of
//! a node, an element, an integration point or a cartesian coordinates triple.
//!
//! The setters of this class make sure that only compatible information can be
//! stored at the same time; e.g., it is not possible to specify an element ID
//! and a node ID at the same time (the setAll() method being an exception to
//! that rule).
class SpatialPosition
{
public:
SpatialPosition() = default;
SpatialPosition(std::optional<std::size_t> const& node_id,
std::optional<std::size_t> const& element_id,
std::optional<unsigned> const& integration_point,
std::optional<MathLib::Point3d> const& coordinates)
: _node_id(node_id),
_element_id(element_id),
_integration_point(integration_point),
_coordinates(coordinates)
{
}
std::optional<std::size_t> getNodeID() const { return _node_id; }
std::optional<std::size_t> getElementID() const { return _element_id; }
std::optional<unsigned> getIntegrationPoint() const
{
return _integration_point;
}
std::optional<MathLib::Point3d> const& getCoordinates() const
{
return _coordinates;
}
void setNodeID(std::size_t node_id)
{
clear();
_node_id = node_id;
}
void setElementID(std::size_t element_id)
{
clear();
_element_id = element_id;
}
void setIntegrationPoint(unsigned integration_point)
{
assert(_element_id);
_integration_point = integration_point;
}
void setCoordinates(MathLib::Point3d const& coordinates)
{
_coordinates = coordinates;
}
void setAll(std::optional<std::size_t> const& node_id,
std::optional<std::size_t> const& element_id,
std::optional<unsigned> const& integration_point,
std::optional<MathLib::Point3d> const& coordinates)
{
_node_id = node_id;
_element_id = element_id;
_integration_point = integration_point;
_coordinates = coordinates;
}
void clear()
{
_node_id = std::nullopt;
_element_id = std::nullopt;
_integration_point = std::nullopt;
_coordinates = std::nullopt;
}
private:
std::optional<std::size_t> _node_id;
std::optional<std::size_t> _element_id;
std::optional<unsigned> _integration_point;
std::optional<MathLib::Point3d> _coordinates;
};
} // namespace ParameterLib