https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Friends | List of all members
CSG::CSGSurface Class Referenceabstract

CSGSurface creates an internal representation of a Constructive Solid Geometry (CSG) surface, represented as some polynomial in x, y, and z. More...

#include <CSGSurface.h>

Inheritance diagram for CSG::CSGSurface:
[legend]

Public Types

enum class  Halfspace { POSITIVE , NEGATIVE }
 Enum for the sign of the half-space being represented by a point and surface. More...
 

Public Member Functions

 CSGSurface (const std::string &name)
 Default constructor.
 
virtual ~CSGSurface ()=default
 Destructor.
 
const std::string getSurfaceType () const
 Get the Surface Type.
 
virtual std::unordered_map< std::string, Real > getCoeffs () const =0
 Get the coefficients that define the surface.
 
virtual Real evaluateSurfaceEquationAtPoint (const Point &p) const =0
 given a point, determine its evaluation based on the surface equation.
 
CSGSurface::Halfspace getHalfspaceFromPoint (const Point &p) const
 given a point, determine if it is in the positive or negative half-space for the surface
 
const std::string & getName () const
 Get the name of surface.
 
virtual bool isEngUnit () const
 Whether this surface is an engineering unit.
 
bool operator== (const CSGSurface &other) const
 Operator overload for checking if two CSGSurface objects are equal.
 
bool operator!= (const CSGSurface &other) const
 Operator overload for checking if two CSGSurface objects are not equal.
 
const std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > & getTransformations () const
 Get the list of transformations.
 
std::vector< std::pair< std::string, std::tuple< Real, Real, Real > > > getTransformationsAsStrings () const
 Get the transformations of this object with string representations for types.
 

Static Public Member Functions

static bool isValidTransformationValue (TransformationType type, const std::tuple< Real, Real, Real > &values)
 Check if the transformation value is valid for the given type.
 
static std::string getTransformationTypeString (TransformationType type)
 Get the string representation of the transformation type.
 

Protected Member Functions

virtual std::unique_ptr< CSGSurfaceclone () const =0
 Create clone of current surface, to be implemented by derived class.
 
void setName (const std::string &name)
 
void addTransformation (TransformationType type, const std::tuple< Real, Real, Real > &values)
 Add a transformation to the list of transformations.
 
Point applyReverseTransformsToPoint (Point p) const
 update the value of point p by applying the inverse of the list of transformations to the point
 
 FRIEND_TEST (CSGSurfaceTest, testSetName)
 Friends for unit testing.
 
 FRIEND_TEST (CSGSurfaceTest, testSurfaceEquality)
 
 FRIEND_TEST (CSGSurfaceTest, testHalfspaceWithTransform)
 Friends for unit testing.
 
 FRIEND_TEST (CSGSurfaceTest, testHalfspaceWithNullTransform)
 
 FRIEND_TEST (CSGEngUnitTest, testEngUnitEqual)
 

Protected Attributes

std::string _name
 Name of surface.
 
std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > _transformations
 List of transformations applied to this object.
 

Friends

class CSGSurfaceList
 
class CSGBase
 

Detailed Description

CSGSurface creates an internal representation of a Constructive Solid Geometry (CSG) surface, represented as some polynomial in x, y, and z.

Definition at line 26 of file CSGSurface.h.

Member Enumeration Documentation

◆ Halfspace

enum class CSG::CSGSurface::Halfspace
strong

Enum for the sign of the half-space being represented by a point and surface.

Enumerator
POSITIVE 
NEGATIVE 

Definition at line 30 of file CSGSurface.h.

Constructor & Destructor Documentation

◆ CSGSurface()

CSG::CSGSurface::CSGSurface ( const std::string &  name)

Default constructor.

Parameters
nameunique name of surface

Definition at line 17 of file CSGSurface.C.

17 : _name(name)
18{
20}
std::string _name
Name of surface.
Definition CSGSurface.h:122
void checkValidCSGName(const std::string &name)
Check name of CSG component for disallowed characters and symbols.
Definition CSGUtils.C:36

◆ ~CSGSurface()

virtual CSG::CSGSurface::~CSGSurface ( )
virtualdefault

Destructor.

Member Function Documentation

◆ addTransformation()

void CSG::CSGTransformationHelper::addTransformation ( TransformationType  type,
const std::tuple< Real, Real, Real > &  values 
)
protectedinherited

Add a transformation to the list of transformations.

Parameters
typeThe type of transformation
valuesThe values for the transformation

Definition at line 16 of file CSGTransformationHelper.C.

18{
20 mooseError("Invalid transformation values provided for transformation type " +
22 _transformations.emplace_back(type, values);
23}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
std::array< Real, 2 > values
Definition MortarUtils.C:52
static std::string getTransformationTypeString(TransformationType type)
Get the string representation of the transformation type.
static bool isValidTransformationValue(TransformationType type, const std::tuple< Real, Real, Real > &values)
Check if the transformation value is valid for the given type.
std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > _transformations
List of transformations applied to this object.

Referenced by CSG::CSGBase::addTransformation(), CSG::CSGBase::expandEngUnit(), CSG::CSGBase::expandEngUnit(), and CSG::CSGBase::expandEngUnit().

◆ applyReverseTransformsToPoint()

Point CSG::CSGTransformationHelper::applyReverseTransformsToPoint ( Point  p) const
protectedinherited

update the value of point p by applying the inverse of the list of transformations to the point

Parameters
ppoint to transform
Returns
transformed point

Definition at line 74 of file CSGTransformationHelper.C.

75{
76 // iterate list of transformations in reverse and apply the inverse operation
77 for (auto it = _transformations.rbegin(); it != _transformations.rend(); ++it)
78 {
79 auto trans_type = it->first;
80 auto val = it->second;
81
82 if (trans_type == TransformationType::TRANSLATION)
83 {
84 Point offset(std::get<0>(val), std::get<1>(val), std::get<2>(val));
85 p -= offset;
86 }
87 else if (trans_type == TransformationType::SCALE)
88 {
89 Point scale(std::get<0>(val), std::get<1>(val), std::get<2>(val));
90 for (int i = 0; i < 3; ++i)
91 p(i) /= scale(i);
92 }
93 else if (trans_type == TransformationType::ROTATION)
94 {
95 // get the transpose of the original rotation matrix and apply to point p
96 const auto rot_matrix = RealTensorValue::intrinsic_rotation_matrix(
97 std::get<0>(val), std::get<1>(val), std::get<2>(val));
98 const auto rot_transpose = rot_matrix.transpose();
99 p = rot_transpose * p;
100 }
101 else
102 mooseError("Transformation type is not recognized.");
103 }
104 return p;
105}
Real scale
Definition MortarUtils.C:62

Referenced by getHalfspaceFromPoint().

◆ clone()

virtual std::unique_ptr< CSGSurface > CSG::CSGSurface::clone ( ) const
protectedpure virtual

Create clone of current surface, to be implemented by derived class.

Returns
unique_ptr to cloned surface

Implemented in CSG::CSGNPolygonUnit, CSG::CSGPlane, CSG::CSGSphere, CSG::CSGXCylinder, CSG::CSGYCylinder, CSG::CSGZCylinder, and CSG::CSGSurfaceEngUnit.

◆ evaluateSurfaceEquationAtPoint()

virtual Real CSG::CSGSurface::evaluateSurfaceEquationAtPoint ( const Point &  p) const
pure virtual

given a point, determine its evaluation based on the surface equation.

A positive value indicates a point that lies in the positive half-space with regards to the surface, a negative value indicates a point that lies in the negative side of the surface, and a value of 0 indicates that the point lies on the surface.

Parameters
ppoint
Returns
evaluation of point based on surface equation

Implemented in CSG::CSGNPolygonUnit, CSG::CSGPlane, CSG::CSGSphere, CSG::CSGXCylinder, CSG::CSGYCylinder, CSG::CSGZCylinder, and CSG::CSGSurfaceEngUnit.

Referenced by getHalfspaceFromPoint().

◆ FRIEND_TEST() [1/5]

CSG::CSGTransformationHelper::FRIEND_TEST ( CSGEngUnitTest  ,
testEngUnitEqual   
)
protectedinherited

◆ FRIEND_TEST() [2/5]

CSG::CSGTransformationHelper::FRIEND_TEST ( CSGSurfaceTest  ,
testHalfspaceWithNullTransform   
)
protectedinherited

◆ FRIEND_TEST() [3/5]

CSG::CSGTransformationHelper::FRIEND_TEST ( CSGSurfaceTest  ,
testHalfspaceWithTransform   
)
protectedinherited

Friends for unit testing.

◆ FRIEND_TEST() [4/5]

CSG::CSGSurface::FRIEND_TEST ( CSGSurfaceTest  ,
testSetName   
)
protected

Friends for unit testing.

◆ FRIEND_TEST() [5/5]

CSG::CSGSurface::FRIEND_TEST ( CSGSurfaceTest  ,
testSurfaceEquality   
)
protected

◆ getCoeffs()

virtual std::unordered_map< std::string, Real > CSG::CSGSurface::getCoeffs ( ) const
pure virtual

Get the coefficients that define the surface.

Returns
map of coefficients and their values

Implemented in CSG::CSGPlane, CSG::CSGSphere, CSG::CSGSurfaceEngUnit, CSG::CSGXCylinder, CSG::CSGYCylinder, and CSG::CSGZCylinder.

Referenced by operator==().

◆ getHalfspaceFromPoint()

CSGSurface::Halfspace CSG::CSGSurface::getHalfspaceFromPoint ( const Point &  p) const

given a point, determine if it is in the positive or negative half-space for the surface

Parameters
ppoint
Returns
sign of the half-space

Definition at line 23 of file CSGSurface.C.

24{
25 // if transformations are present on the surface, apply them in reverse to the point and pass that
26 // new point to the evaluation to ensure transformations are considered.
27
28 // Create a local transformed copy - the original p in the calling scope is NOT modified
29 const Point p_trans = getTransformations().size() ? applyReverseTransformsToPoint(p) : p;
30
31 auto eval = evaluateSurfaceEquationAtPoint(p_trans);
32 if (MooseUtils::absoluteFuzzyGreaterThan(eval, 0))
34 else if (MooseUtils::absoluteFuzzyLessThan(eval, 0))
36 else
37 mooseError("Point ",
38 p,
39 " used to determine halfspace evaluation lies on the surface ",
40 _name,
41 ", leading to an ambiguously defined halfspace.");
42}
virtual Real evaluateSurfaceEquationAtPoint(const Point &p) const =0
given a point, determine its evaluation based on the surface equation.
const std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > & getTransformations() const
Get the list of transformations.
Point applyReverseTransformsToPoint(Point p) const
update the value of point p by applying the inverse of the list of transformations to the point

◆ getName()

const std::string & CSG::CSGSurface::getName ( ) const
inline

◆ getSurfaceType()

const std::string CSG::CSGSurface::getSurfaceType ( ) const
inline

Get the Surface Type.

Returns
type of surface

Definition at line 53 of file CSGSurface.h.

54 {
55 return MooseUtils::prettyCppType(libMesh::demangle(typeid(*this).name()));
56 }
std::string prettyCppType(const std::string &cpp_type)
std::string demangle(const char *name)

Referenced by operator==().

◆ getTransformations()

const std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > & CSG::CSGTransformationHelper::getTransformations ( ) const
inlineinherited

◆ getTransformationsAsStrings()

std::vector< std::pair< std::string, std::tuple< Real, Real, Real > > > CSG::CSGTransformationHelper::getTransformationsAsStrings ( ) const
inherited

Get the transformations of this object with string representations for types.

Returns
Vector of transformation pairs with string representations for types

Definition at line 65 of file CSGTransformationHelper.C.

66{
67 std::vector<std::pair<std::string, std::tuple<Real, Real, Real>>> result;
68 for (const auto & transform_pair : _transformations)
69 result.emplace_back(getTransformationTypeString(transform_pair.first), transform_pair.second);
70 return result;
71}

Referenced by CSG::CSGCellEngUnit::getTransformationsAsStrings(), CSG::CSGSurfaceEngUnit::getTransformationsAsStrings(), and CSG::CSGUniverseEngUnit::getTransformationsAsStrings().

◆ getTransformationTypeString()

std::string CSG::CSGTransformationHelper::getTransformationTypeString ( TransformationType  type)
staticinherited

Get the string representation of the transformation type.

Parameters
typeThe transformation type
Returns
String name of the transformation type

Definition at line 56 of file CSGTransformationHelper.C.

57{
58 // Set the enum to the value and convert it to string
60 enum_copy = static_cast<int>(type);
61 return std::string(enum_copy);
62}
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition MooseEnum.h:55
static const MooseEnum transformation_type_enum
MooseEnum for transformation types, matching the TransformationType enum values.

Referenced by CSG::CSGTransformationHelper::addTransformation(), and CSG::CSGTransformationHelper::getTransformationsAsStrings().

◆ isEngUnit()

virtual bool CSG::CSGSurface::isEngUnit ( ) const
inlinevirtual

Whether this surface is an engineering unit.

Returns false for a plain CSGSurface; overridden to return true by the engineering unit types. Used to avoid a dynamic_cast on the common plain-surface comparison path (see operator==).

Returns
true if this object is a CSGEngUnit, otherwise false

Reimplemented in CSG::CSGSurfaceEngUnit.

Definition at line 101 of file CSGSurface.h.

101{ return false; }

Referenced by operator==().

◆ isValidTransformationValue()

bool CSG::CSGTransformationHelper::isValidTransformationValue ( TransformationType  type,
const std::tuple< Real, Real, Real > &  values 
)
staticinherited

Check if the transformation value is valid for the given type.

Parameters
typeThe type of transformation
valuesThe values for the transformation
Returns
True if the values are valid for the type

Definition at line 26 of file CSGTransformationHelper.C.

28{
29 // Additional validation specific to each transformation type could be added here
30 switch (type)
31 {
33 // All translation values are inherently valid
34 return true;
35
37 // Rotation uses euler notation; values are angles in degrees (phi, theta, psi)
38 // For consistency with TransformGenerator, there are no restrictions on the angles
39 // phi: rotation around Z-axis
40 // theta: rotation around new X-axis
41 // psi: rotation around new Z-axis
42 return true;
43
45 // Scaling factors should be non-zero
46 if (std::get<0>(values) == 0.0 || std::get<1>(values) == 0.0 || std::get<2>(values) == 0.0)
47 return false;
48 return true;
49
50 default:
51 mooseError("Unknown transformation type");
52 }
53}

Referenced by CSG::CSGTransformationHelper::addTransformation().

◆ operator!=()

bool CSG::CSGSurface::operator!= ( const CSGSurface other) const

Operator overload for checking if two CSGSurface objects are not equal.

Definition at line 65 of file CSGSurface.C.

66{
67 return !(*this == other);
68}

◆ operator==()

bool CSG::CSGSurface::operator== ( const CSGSurface other) const

Operator overload for checking if two CSGSurface objects are equal.

Definition at line 45 of file CSGSurface.C.

46{
47 // If both objects are engineering units, delegate to CSGEngUnit::operator== to avoid
48 // calling getCoeffs(), which is not supported on engineering unit types. The isEngUnit()
49 // check keeps the common plain-surface path free of any dynamic_cast; the casts below
50 // only run once we know the objects are engineering units.
51 if (isEngUnit())
52 {
53 if (other.isEngUnit())
54 return *dynamic_cast<const CSGEngUnit *>(this) == *dynamic_cast<const CSGEngUnit *>(&other);
55 return false; // an engineering unit cannot equal a plain surface
56 }
57
58 return (this->getName() == other.getName()) &&
59 (this->getSurfaceType() == other.getSurfaceType()) &&
60 (this->getCoeffs() == other.getCoeffs()) &&
61 (this->getTransformations() == other.getTransformations());
62}
const std::string getSurfaceType() const
Get the Surface Type.
Definition CSGSurface.h:53
virtual bool isEngUnit() const
Whether this surface is an engineering unit.
Definition CSGSurface.h:101
const std::string & getName() const
Get the name of surface.
Definition CSGSurface.h:90
virtual std::unordered_map< std::string, Real > getCoeffs() const =0
Get the coefficients that define the surface.

◆ setName()

void CSG::CSGSurface::setName ( const std::string &  name)
inlineprotected

Definition at line 119 of file CSGSurface.h.

119{ _name = name; }
std::string name(const ElemQuality q)

Friends And Related Symbol Documentation

◆ CSGBase

friend class CSGBase
friend

Definition at line 126 of file CSGSurface.h.

◆ CSGSurfaceList

friend class CSGSurfaceList
friend

Definition at line 125 of file CSGSurface.h.

Member Data Documentation

◆ _name

std::string CSG::CSGSurface::_name
protected

◆ _transformations

std::vector<std::pair<TransformationType, std::tuple<Real, Real, Real> > > CSG::CSGTransformationHelper::_transformations
protectedinherited

The documentation for this class was generated from the following files: