https://mooseframework.inl.gov
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  Halfspace { Halfspace::POSITIVE, Halfspace::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. More...
 
 CSGSurface (const std::string &name, const std::string &surf_type)
 Construct a new CSGSurface. More...
 
virtual ~CSGSurface ()=default
 Destructor. More...
 
const std::string & getSurfaceType () const
 Get the Surface Type. More...
 
virtual std::unordered_map< std::string, RealgetCoeffs () const =0
 Get the coefficients that define the surface. More...
 
virtual Real evaluateSurfaceEquationAtPoint (const Point &p) const =0
 given a point, determine its evaluation based on the surface equation. More...
 
CSGSurface::Halfspace getHalfspaceFromPoint (const Point &p) const
 given a point, determine if it is in the positive or negative half-space for the surface More...
 
const std::string & getName () const
 Get the name of surface. More...
 
bool operator== (const CSGSurface &other) const
 Operator overload for checking if two CSGSurface objects are equal. More...
 
bool operator!= (const CSGSurface &other) const
 Operator overload for checking if two CSGSurface objects are not equal. More...
 
const std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > & getTransformations () const
 Get the list of transformations. More...
 
std::vector< std::pair< std::string, std::tuple< Real, Real, Real > > > getTransformationsAsStrings () const
 Get the transformations of this object with string representations for types. More...
 

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. More...
 
static std::string getTransformationTypeString (TransformationType type)
 Get the string representation of the transformation type. More...
 

Protected Member Functions

virtual std::unique_ptr< CSGSurfaceclone () const =0
 Create clone of current surface, to be implemented by derived class. More...
 
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. More...
 
Point applyReverseTransformsToPoint (Point p) const
 update the value of point p by applying the inverse of the list of transformations to the point More...
 
 FRIEND_TEST (CSGSurfaceTest, testSetName)
 Friends for unit testing. More...
 
 FRIEND_TEST (CSGSurfaceTest, testSurfaceEquality)
 
 FRIEND_TEST (CSGSurfaceTest, testHalfspaceWithTransform)
 Friends for unit testing. More...
 
 FRIEND_TEST (CSGSurfaceTest, testHalfspaceWithNullTransform)
 

Protected Attributes

std::string _name
 Name of surface. More...
 
const std::string _surface_type
 Type of surface that is being represented string is taken directly from the surface class name. More...
 
std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > _transformations
 List of transformations applied to this object. More...
 

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 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.

31  {
32  POSITIVE,
33  NEGATIVE
34  };

Constructor & Destructor Documentation

◆ CSGSurface() [1/2]

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

Default constructor.

Parameters
nameunique name of surface

◆ CSGSurface() [2/2]

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

Construct a new CSGSurface.

Parameters
nameunique name of surface
surf_typesurface type

Definition at line 16 of file CSGSurface.C.

17  : _name(name), _surface_type(surf_type)
18 {
20 }
const std::string _surface_type
Type of surface that is being represented string is taken directly from the surface class name...
Definition: CSGSurface.h:120
void checkValidCSGName(const std::string &name)
Check name of CSG component for disallowed characters and symbols.
Definition: CSGUtils.C:36
std::string _name
Name of surface.
Definition: CSGSurface.h:116

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

◆ 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.

Referenced by getHalfspaceFromPoint().

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 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
void scale(MeshBase &mesh, const Real xs, const Real ys=0., const Real zs=0.)
std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > _transformations
List of transformations applied to this object.
static TensorValue< Real > intrinsic_rotation_matrix(Real phi, Real theta, Real psi)

◆ 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::CSGPlane, CSG::CSGSphere, CSG::CSGXCylinder, CSG::CSGYCylinder, and CSG::CSGZCylinder.

◆ 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::CSGPlane, CSG::CSGSphere, CSG::CSGXCylinder, CSG::CSGYCylinder, and CSG::CSGZCylinder.

Referenced by getHalfspaceFromPoint().

◆ FRIEND_TEST() [1/4]

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

Friends for unit testing.

◆ FRIEND_TEST() [2/4]

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

◆ FRIEND_TEST() [3/4]

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

Friends for unit testing.

◆ FRIEND_TEST() [4/4]

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::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))
33  return Halfspace::POSITIVE;
34  else if (MooseUtils::absoluteFuzzyLessThan(eval, 0))
35  return Halfspace::NEGATIVE;
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 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
virtual Real evaluateSurfaceEquationAtPoint(const Point &p) const =0
given a point, determine its evaluation based on the surface equation.
Point applyReverseTransformsToPoint(Point p) const
update the value of point p by applying the inverse of the list of transformations to the point ...
std::string _name
Name of surface.
Definition: CSGSurface.h:116
const std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > & getTransformations() const
Get the list of transformations.

◆ getName()

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

Get the name of surface.

Returns
std::string name of surface

Definition at line 95 of file CSGSurface.h.

Referenced by CSG::CSGSurfaceList::addSurface(), CSG::CSGBase::addTransformation(), CSG::CSGBase::checkSurfaceInBase(), CSG::CSGBase::deleteSurface(), operator==(), and CSG::CSGSurfaceList::renameSurface().

95 { return _name; }
std::string _name
Name of surface.
Definition: CSGSurface.h:116

◆ getSurfaceType()

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

Get the Surface Type.

Returns
type of surface

Definition at line 61 of file CSGSurface.h.

Referenced by operator==().

61 { return _surface_type; }
const std::string _surface_type
Type of surface that is being represented string is taken directly from the surface class name...
Definition: CSGSurface.h:120

◆ getTransformations()

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

Get the list of transformations.

Returns
The list of transformations

Definition at line 47 of file CSGTransformationHelper.h.

Referenced by getHalfspaceFromPoint(), CSG::CSGUniverse::operator==(), operator==(), CSG::CSGCell::operator==(), and CSG::CSGLattice::operator==().

48  {
49  return _transformations;
50  }
std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > _transformations
List of transformations applied to this object.

◆ 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 }
static std::string getTransformationTypeString(TransformationType type)
Get the string representation of the transformation type.
std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > _transformations
List of transformations applied to this object.

◆ 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.

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

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:54
static const MooseEnum transformation_type_enum
MooseEnum for transformation types, matching the TransformationType enum values.

◆ 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.

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

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 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311

◆ operator!=()

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

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

Definition at line 54 of file CSGSurface.C.

55 {
56  return !(*this == other);
57 }

◆ 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  return (this->getName() == other.getName()) &&
48  (this->getSurfaceType() == other.getSurfaceType()) &&
49  (this->getCoeffs() == other.getCoeffs()) &&
50  (this->getTransformations() == other.getTransformations());
51 }
const std::string & getName() const
Get the name of surface.
Definition: CSGSurface.h:95
virtual std::unordered_map< std::string, Real > getCoeffs() const =0
Get the coefficients that define the surface.
const std::string & getSurfaceType() const
Get the Surface Type.
Definition: CSGSurface.h:61
const std::vector< std::pair< TransformationType, std::tuple< Real, Real, Real > > > & getTransformations() const
Get the list of transformations.

◆ setName()

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

Definition at line 113 of file CSGSurface.h.

113 { _name = name; }
std::string name(const ElemQuality q)
std::string _name
Name of surface.
Definition: CSGSurface.h:116

Friends And Related Function Documentation

◆ CSGBase

friend class CSGBase
friend

Definition at line 124 of file CSGSurface.h.

◆ CSGSurfaceList

friend class CSGSurfaceList
friend

Definition at line 123 of file CSGSurface.h.

Member Data Documentation

◆ _name

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

◆ _surface_type

const std::string CSG::CSGSurface::_surface_type
protected

Type of surface that is being represented string is taken directly from the surface class name.

Definition at line 120 of file CSGSurface.h.

Referenced by getSurfaceType().

◆ _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: