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

CSGSphere creates an internal representation of a Constructive Solid Geometry (CSG) sphere, represented in the form (x - x0)^2 + (y - y0)^2 + (z - z0)^2 = r^2. More...

#include <CSGSphere.h>

Inheritance diagram for CSG::CSGSphere:
[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

 CSGSphere (const std::string &name, const Point &center, const Real r)
 Construct a new CSGSphere surface.
 
 CSGSphere (const std::string &name, const Real r)
 Construct a new CSGSphere surface.
 
virtual ~CSGSphere ()=default
 Destructor.
 
virtual std::unordered_map< std::string, Real > getCoeffs () const override
 Get the coefficients (x0, y0, z0, r) for the equation of a sphere (x - x0)^2 + (y - y0)^2 + (z - z0)^2 = r^2.
 
virtual Real evaluateSurfaceEquationAtPoint (const Point &p) const override
 given a point, determine its evaluation based on the equation of the sphere
 
const std::string getSurfaceType () const
 Get the Surface Type.
 
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 override
 create clone of CSGSphere object
 
void checkRadius () const
 
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

Real _x0
 Value of x0 in equation of sphere.
 
Real _y0
 Value of y0 in equation of sphere.
 
Real _z0
 Value of z0 in equation of sphere.
 
Real _r
 Value of r in equation of sphere.
 
std::string _name
 Name of surface.
 
std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > _transformations
 List of transformations applied to this object.
 

Detailed Description

CSGSphere creates an internal representation of a Constructive Solid Geometry (CSG) sphere, represented in the form (x - x0)^2 + (y - y0)^2 + (z - z0)^2 = r^2.

Definition at line 23 of file CSGSphere.h.

Member Enumeration Documentation

◆ Halfspace

enum class CSG::CSGSurface::Halfspace
stronginherited

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

◆ CSGSphere() [1/2]

CSG::CSGSphere::CSGSphere ( const std::string &  name,
const Point &  center,
const Real  r 
)

Construct a new CSGSphere surface.

Parameters
nameunique name for the sphere surface
centercenter point of sphere
rradius of sphere

Definition at line 15 of file CSGSphere.C.

16 : CSGSurface(name), _x0(center(0)), _y0(center(1)), _z0(center(2)), _r(r)
17{
19}
Point center
Definition MortarUtils.C:58
Real _r
Value of r in equation of sphere.
Definition CSGSphere.h:88
Real _z0
Value of z0 in equation of sphere.
Definition CSGSphere.h:85
void checkRadius() const
Definition CSGSphere.C:46
Real _x0
Value of x0 in equation of sphere.
Definition CSGSphere.h:79
Real _y0
Value of y0 in equation of sphere.
Definition CSGSphere.h:82
CSGSurface(const std::string &name)
Default constructor.
Definition CSGSurface.C:17

◆ CSGSphere() [2/2]

CSG::CSGSphere::CSGSphere ( const std::string &  name,
const Real  r 
)

Construct a new CSGSphere surface.

Parameters
nameunique name for the sphere surface
rradius of sphere

Definition at line 21 of file CSGSphere.C.

22 : CSGSurface(name), _x0(0.0), _y0(0.0), _z0(0.0), _r(r)
23{
25}

◆ ~CSGSphere()

virtual CSG::CSGSphere::~CSGSphere ( )
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 CSG::CSGSurface::getHalfspaceFromPoint().

◆ checkRadius()

void CSG::CSGSphere::checkRadius ( ) const
protected

Definition at line 46 of file CSGSphere.C.

47{
48 if (_r <= 0.0)
49 mooseError("Radius of sphere must be positive.");
50}

Referenced by CSGSphere(), and CSGSphere().

◆ clone()

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

create clone of CSGSphere object

Returns
std::unordered_map<CSGSurface> unique_ptr to cloned sphere

Implements CSG::CSGSurface.

Definition at line 70 of file CSGSphere.h.

71 {
72 return std::make_unique<CSGSphere>(_name, Point(_x0, _y0, _z0), _r);
73 }
std::string _name
Name of surface.
Definition CSGSurface.h:122

◆ evaluateSurfaceEquationAtPoint()

Real CSG::CSGSphere::evaluateSurfaceEquationAtPoint ( const Point &  p) const
overridevirtual

given a point, determine its evaluation based on the equation of the sphere

Parameters
ppoint
Returns
evaluation of point based on surface equation

Implements CSG::CSGSurface.

Definition at line 35 of file CSGSphere.C.

36{
37 // Compute distance from the sphere center to determine if inside (< r^2)
38 // or outside (> r^2) the sphere
39 const Real dist_sq =
40 Utility::pow<2>((p(0) - _x0)) + Utility::pow<2>((p(1) - _y0)) + Utility::pow<2>((p(2) - _z0));
41
42 return dist_sq - Utility::pow<2>(_r);
43}
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ 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   
)
protectedinherited

Friends for unit testing.

◆ FRIEND_TEST() [5/5]

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

◆ getCoeffs()

std::unordered_map< std::string, Real > CSG::CSGSphere::getCoeffs ( ) const
overridevirtual

Get the coefficients (x0, y0, z0, r) for the equation of a sphere (x - x0)^2 + (y - y0)^2 + (z - z0)^2 = r^2.

Returns
map of coefficients (x0, y0, z0, and r) and their values

Implements CSG::CSGSurface.

Definition at line 28 of file CSGSphere.C.

29{
30 std::unordered_map<std::string, Real> coeffs = {{"x0", _x0}, {"y0", _y0}, {"z0", _z0}, {"r", _r}};
31 return coeffs;
32}

◆ getHalfspaceFromPoint()

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

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
inlineinherited

◆ getSurfaceType()

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

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 CSG::CSGSurface::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
inlinevirtualinherited

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 CSG::CSGSurface::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
inherited

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
inherited

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)
inlineprotectedinherited

Definition at line 119 of file CSGSurface.h.

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

Member Data Documentation

◆ _name

std::string CSG::CSGSurface::_name
protectedinherited

◆ _r

Real CSG::CSGSphere::_r
protected

Value of r in equation of sphere.

Definition at line 88 of file CSGSphere.h.

Referenced by checkRadius(), clone(), evaluateSurfaceEquationAtPoint(), and getCoeffs().

◆ _transformations

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

◆ _x0

Real CSG::CSGSphere::_x0
protected

Value of x0 in equation of sphere.

Definition at line 79 of file CSGSphere.h.

Referenced by clone(), evaluateSurfaceEquationAtPoint(), and getCoeffs().

◆ _y0

Real CSG::CSGSphere::_y0
protected

Value of y0 in equation of sphere.

Definition at line 82 of file CSGSphere.h.

Referenced by clone(), evaluateSurfaceEquationAtPoint(), and getCoeffs().

◆ _z0

Real CSG::CSGSphere::_z0
protected

Value of z0 in equation of sphere.

Definition at line 85 of file CSGSphere.h.

Referenced by clone(), evaluateSurfaceEquationAtPoint(), and getCoeffs().


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