https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | Private Attributes | List of all members
CSG::CSGBase Class Reference

CSGBase creates an internal representation of a Constructive Solid Geometry (CSG) model. More...

#include <CSGBase.h>

Public Member Functions

 CSGBase ()
 Default constructor.
 
 CSGBase (const CSGBase &other_base)
 Copy constructor.
 
 ~CSGBase ()
 Destructor.
 
std::unique_ptr< CSGBaseclone () const
 Create a deep copy of this CSGBase instance.
 
const CSGSurfaceaddSurface (std::unique_ptr< CSGSurface > surf)
 add a unique surface pointer to this base instance
 
void deleteSurface (const CSGSurface &surface)
 Remove a Surface object passed in by reference from the stored surface list.
 
std::vector< std::reference_wrapper< const CSGSurface > > getAllSurfaces () const
 Get all surface objects.
 
const CSGSurfacegetSurfaceByName (const std::string &name) const
 Get a Surface object by name.
 
bool hasSurface (const std::string &name) const
 Check if a surface with given name exists in CSGBase object.
 
void renameSurface (const CSGSurface &surface, const std::string &name)
 rename the specified surface
 
const CSGCellcreateCell (const std::string &name, const std::string &mat_name, const CSGRegion &region, const CSGUniverse *add_to_univ=nullptr)
 Create a Material Cell object.
 
const CSGCellcreateCell (const std::string &name, const CSGRegion &region, const CSGUniverse *add_to_univ=nullptr)
 Create a Void Cell object.
 
const CSGCellcreateCell (const std::string &name, const CSGUniverse &fill_univ, const CSGRegion &region, const CSGUniverse *add_to_univ=nullptr)
 Create a Universe Cell object.
 
const CSGCellcreateCell (const std::string &name, const CSGLattice &fill_lattice, const CSGRegion &region, const CSGUniverse *add_to_univ=nullptr)
 Create a Lattice Cell object.
 
void deleteCell (const CSGCell &cell)
 Remove a Cell object passed in by reference from the stored cell list.
 
std::vector< std::reference_wrapper< const CSGCell > > getAllCells () const
 Get all cell objects.
 
const CSGCellgetCellByName (const std::string &name) const
 Get a Cell object by name.
 
bool hasCell (const std::string &name) const
 Check if a cell with given name exists in CSGBase object.
 
void renameCell (const CSGCell &cell, const std::string &name)
 rename the specified cell
 
void updateCellRegion (const CSGCell &cell, const CSGRegion &region)
 change the region of the specified cell
 
void resetCellFill (const CSGCell &cell)
 reset the fill of the specified cell to void
 
void updateCellFill (const CSGCell &cell, const std::string &mat_name)
 change the fill of the specified cell to a material fill
 
void updateCellFill (const CSGCell &cell, const CSGUniverse *univ)
 change the fill of the specified cell to a universe fill
 
void updateCellFill (const CSGCell &cell, const CSGLattice *lattice)
 change the fill of the specified cell to a lattice fill
 
const CSGUniversegetRootUniverse () const
 Get the Root Universe object.
 
void renameRootUniverse (const std::string &name)
 rename the root universe for this instance (default is ROOT_UNIVERSE)
 
void renameUniverse (const CSGUniverse &universe, const std::string &name)
 rename the specified universe
 
const CSGUniversecreateUniverse (const std::string &name)
 Create an empty Universe object.
 
const CSGUniversecreateUniverse (const std::string &name, std::vector< std::reference_wrapper< const CSGCell > > &cells)
 Create a Universe object from list of cells.
 
void deleteUniverse (const CSGUniverse &univ)
 Remove a Universe object passed in by reference from the stored universe list.
 
void addCellToUniverse (const CSGUniverse &universe, const CSGCell &cell)
 Add a cell to an existing universe.
 
void addCellsToUniverse (const CSGUniverse &universe, std::vector< std::reference_wrapper< const CSGCell > > &cells)
 Add a list of cells to an existing universe.
 
void removeCellFromUniverse (const CSGUniverse &universe, const CSGCell &cell)
 Remove a cell from an existing universe.
 
void removeCellsFromUniverse (const CSGUniverse &universe, std::vector< std::reference_wrapper< const CSGCell > > &cells)
 Remove a list of cells from an existing universe.
 
std::vector< std::reference_wrapper< const CSGUniverse > > getAllUniverses () const
 Get all universe objects.
 
const CSGUniversegetUniverseByName (const std::string &name)
 Get a universe object by name.
 
bool hasUniverse (const std::string &name) const
 Check if a universe with given name exists in CSGBase object.
 
template<typename LatticeType = CSGLattice>
const LatticeType & addLattice (std::unique_ptr< LatticeType > lattice)
 add a unique lattice pointer to this base instance; universes that make the lattice must already be a part of this CSGBase instance.
 
void deleteLattice (const CSGLattice &lattice)
 Remove a Lattice object passed in by reference from the stored lattice list.
 
void setUniverseAtLatticeIndex (const CSGLattice &lattice, const CSGUniverse &universe, std::pair< int, int > index)
 set location in the lattice to be the provided universe
 
void setLatticeUniverses (const CSGLattice &lattice, std::vector< std::vector< std::reference_wrapper< const CSGUniverse > > > &universes)
 Set provided universes as the layout of the lattice.
 
void renameLattice (const CSGLattice &lattice, const std::string &name)
 rename the lattice
 
void setLatticeOuter (const CSGLattice &lattice, const std::string &outer_name)
 Set the outer fill for the lattice to the material name provided.
 
void setLatticeOuter (const CSGLattice &lattice, const CSGUniverse &outer_univ)
 Set the outer fill for the lattice to the universe provided.
 
void resetLatticeOuter (const CSGLattice &lattice)
 reset the outer fill for the lattice to VOID
 
std::vector< std::reference_wrapper< const CSGLattice > > getAllLattices () const
 Get all lattice objects.
 
template<typename LatticeType = CSGLattice>
const LatticeType & getLatticeByName (const std::string &name)
 Get a lattice object of the specified type by name.
 
bool hasLattice (const std::string &name) const
 Check if a lattice with given name exists in CSGBase object.
 
template<typename T >
const T & addEngUnit (std::unique_ptr< T > unit, const CSGUniverse *add_to_univ=nullptr)
 Add an engineering unit (surface-, cell-, or universe-like object) to this CSGBase.
 
void deleteEngUnit (const CSGEngUnit &unit)
 Remove an engineering unit passed in by reference from the stored engineering unit list.
 
template<typename EngUnitType = CSGEngUnit>
const EngUnitType & getEngUnitByName (const std::string &name) const
 Get a engineering unit object of the specified type by name.
 
bool hasEngUnit (const std::string &name) const
 Check if an engineeering unit with given name exists in CSGBase object.
 
void renameEngUnit (const CSGEngUnit &unit, const std::string &name)
 Rename the specified engineering unit.
 
std::vector< std::reference_wrapper< const CSGEngUnit > > getAllEngUnits () const
 Get all engineering units of all types in CSGBase.
 
std::vector< std::reference_wrapper< const CSGSurfaceEngUnit > > getAllSurfaceEngUnits () const
 Get all surface-like engineering units in CSGBase.
 
std::vector< std::reference_wrapper< const CSGCellEngUnit > > getAllCellEngUnits () const
 Get all cell-like engineering units in CSGBase.
 
std::vector< std::reference_wrapper< const CSGUniverseEngUnit > > getAllUniverseEngUnits () const
 Get all universe-like engineering units.
 
CSGRegion expandEngUnit (const CSGSurfaceEngUnit &unit)
 Expand a surface-like engineering unit into basic CSGSurface(s) and return the CSGRegion representing the EngUnit's geometry.
 
const CSGCellexpandEngUnit (const CSGCellEngUnit &unit)
 Expand a cell-like engineering unit into a basic CSGCell.
 
const CSGUniverseexpandEngUnit (const CSGUniverseEngUnit &unit)
 Expand a universe-like engineering unit into a basic CSGUniverse.
 
void expandAllEngUnits ()
 Expand all registered engineering units into basic CSG objects.
 
bool areUniversesLinked () const
 Check whether all universes and cells in this CSGBase are reachable from the root universe through the cell/fill hierarchy.
 
void joinOtherBase (std::unique_ptr< CSGBase > base, const bool ignore_identical_components)
 Join another CSGBase object to this one.
 
void joinOtherBase (std::unique_ptr< CSGBase > base, const bool ignore_identical_components, const std::string &new_root_name_join)
 Join another CSGBase object to this one.
 
void joinOtherBase (std::unique_ptr< CSGBase > base, const bool ignore_identical_components, const std::string &new_root_name_base, const std::string &new_root_name_join)
 Join another CSGBase object to this one.
 
nlohmann::json generateOutput () const
 generate the JSON representation output for the CSG object
 
bool operator== (const CSGBase &other) const
 Operator overload for checking if two CSGBase objects are equal.
 
bool operator!= (const CSGBase &other) const
 Operator overload for checking if two CSGBase objects are not equal.
 
void addTransformation (const CSGObjectVariant &csg_object, TransformationType type, const std::tuple< Real, Real, Real > &values)
 Apply a transformation to a CSG object.
 
void addTransformation (const CSGEngUnit &unit, TransformationType type, const std::tuple< Real, Real, Real > &values)
 Apply a transformation to a CSGEngUnit object.
 
void applyTranslation (const CSGObjectVariant &csg_object, const std::tuple< Real, Real, Real > &distances)
 Apply a translation to a CSG object in the specified x, y, and z directions.
 
void applyTranslation (const CSGEngUnit &unit, const std::tuple< Real, Real, Real > &distances)
 Apply a translation to a CSGEngUnit object in the specified x, y, and z directions.
 
void applyRotation (const CSGObjectVariant &csg_object, const std::tuple< Real, Real, Real > &angles)
 Apply a rotation to a CSG object using (phi, theta, psi) angle notation (in degrees).
 
void applyRotation (const CSGEngUnit &unit, const std::tuple< Real, Real, Real > &angles)
 Apply a rotation to a CSG object using (phi, theta, psi) angle notation (in degrees).
 
void applyAxisRotation (const CSGObjectVariant &csg_object, RotationAxisType axis, const Real angle)
 Apply a rotation to a CSG object about a specified axis (X, Y, Z).
 
void applyAxisRotation (const CSGEngUnit &unit, RotationAxisType axis, const Real angle)
 Apply a rotation to a CSGEngUnit object about a specified axis (X, Y, Z).
 
void applyScaling (const CSGObjectVariant &csg_object, const std::tuple< Real, Real, Real > &values)
 Scale a CSG object in the specified x, y, and z directions.
 
void applyScaling (const CSGEngUnit &unit, const std::tuple< Real, Real, Real > &values)
 Scale a CSGEngUnit object in the specified x, y, and z directions.
 

Private Member Functions

CSGSurfacegetSurface (const std::string &name)
 Get a Surface object by name.
 
void expandAllEngUnitsCycle (std::set< std::set< std::string > > &all_type_sets)
 Recursive implementation of expandAllEngUnits().
 
void checkUniverseLinking () const
 Check universes linked to root universe match universes defined in _universe_list.
 
void getLinkedUniverses (const CSGUniverse &univ, std::vector< std::string > &linked_universe_names, std::vector< std::string > &linked_cell_names) const
 Recursive method to retrieve all universes and cells linked to current universe.
 
const CSGSurfaceListgetSurfaceList () const
 Get a const reference to the CSGSurfaceList object.
 
CSGSurfaceListgetSurfaceList ()
 Get a non-const reference to the CSGSurfaceList object.
 
const CSGCellListgetCellList () const
 Get a const reference to the CSGCellList object.
 
CSGCellListgetCellList ()
 Get a non-const reference to the CSGCellList object.
 
const CSGUniverseListgetUniverseList () const
 Get a const reference to the CSGUniverseList object.
 
CSGUniverseListgetUniverseList ()
 Get a non-const reference to the CSGUniverseList object.
 
const CSGLatticeListgetLatticeList () const
 Get a const reference to the CSGLatticeList object.
 
CSGLatticeListgetLatticeList ()
 Get the CSGLatticeList object.
 
void updateIncomingCSGReferences (CSGBase &incoming_base)
 update references of incoming CSGbase to point to those of existing CSGBase object.
 
void replaceSurfaceRefsByName (std::map< std::string, std::reference_wrapper< const CSGSurface > > &identical_surface_refs, CSGBase &base)
 update surface references of incoming CSGBase to point to those of existing CSGBase object based on CSGSurface name.
 
void replaceCellRefsByName (std::map< std::string, std::reference_wrapper< const CSGCell > > &identical_cell_refs, CSGBase &base)
 update cell references of incoming CSGbase to point to those of existing CSGBase object based on CSGCell name.
 
void replaceUniverseRefsByName (std::map< std::string, std::reference_wrapper< const CSGUniverse > > &identical_universe_refs, CSGBase &base)
 update universe references of incoming CSGbase to point to those of existing CSGBase object based on CSGUniverse name.
 
void replaceLatticeRefsByName (std::map< std::string, std::reference_wrapper< const CSGLattice > > &identical_lattice_refs, CSGBase &base)
 update lattice references of incoming CSGbase to point to those of existing CSGBase object based on CSGLattice name.
 
const CSGEngUnitListgetEngUnitList () const
 Get a const reference to the CSGEngUnitList object.
 
void joinSurfaceList (CSGSurfaceList &surf_list, const bool ignore_identical_surfaces)
 join a separate CSGSurfaceList object to this one
 
void joinCellList (CSGCellList &cell_list, const bool ignore_identical_cells)
 join a separate CSGCellList object to this one
 
void joinLatticeList (CSGLatticeList &lattice_list, const bool ignore_identical_lattices)
 join a separate CSGLatticeList object to this one
 
void joinUniverseList (CSGUniverseList &univ_list, const bool ignore_identical_universes)
 join a separate CSGUniverseList object to this one; root universes from univ_list will be combined into this root universe
 
void joinUniverseList (CSGUniverseList &univ_list, const bool ignore_identical_universes, const std::string &new_root_name_incoming)
 join a separate CSGUniverseList object to this one; the incoming root universe will be moved to a new universe of the new name specified.
 
void joinUniverseList (CSGUniverseList &univ_list, const bool ignore_identical_universes, const std::string &new_root_name_base, const std::string &new_root_name_incoming)
 join a separate CSGUniverseList object to this one; both this root universe and the incoming root universe will be maintained as separate universes of the specified names.
 
void rebuildEngUnitList ()
 rebuilds the list of raw pointers to engineering units by iterating through the surface, cell, and universe lists.
 
void replaceUniverseRefs (const CSGUniverse &old_univ, const CSGUniverse &new_univ)
 Replace all cell fills and lattice elements/outers referencing old_univ with new_univ.
 
void replaceCellRefs (const CSGCell &old_cell, const CSGCell &new_cell)
 Replace all old_cell references with new_cell across all universes in the base.
 
void replaceSurfaceRefsWithRegion (const CSGSurface &old_surf, const CSGRegion &sub_region)
 Replace all region occurrences of old_surf with the tokens from sub_region across all cells in the base.
 
void checkRegionSurfaces (const CSGRegion &region) const
 check that surfaces used in this region are a part of this CSGBase instance
 
bool checkSurfaceInBase (const CSGSurface &surface) const
 check that surface being accessed is a part of this CSGBase instance
 
bool checkCellInBase (const CSGCell &cell) const
 check that cell being accessed is a part of this CSGBase instance
 
bool checkEngUnitInBase (const CSGEngUnit &unit) const
 check that engineering unit being accessed is a part of this CSGBase instance
 
bool checkUniverseInBase (const CSGUniverse &universe) const
 check that universe being accessed is a part of this CSGBase instance
 
bool checkLatticeInBase (const CSGLattice &lattice) const
 check that lattice being accessed is a part of this CSGBase instance
 
void prepareSurfaceDeletion (const CSGSurface &surface) const
 error if surface is referenced in any cell region
 
void prepareCellDeletion (const CSGCell &cell)
 warn and remove cell from any universe that contains it
 
void prepareUniverseDeletion (const CSGUniverse &universe) const
 error if universe is the root, used in any lattice, or used as a cell fill
 
const CSGSurfaceEngUnitsurfaceToEngUnit (const CSGSurface &surf) const
 Returns the CSGSurfaceEngUnit pointer if surf is an eng unit, nullptr otherwise.
 
const CSGCellEngUnitcellToEngUnit (const CSGCell &cell) const
 Returns the CSGCellEngUnit pointer if cell is an eng unit, nullptr otherwise.
 
const CSGUniverseEngUnituniverseToEngUnit (const CSGUniverse &univ) const
 Returns the CSGUniverseEngUnit pointer if univ is an eng unit, nullptr otherwise.
 
const CSGCelladdCellToList (const CSGCell &cell)
 Add a new cell to the cell list based on a cell reference.
 
const CSGUniverseaddUniverseToList (const CSGUniverse &univ)
 Add a new universe to the universe list based on a universe reference.
 
const CSGLatticeaddLatticeToList (const CSGLattice &lattice)
 Add a new lattice to the lattice list based on a lattice reference.
 
 FRIEND_TEST (CSGBaseTest, testCheckRegionSurfaces)
 Friends for unit testing.
 
 FRIEND_TEST (CSGBaseTest, testAddGetSurface)
 
 FRIEND_TEST (CSGBaseTest, testUniverseLinking)
 
 FRIEND_TEST (CSGBaseTest, testEngUnitLinking)
 
 FRIEND_TEST (CSGBaseTest, testCellEngUnitAddErrors)
 
 FRIEND_TEST (CSGBaseTest, testUnivEngUnitAddErrors)
 

Private Attributes

CSGSurfaceList _surface_list
 List of surfaces associated with CSG object.
 
CSGCellList _cell_list
 List of cells associated with CSG object.
 
CSGUniverseList _universe_list
 List of universes associated with CSG object.
 
CSGLatticeList _lattice_list
 List of lattices associated with CSG object.
 
CSGEngUnitList _eng_unit_list
 Container for all associated engineering units.
 

Detailed Description

CSGBase creates an internal representation of a Constructive Solid Geometry (CSG) model.

Definition at line 53 of file CSGBase.h.

Constructor & Destructor Documentation

◆ CSGBase() [1/2]

CSG::CSGBase::CSGBase ( )

Default constructor.

Definition at line 17 of file CSGBase.C.

18 : _surface_list(CSGSurfaceList()),
19 _cell_list(CSGCellList()),
20 _universe_list(CSGUniverseList()),
21 _lattice_list(CSGLatticeList())
22{
23}
CSGCellList _cell_list
List of cells associated with CSG object.
Definition CSGBase.h:1256
CSGSurfaceList _surface_list
List of surfaces associated with CSG object.
Definition CSGBase.h:1253
CSGLatticeList _lattice_list
List of lattices associated with CSG object.
Definition CSGBase.h:1262
CSGUniverseList _universe_list
List of universes associated with CSG object.
Definition CSGBase.h:1259

◆ CSGBase() [2/2]

CSG::CSGBase::CSGBase ( const CSGBase other_base)

Copy constructor.

Definition at line 25 of file CSGBase.C.

26 : _surface_list(other_base.getSurfaceList()),
27 _cell_list(CSGCellList()),
28 _universe_list(CSGUniverseList()),
29 _lattice_list(CSGLatticeList())
30{
31 // Add all engineering units first so the recursive addCellToList / addUniverseToList calls
32 // below can find them via hasCell() / hasUniverse() and return early without erroring.
33 // Cell engineering units do not have universes and universe engineering units do not contain
34 // cells in the same way that the plain objects do, so we do not need to worry about recursion.
35
36 // Bypass addCellToList because it doesn't properly handle engineering units and also bypass
37 // addEngUnit for cells to avoid erroneously adding it to the root universe if it is not
38 // necessary.
39 for (const auto & eng_unit : other_base.getAllCellEngUnits())
40 _cell_list.addCell(eng_unit.get().clone());
41
42 for (const auto & eng_unit : other_base.getAllUniverseEngUnits())
43 addEngUnit(eng_unit.get().clone());
44
45 // Iterate through all non-eng unit cell references from the other CSGBase instance and
46 // create new CSGCell pointers based on these references. This is done
47 // recursively to properly handle cells with universe fills.
48 for (const auto & [name, cell] : other_base.getCellList().getCellListMap())
49 if (!cellToEngUnit(*cell))
50 addCellToList(*cell);
51
52 // Link all cells in other_base root universe to current root universe
53 for (auto & root_cell : other_base.getRootUniverse().getAllCells())
54 {
55 const auto & list_cell = _cell_list.getCell(root_cell.get().getName());
57 }
58
59 // Iterate through all non-eng unit universe references from the other CSGBase instance and
60 // create new CSGUniverse pointers based on these references. This is done in case
61 // any universe exist in the universe list that are not connected to the cell list.
62 for (const auto & [name, univ] : other_base.getUniverseList().getUniverseListMap())
63 if (!universeToEngUnit(*univ))
64 addUniverseToList(*univ);
65
66 // Iterate through all lattice references from the other CSGBase instance and
67 // create new CSGLattice pointers based on these references.
68 for (const auto & [name, lattice] : other_base.getLatticeList().getLatticeListMap())
69 addLatticeToList(*lattice);
70
71 // Rebuild the eng unit index from the now-complete surface, cell, and universe lists.
73}
if(!dmm->_nl) SETERRQ(PETSC_COMM_WORLD
const CSGCell & addCellToList(const CSGCell &cell)
Add a new cell to the cell list based on a cell reference.
Definition CSGBase.C:118
const CSGCellList & getCellList() const
Get a const reference to the CSGCellList object.
Definition CSGBase.h:978
std::unique_ptr< CSGBase > clone() const
Create a deep copy of this CSGBase instance.
Definition CSGBase.h:72
const CSGLattice & addLatticeToList(const CSGLattice &lattice)
Add a new lattice to the lattice list based on a lattice reference.
Definition CSGBase.C:184
const CSGUniverse & addUniverseToList(const CSGUniverse &univ)
Add a new universe to the universe list based on a universe reference.
Definition CSGBase.C:159
std::vector< std::reference_wrapper< const CSGUniverseEngUnit > > getAllUniverseEngUnits() const
Get all universe-like engineering units.
Definition CSGBase.h:654
std::vector< std::reference_wrapper< const CSGCell > > getAllCells() const
Get all cell objects.
Definition CSGBase.h:199
const CSGUniverseList & getUniverseList() const
Get a const reference to the CSGUniverseList object.
Definition CSGBase.h:992
void rebuildEngUnitList()
rebuilds the list of raw pointers to engineering units by iterating through the surface,...
Definition CSGBase.C:979
const CSGLatticeList & getLatticeList() const
Get a const reference to the CSGLatticeList object.
Definition CSGBase.h:1006
const CSGUniverse & getRootUniverse() const
Get the Root Universe object.
Definition CSGBase.h:272
const CSGUniverseEngUnit * universeToEngUnit(const CSGUniverse &univ) const
Returns the CSGUniverseEngUnit pointer if univ is an eng unit, nullptr otherwise.
Definition CSGBase.h:1223
std::vector< std::reference_wrapper< const CSGCellEngUnit > > getAllCellEngUnits() const
Get all cell-like engineering units in CSGBase.
Definition CSGBase.h:644
void addCellToUniverse(const CSGUniverse &universe, const CSGCell &cell)
Add a cell to an existing universe.
Definition CSGBase.C:507
const T & addEngUnit(std::unique_ptr< T > unit, const CSGUniverse *add_to_univ=nullptr)
Add an engineering unit (surface-, cell-, or universe-like object) to this CSGBase.
Definition CSGBase.h:534
const CSGCellEngUnit * cellToEngUnit(const CSGCell &cell) const
Returns the CSGCellEngUnit pointer if cell is an eng unit, nullptr otherwise.
Definition CSGBase.h:1211
CSGCell & getCell(const std::string &name) const
Get the CSGCell by name.
Definition CSGCellList.C:44
const Elem & get(const ElemType type_in)

◆ ~CSGBase()

CSG::CSGBase::~CSGBase ( )

Destructor.

Definition at line 75 of file CSGBase.C.

75{}

Member Function Documentation

◆ addCellsToUniverse()

void CSG::CSGBase::addCellsToUniverse ( const CSGUniverse universe,
std::vector< std::reference_wrapper< const CSGCell > > &  cells 
)

Add a list of cells to an existing universe.

Parameters
universeuniverse to which to add the cells
cellslist of references to cells to add

Definition at line 529 of file CSGBase.C.

531{
532 for (auto & c : cells)
533 addCellToUniverse(universe, c);
534}

Referenced by createUniverse().

◆ addCellToList()

const CSGCell & CSG::CSGBase::addCellToList ( const CSGCell cell)
private

Add a new cell to the cell list based on a cell reference.

This method is called by the copy constructor of CSGBase

Parameters
cellreference to CSGCell that should be added to cell list

Definition at line 118 of file CSGBase.C.

119{
120 // If cell has already been created, we just return a reference to it
121 const auto name = cell.getName();
122 if (_cell_list.hasCell(name))
123 return _cell_list.getCell(name);
124
125 // Engineering unit cells must be registered via addEngUnit(), not addCellToList()
126 if (cellToEngUnit(cell))
127 mooseError("Cell '",
128 name,
129 "' is a CSGCellEngUnit and must be added via addEngUnit(), not addCellToList().");
130
131 // Otherwise if the cell has material or void cell, we can create it directly
132 const auto fill_type = cell.getFillType();
133 const auto region = cell.getRegion();
134 if (fill_type == "VOID")
135 return _cell_list.addVoidCell(name, region);
136 else if (fill_type == "CSG_MATERIAL")
137 {
138 const auto mat_name = cell.getFillMaterial();
139 return _cell_list.addMaterialCell(name, mat_name, region);
140 }
141 else if (fill_type == "LATTICE")
142 {
143 // add lattice recursively to capture all linked universes in the lattice
144 const CSGLattice & lattice = addLatticeToList(cell.getFillLattice());
145 return _cell_list.addLatticeCell(name, lattice, region);
146 }
147 // Otherwise if the cell has a universe fill, we need to recursively define
148 // all linked universes and cells first before defining this cell
149 else if (fill_type == "UNIVERSE")
150 {
151 const auto & univ = addUniverseToList(cell.getFillUniverse());
152 return _cell_list.addUniverseCell(name, univ, region);
153 }
154 else
155 mooseError("Cell " + name + " has unrecognized fill type " + fill_type);
156}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
CSGCell & addLatticeCell(const std::string &name, const CSGLattice &lattice, const CSGRegion &region)
Add a Lattice Cell object to cell list.
Definition CSGCellList.C:75
bool hasCell(const std::string &name) const
return whether cell with given name exists in cell list
Definition CSGCellList.h:85
CSGCell & addVoidCell(const std::string &name, const CSGRegion &region)
Add a Void Cell object cell list.
Definition CSGCellList.C:53
CSGCell & addMaterialCell(const std::string &name, const std::string &mat_name, const CSGRegion &region)
Add a Material Cell object to cell list.
Definition CSGCellList.C:59
CSGCell & addUniverseCell(const std::string &name, const CSGUniverse &univ, const CSGRegion &region)
Add a Universe Cell object to cell list.
Definition CSGCellList.C:67
const std::string & getFillMaterial() const
Get the cell fill material name if fill fype is CSG_MATERIAL.
Definition CSGCell.C:68
std::string name(const ElemQuality q)

Referenced by addUniverseToList(), and CSGBase().

◆ addCellToUniverse()

void CSG::CSGBase::addCellToUniverse ( const CSGUniverse universe,
const CSGCell cell 
)

Add a cell to an existing universe.

Parameters
universeuniverse to which to add the cell
cellcell to add

Definition at line 507 of file CSGBase.C.

508{
509 // if universe is actually engineering unit, cannot add cells
510 if (universeToEngUnit(universe))
511 mooseError("Universe '" + universe.getName() +
512 "' cannot add cells because it is a CSGUniverseEngUnit.");
513
514 // make sure cell is a part of this CSGBase instance
515 if (!checkCellInBase(cell))
516 mooseError("A cell named " + cell.getName() + " is being added to universe " +
517 universe.getName() +
518 " that is different from the cell of the same name in the CSGBase instance.");
519 // make sure universe is a part of this CSGBase instance
520 if (!checkUniverseInBase(universe))
521 mooseError("Cells are being added to a universe named " + universe.getName() +
522 " that is different " +
523 "from the universe of the same name in the CSGBase instance.");
524 auto & univ = _universe_list.getUniverse(universe.getName());
525 univ.addCell(cell);
526}
bool checkCellInBase(const CSGCell &cell) const
check that cell being accessed is a part of this CSGBase instance
Definition CSGBase.C:1090
bool checkUniverseInBase(const CSGUniverse &universe) const
check that universe being accessed is a part of this CSGBase instance
Definition CSGBase.C:1100
CSGUniverse & getUniverse(const std::string &name) const
Get a Universe from the list by its name.
void addCell(const CSGCell &cell)
add cell to universe
Definition CSGUniverse.C:29

Referenced by addCellsToUniverse(), addEngUnit(), createCell(), createCell(), createCell(), createCell(), and CSGBase().

◆ addEngUnit()

template<typename T >
const T & CSG::CSGBase::addEngUnit ( std::unique_ptr< T >  unit,
const CSGUniverse add_to_univ = nullptr 
)
inline

Add an engineering unit (surface-, cell-, or universe-like object) to this CSGBase.

Template Parameters
Ta type derived from CSGSurfaceEngUnit, CSGCellEngUnit, or CSGUniverseEngUnit
Parameters
unitunique_ptr to the engineering unit to register
add_to_univoptional pointer to a CSGUniverse object to which a CSGCellEngUnit should be added. If not specified, the CSGCellEngUnit will be added to the root universe. For other CSGEngUnit types, this will be ignored. This universe cannot be a CSGUniverseEngUnit.
Returns
const reference to the stored engineering unit

Definition at line 534 of file CSGBase.h.

535 {
536 static_assert(std::is_base_of_v<CSGEngUnit, T>, "T must derive from CSGEngUnit");
537 static_assert(std::is_base_of_v<CSGSurface, T> || std::is_base_of_v<CSGCell, T> ||
538 std::is_base_of_v<CSGUniverse, T>,
539 "T must also derive from CSGSurface, CSGCell, or CSGUniverse");
540 // create raw pointer so we can transfer ownership to the proper type list without destroying
541 // it, and also can store the pointer in the CSGEngUnitList (non-owning list)
542 T * raw = unit.get();
543
544 // must check if an engineering unit of the same name (regardless of type) exists already before
545 // adding it to any list so that we don't add to a type-list before knowing if it is actually
546 // allowable as a unit. The addX checks below will check that the name doesn't conflict with a
547 // real type unit too.
548 if (_eng_unit_list.hasEngUnit(raw->getName()))
550 "An engineering unit with name '", raw->getName(), "' already exists in geometry.");
551
552 // Transfer ownership to the appropriate type list
553 if constexpr (std::is_base_of_v<CSGSurface, T>)
554 _surface_list.addSurface(std::move(unit));
555 else if constexpr (std::is_base_of_v<CSGCell, T>)
556 {
557 // must add a cell unit to the appropriate universe
558 auto & cell = _cell_list.addCell(std::move(unit));
559 if (add_to_univ)
560 addCellToUniverse(*add_to_univ, cell);
561 else
563 }
564 else if constexpr (std::is_base_of_v<CSGUniverse, T>)
565 _universe_list.addUniverse(std::move(unit));
566
567 // Register non-owning pointer in the CSGEngUnitList if no name conflicts identified above.
568 _eng_unit_list.addEngUnit(static_cast<CSGEngUnit &>(*raw));
569 return *raw;
570 }
CSGEngUnitList _eng_unit_list
Container for all associated engineering units.
Definition CSGBase.h:1265
CSGCell & addCell(std::unique_ptr< CSGCell > cell, const bool ignore_identical_cell=false)
add a cell to the CellList.
Definition CSGCellList.C:18
CSGEngUnit & addEngUnit(CSGEngUnit &unit)
Register an engineering unit in this index.
bool hasEngUnit(const std::string &name) const
Return whether an engineering unit with the given name exists in this list.
CSGSurface & addSurface(std::unique_ptr< CSGSurface > surf, const bool ignore_identical_surface=false)
add a surface object to existing SurfaceList.
CSGUniverse & addUniverse(const std::string &name)
create an empty universe

Referenced by CSGBase().

◆ addLattice()

template<typename LatticeType = CSGLattice>
const LatticeType & CSG::CSGBase::addLattice ( std::unique_ptr< LatticeType >  lattice)
inline

add a unique lattice pointer to this base instance; universes that make the lattice must already be a part of this CSGBase instance.

Parameters
latticepointer to lattice to add
Returns
reference to CSGLattice that was added

Definition at line 393 of file CSGBase.h.

394 {
395 static_assert(std::is_base_of_v<CSGLattice, LatticeType>, "Is not a CSGLattice");
396 // make sure all universes are a part of this base instance
397 auto universes = lattice->getUniverses();
398 for (auto univ_list : universes)
399 for (const CSGUniverse & univ : univ_list)
400 if (!checkUniverseInBase(univ))
401 mooseError("Cannot add lattice " + lattice->getName() + " of type " + lattice->getType() +
402 ". Universe " + univ.getName() + " is not in the CSGBase instance.");
403
404 if (lattice->getOuterType() == "UNIVERSE")
405 {
406 const CSGUniverse & outer_univ = lattice->getOuterUniverse();
407 if (!checkUniverseInBase(outer_univ))
408 mooseError("Cannot add lattice " + lattice->getName() + " of type " + lattice->getType() +
409 ". Outer universe " + outer_univ.getName() + " is not in the CSGBase instance.");
410 }
411 auto & lat_ref = _lattice_list.addLattice(std::move(lattice));
412 return dynamic_cast<LatticeType &>(lat_ref);
413 }
for(PetscInt i=0;i< nvars;++i)
CSGLattice & addLattice(std::unique_ptr< CSGLattice > lattice, const bool ignore_identical_lattice=false)
add an existing lattice to list.

Referenced by addLatticeToList().

◆ addLatticeToList()

const CSGLattice & CSG::CSGBase::addLatticeToList ( const CSGLattice lattice)
private

Add a new lattice to the lattice list based on a lattice reference.

This method is called by the copy constructor of CSGBase

Parameters
latticereference to CSGLattice that should be added to universe list

Definition at line 184 of file CSGBase.C.

185{
186 // If lattice has already been created, we just return a reference to it
187 const auto name = lattice.getName();
188 if (_lattice_list.hasLattice(name))
189 return _lattice_list.getLattice(name);
190
191 // Clone the lattice (associated universes need to be transferred and set)
192 auto cloned_lattice = lattice.clone();
193
194 // If lattice has associated universes, we need to add them to this CSGBase instance as well.
195 // addUniverseToList is called recursively in case associated universes have not been added to
196 // the universe list yet.
197 std::vector<std::vector<std::reference_wrapper<const CSGUniverse>>> current_univ_map;
198 for (const auto & univ_list : lattice.getUniverses())
199 {
200 std::vector<std::reference_wrapper<const CSGUniverse>> current_univ_list;
201 for (const auto & univ_ref : univ_list)
202 current_univ_list.push_back(addUniverseToList(univ_ref.get()));
203 current_univ_map.push_back(current_univ_list);
204 }
205
206 // Set universes only if lattice has universes defined
207 if (current_univ_map.size() > 0)
208 cloned_lattice->setUniverses(current_univ_map);
209
210 // Update reference to outer universe if it exists
211 if (lattice.getOuterType() == "UNIVERSE")
212 {
213 const auto & outer_univ_ref = addUniverseToList(lattice.getOuterUniverse());
214 cloned_lattice->updateOuter(outer_univ_ref);
215 }
216
217 // Use addLattice to add the cloned lattice
218 return addLattice(std::move(cloned_lattice));
219}
const LatticeType & addLattice(std::unique_ptr< LatticeType > lattice)
add a unique lattice pointer to this base instance; universes that make the lattice must already be a...
Definition CSGBase.h:393
CSGLattice & getLattice(const std::string &name) const
Get a Lattice from the list by its name.
bool hasLattice(const std::string &name) const
return whether lattice with given name exists in lattice list
virtual std::unique_ptr< CSGLattice > clone() const =0

Referenced by addCellToList(), and CSGBase().

◆ addSurface()

const CSGSurface & CSG::CSGBase::addSurface ( std::unique_ptr< CSGSurface surf)

add a unique surface pointer to this base instance

Parameters
surfpointer to surface to add
Returns
reference to CSGSurface that was added

Definition at line 78 of file CSGBase.C.

79{
80 if (surfaceToEngUnit(*surf))
81 mooseError("Surface '",
82 surf->getName(),
83 "' is a CSGSurfaceEngUnit and must be added via addEngUnit(), not addSurface().");
84 return _surface_list.addSurface(std::move(surf));
85}
const CSGSurfaceEngUnit * surfaceToEngUnit(const CSGSurface &surf) const
Returns the CSGSurfaceEngUnit pointer if surf is an eng unit, nullptr otherwise.
Definition CSGBase.h:1199

◆ addTransformation() [1/2]

void CSG::CSGBase::addTransformation ( const CSGEngUnit unit,
TransformationType  type,
const std::tuple< Real, Real, Real > &  values 
)
inline

Apply a transformation to a CSGEngUnit object.

Parameters
unitThe CSGEngUnit object to transform (CSGEngUnit, CSGSurfaceEngUnit, CSGCellEngUnit, CSGUniverseEngUnit, or any derived type)
typeThe type of transformation to apply (TRANSLATION, ROTATION, SCALE)
valuestuple of transformation values (3 values for any transformation type)
Note
Required because engineering unit types derive from both a plain CSG base and CSGEngUnit, so passing one to the CSGObjectVariant overload is ambiguous and will not compile; this overload binds to CSGEngUnit directly to disambiguate.

Definition at line 802 of file CSGBase.h.

805 {
806 addTransformation(CSGObjectVariant{std::cref(unit)}, type, values);
807 }
std::array< Real, 2 > values
Definition MortarUtils.C:52
void addTransformation(const CSGObjectVariant &csg_object, TransformationType type, const std::tuple< Real, Real, Real > &values)
Apply a transformation to a CSG object.
Definition CSGBase.C:635
std::variant< std::reference_wrapper< const CSGSurface >, std::reference_wrapper< const CSGCell >, std::reference_wrapper< const CSGUniverse >, std::reference_wrapper< const CSGRegion >, std::reference_wrapper< const CSGLattice >, std::reference_wrapper< const CSGEngUnit > > CSGObjectVariant
Define a variant type that can hold references to different CSG object types.
Definition CSGBase.h:47

◆ addTransformation() [2/2]

void CSG::CSGBase::addTransformation ( const CSGObjectVariant csg_object,
TransformationType  type,
const std::tuple< Real, Real, Real > &  values 
)

Apply a transformation to a CSG object.

Parameters
csg_objectThe CSG object to transform (Surface, Cell, Universe, Region, or Lattice)
typeThe type of transformation to apply (TRANSLATION, ROTATION, SCALE)
valuestuple of transformation values (3 values for any transformation type)

Definition at line 635 of file CSGBase.C.

638{
639 // Use std::visit to handle each type in the variant
640 std::visit(
641 [&](const auto & obj)
642 {
643 using T = std::decay_t<decltype(obj.get())>;
644
645 // Handle each CSG object type differently because each needs to check that it exists in
646 // this base instance
647 if constexpr (std::is_same_v<T, CSGCell>)
648 {
649 const CSGCell & cell = obj.get();
650 if (!checkCellInBase(cell))
651 mooseError("Cannot apply transformation to cell ",
652 cell.getName(),
653 " that is not in this CSGBase instance.");
654
655 // Get non-const reference and apply transformation
656 CSGCell & mutable_cell = _cell_list.getCell(cell.getName());
657 mooseAssert(mutable_cell == cell, "Mutable cell does not match const cell passed in.");
658 mutable_cell.addTransformation(type, values);
659 }
660 else if constexpr (std::is_same_v<T, CSGSurface>)
661 {
662 const CSGSurface & surface = obj.get();
663 if (!checkSurfaceInBase(surface))
664 mooseError("Cannot apply transformation to surface ",
665 surface.getName(),
666 " that is not in this CSGBase instance.");
667
668 // Get non-const reference and apply transformation
669 CSGSurface & mutable_surface = _surface_list.getSurface(surface.getName());
670 mooseAssert(mutable_surface == surface,
671 "Mutable surface does not match const surface passed in.");
672 mutable_surface.addTransformation(type, values);
673 }
674 else if constexpr (std::is_same_v<T, CSGUniverse>)
675 {
676 const CSGUniverse & universe = obj.get();
677 if (!checkUniverseInBase(universe))
678 mooseError("Cannot apply transformation to universe ",
679 universe.getName(),
680 " that is not in this CSGBase instance.");
681
682 // Get non-const reference and apply transformation
683 CSGUniverse & mutable_universe = _universe_list.getUniverse(universe.getName());
684 mooseAssert(mutable_universe == universe,
685 "Mutable universe does not match const universe passed in.");
686 mutable_universe.addTransformation(type, values);
687 }
688 else if constexpr (std::is_same_v<T, CSGLattice>)
689 {
690 const CSGLattice & lattice = obj.get();
691 if (!checkLatticeInBase(lattice))
692 mooseError("Cannot apply transformation to lattice ",
693 lattice.getName(),
694 " that is not in this CSGBase instance.");
695
696 // Get non-const reference and apply transformation
697 CSGLattice & mutable_lattice = _lattice_list.getLattice(lattice.getName());
698 mooseAssert(mutable_lattice == lattice,
699 "Mutable lattice does not match const lattice passed in.");
700 mutable_lattice.addTransformation(type, values);
701 }
702 else if constexpr (std::is_same_v<T, CSGRegion>)
703 {
704 // iterate on the surfaces of the region and apply the transformation to those surfaces
705 const CSGRegion & region = obj.get();
706 const auto surfaces = region.getSurfaces();
707 for (const CSGSurface & surface : surfaces)
708 {
709 if (!checkSurfaceInBase(surface))
710 mooseError("Cannot apply transformation to region with surface ",
711 surface.getName(),
712 " that is not in this CSGBase instance.");
713 addTransformation(surface, type, values);
714 }
715 }
716 else if constexpr (std::is_same_v<T, CSGEngUnit>)
717 {
718 const CSGEngUnit & eng_unit = obj.get();
719 if (!checkEngUnitInBase(eng_unit))
720 mooseError("Cannot apply transformation to engineering unit ",
721 eng_unit.getName(),
722 " that is not in this CSGBase instance.");
723
724 CSGEngUnit & mutable_eng = _eng_unit_list.getEngUnit(eng_unit.getName());
725 if (auto * s = dynamic_cast<CSGSurfaceEngUnit *>(&mutable_eng))
726 s->addTransformation(type, values);
727 else if (auto * c = dynamic_cast<CSGCellEngUnit *>(&mutable_eng))
728 c->addTransformation(type, values);
729 else if (auto * u = dynamic_cast<CSGUniverseEngUnit *>(&mutable_eng))
730 u->addTransformation(type, values);
731 else
732 mooseError("Engineering unit '",
733 eng_unit.getName(),
734 "' has an unrecognized type for transformation.");
735 }
736 else
737 mooseError("Transformation not implemented for this object type: ", typeid(T).name());
738 },
739 csg_object);
740}
bool checkSurfaceInBase(const CSGSurface &surface) const
check that surface being accessed is a part of this CSGBase instance
Definition CSGBase.C:1080
bool checkEngUnitInBase(const CSGEngUnit &unit) const
check that engineering unit being accessed is a part of this CSGBase instance
Definition CSGBase.C:1120
bool checkLatticeInBase(const CSGLattice &lattice) const
check that lattice being accessed is a part of this CSGBase instance
Definition CSGBase.C:1110
CSGEngUnit & getEngUnit(const std::string &name) const
Get an engineering unit by name.
CSGSurface & getSurface(const std::string &name) const
Get a surface by name.

Referenced by addTransformation(), addTransformation(), applyAxisRotation(), applyRotation(), applyRotation(), applyScaling(), applyScaling(), applyTranslation(), and applyTranslation().

◆ addUniverseToList()

const CSGUniverse & CSG::CSGBase::addUniverseToList ( const CSGUniverse univ)
private

Add a new universe to the universe list based on a universe reference.

This method is called by the copy constructor of CSGBase

Parameters
univreference to CSGUniverse that should be added to universe list

Definition at line 159 of file CSGBase.C.

160{
161 // If universe has already been created, we just return a reference to it
162 const auto name = univ.getName();
163 if (_universe_list.hasUniverse(name))
164 return _universe_list.getUniverse(name);
165
166 // Engineering unit universes must be registered via addEngUnit(), not addUniverseToList()
167 if (universeToEngUnit(univ))
168 mooseError("Universe '",
169 name,
170 "' is a CSGUniverseEngUnit and must be added via addEngUnit(), not "
171 "addUniverseToList().");
172
173 // Otherwise we create a new universe based on its associated cells.
174 // addCellToList is called recursively in case associated cells have not
175 // been added to the cell list yet.
176 const auto univ_cells = univ.getAllCells();
177 std::vector<std::reference_wrapper<const CSGCell>> current_univ_cells;
178 for (const auto & univ_cell : univ_cells)
179 current_univ_cells.push_back(addCellToList(univ_cell));
180 return createUniverse(name, current_univ_cells);
181}
const CSGUniverse & createUniverse(const std::string &name)
Create an empty Universe object.
Definition CSGBase.h:298
bool hasUniverse(const std::string &name) const
return whether universe with given name exists in universe list

Referenced by addCellToList(), addLatticeToList(), and CSGBase().

◆ applyAxisRotation() [1/2]

void CSG::CSGBase::applyAxisRotation ( const CSGEngUnit unit,
RotationAxisType  axis,
const Real  angle 
)
inline

Apply a rotation to a CSGEngUnit object about a specified axis (X, Y, Z).

Parameters
unitThe CSGEngUnit object to rotate (CSGEngUnit, CSGSurfaceEngUnit, CSGCellEngUnit, CSGUniverseEngUnit, or any derived type)
axisAxis type (X, Y, or Z) about which to rotate
angleangle in degrees to rotate about the specified axis
Note
Required because engineering unit types derive from both a plain CSG base and CSGEngUnit, so passing one to the CSGObjectVariant overload is ambiguous and will not compile; this overload binds to CSGEngUnit directly to disambiguate.

Definition at line 888 of file CSGBase.h.

889 {
890 applyAxisRotation(CSGObjectVariant{std::cref(unit)}, axis, angle);
891 }
void applyAxisRotation(const CSGObjectVariant &csg_object, RotationAxisType axis, const Real angle)
Apply a rotation to a CSG object about a specified axis (X, Y, Z).
Definition CSGBase.C:743

◆ applyAxisRotation() [2/2]

void CSG::CSGBase::applyAxisRotation ( const CSGObjectVariant csg_object,
RotationAxisType  axis,
const Real  angle 
)

Apply a rotation to a CSG object about a specified axis (X, Y, Z).

Parameters
csg_objectThe CSG object to rotate (Surface, Cell, Universe, Region, or Lattice)
axisAxis type (X, Y, or Z) about which to rotate
angleangle in degrees to rotate about the specified axis

Definition at line 743 of file CSGBase.C.

746{
747 // convert to the Euler angles (phi, theta, psi) based on axis
748 Real phi = 0.0;
749 Real theta = 0.0;
750 Real psi = 0.0;
751
752 switch (axis)
753 {
755 theta = angle;
756 break;
758 phi = 90.0;
759 theta = angle;
760 psi = -90.0;
761 break;
763 phi = angle;
764 break;
765 default:
766 mooseError("Invalid axis type provided for axis rotation.");
767 }
768
769 addTransformation(csg_object, TransformationType::ROTATION, std::make_tuple(phi, theta, psi));
770}
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

Referenced by applyAxisRotation().

◆ applyRotation() [1/2]

void CSG::CSGBase::applyRotation ( const CSGEngUnit unit,
const std::tuple< Real, Real, Real > &  angles 
)
inline

Apply a rotation to a CSG object using (phi, theta, psi) angle notation (in degrees).

Parameters
unitThe CSGEngUnit object to rotate (CSGEngUnit, CSGSurfaceEngUnit, CSGCellEngUnit, CSGUniverseEngUnit, or any derived type)
anglessize 3 tuple {phi, theta, psi} with rotation angles in degrees
Note
Required because engineering unit types derive from both a plain CSG base and CSGEngUnit, so passing one to the CSGObjectVariant overload is ambiguous and will not compile; this overload binds to CSGEngUnit directly to disambiguate.

Definition at line 861 of file CSGBase.h.

862 {
864 }

◆ applyRotation() [2/2]

void CSG::CSGBase::applyRotation ( const CSGObjectVariant csg_object,
const std::tuple< Real, Real, Real > &  angles 
)
inline

Apply a rotation to a CSG object using (phi, theta, psi) angle notation (in degrees).

Parameters
csg_objectThe CSG object to rotate (Surface, Cell, Universe, Region, or Lattice)
anglessize 3 tuple {phi, theta, psi} with rotation angles in degrees

Definition at line 844 of file CSGBase.h.

846 {
848 }

◆ applyScaling() [1/2]

void CSG::CSGBase::applyScaling ( const CSGEngUnit unit,
const std::tuple< Real, Real, Real > &  values 
)
inline

Scale a CSGEngUnit object in the specified x, y, and z directions.

Parameters
unitThe CSGEngUnit object to scale (CSGEngUnit, CSGSurfaceEngUnit, CSGCellEngUnit, CSGUniverseEngUnit, or any derived type)
valuessize 3 tuple with scaling values in x, y, and z directions {x, y, z}
Note
Required because engineering unit types derive from both a plain CSG base and CSGEngUnit, so passing one to the CSGObjectVariant overload is ambiguous and will not compile; this overload binds to CSGEngUnit directly to disambiguate.

Definition at line 916 of file CSGBase.h.

◆ applyScaling() [2/2]

void CSG::CSGBase::applyScaling ( const CSGObjectVariant csg_object,
const std::tuple< Real, Real, Real > &  values 
)
inline

Scale a CSG object in the specified x, y, and z directions.

Parameters
csg_objectThe CSG object to scale (Surface, Cell, Universe, Region, or Lattice)
valuessize 3 tuple with scaling values in x, y, and z directions {x, y, z}

Definition at line 899 of file CSGBase.h.

901 {
903 }

◆ applyTranslation() [1/2]

void CSG::CSGBase::applyTranslation ( const CSGEngUnit unit,
const std::tuple< Real, Real, Real > &  distances 
)
inline

Apply a translation to a CSGEngUnit object in the specified x, y, and z directions.

Parameters
unitThe CSGEngUnit object to translate (CSGEngUnit, CSGSurfaceEngUnit, CSGCellEngUnit, CSGUniverseEngUnit, or any derived type)
distancessize 3 tuple with translation distances in x, y, and z directions {x, y, z}
Note
Required because engineering unit types derive from both a plain CSG base and CSGEngUnit, so passing one to the CSGObjectVariant overload is ambiguous and will not compile; this overload binds to CSGEngUnit directly to disambiguate.

Definition at line 833 of file CSGBase.h.

◆ applyTranslation() [2/2]

void CSG::CSGBase::applyTranslation ( const CSGObjectVariant csg_object,
const std::tuple< Real, Real, Real > &  distances 
)
inline

Apply a translation to a CSG object in the specified x, y, and z directions.

Parameters
csg_objectThe CSG object to translate (Surface, Cell, Universe, Region, or Lattice)
distancessize 3 tuple with translation distances in x, y, and z directions {x, y, z}

Definition at line 815 of file CSGBase.h.

817 {
819 }

◆ areUniversesLinked()

bool CSG::CSGBase::areUniversesLinked ( ) const

Check whether all universes and cells in this CSGBase are reachable from the root universe through the cell/fill hierarchy.

Returns
true if all are linked, false if any universe or cell is orphaned

Definition at line 1212 of file CSGBase.C.

1213{
1214 std::vector<std::string> linked_univs, linked_cells;
1215 getLinkedUniverses(getRootUniverse(), linked_univs, linked_cells);
1216
1217 for (const CSGUniverse & univ : getAllUniverses())
1218 if (std::find(linked_univs.begin(), linked_univs.end(), univ.getName()) == linked_univs.end())
1219 return false;
1220
1221 for (const CSGCell & cell : getAllCells())
1222 if (std::find(linked_cells.begin(), linked_cells.end(), cell.getName()) == linked_cells.end())
1223 return false;
1224
1225 return true;
1226}
void getLinkedUniverses(const CSGUniverse &univ, std::vector< std::string > &linked_universe_names, std::vector< std::string > &linked_cell_names) const
Recursive method to retrieve all universes and cells linked to current universe.
Definition CSGBase.C:1229
std::vector< std::reference_wrapper< const CSGUniverse > > getAllUniverses() const
Get all universe objects.
Definition CSGBase.h:360
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition KokkosUtils.h:40

◆ cellToEngUnit()

const CSGCellEngUnit * CSG::CSGBase::cellToEngUnit ( const CSGCell cell) const
inlineprivate

Returns the CSGCellEngUnit pointer if cell is an eng unit, nullptr otherwise.

Usable as a boolean check or to access the eng unit directly.

Parameters
cellCSGCell to check/get as an engineering unit
Returns
const CSGCellEngUnit* or nullptr

Definition at line 1211 of file CSGBase.h.

1212 {
1213 return dynamic_cast<const CSGCellEngUnit *>(&cell);
1214 }

Referenced by addCellToList(), CSGBase(), deleteCell(), resetCellFill(), updateCellFill(), updateCellFill(), updateCellFill(), and updateCellRegion().

◆ checkCellInBase()

bool CSG::CSGBase::checkCellInBase ( const CSGCell cell) const
private

check that cell being accessed is a part of this CSGBase instance

Definition at line 1090 of file CSGBase.C.

1091{
1092 auto name = cell.getName();
1093 // if no cell by this name exists, an error will be produced by getCell
1094 auto & list_cell = _cell_list.getCell(name);
1095 // return whether the cell in the list is the same object as the one provided
1096 return &cell == &list_cell;
1097}

Referenced by addCellToUniverse(), addTransformation(), deleteCell(), removeCellFromUniverse(), resetCellFill(), updateCellFill(), updateCellFill(), updateCellFill(), and updateCellRegion().

◆ checkEngUnitInBase()

bool CSG::CSGBase::checkEngUnitInBase ( const CSGEngUnit unit) const
private

check that engineering unit being accessed is a part of this CSGBase instance

Definition at line 1120 of file CSGBase.C.

1121{
1122 const auto & name = unit.getName();
1123 // if no engineering unit by this name exists, an error will be produced by getEngUnit
1124 const auto & list_unit = _eng_unit_list.getEngUnit(name);
1125 // compare CSGEngUnit subobject addresses
1126 return &unit == &list_unit;
1127}

Referenced by addTransformation().

◆ checkLatticeInBase()

bool CSG::CSGBase::checkLatticeInBase ( const CSGLattice lattice) const
private

check that lattice being accessed is a part of this CSGBase instance

Definition at line 1110 of file CSGBase.C.

1111{
1112 auto name = lattice.getName();
1113 // if no lattice by this name exists, an error will be produced by getLattice
1114 auto & list_lattice = _lattice_list.getLattice(name);
1115 // return whether that the lattice in the list is the same as the lattice provided (in memory)
1116 return &lattice == &list_lattice;
1117}

Referenced by addTransformation(), deleteLattice(), resetLatticeOuter(), setLatticeOuter(), setLatticeOuter(), setLatticeUniverses(), setUniverseAtLatticeIndex(), and updateCellFill().

◆ checkRegionSurfaces()

void CSG::CSGBase::checkRegionSurfaces ( const CSGRegion region) const
private

check that surfaces used in this region are a part of this CSGBase instance

Definition at line 1068 of file CSGBase.C.

1069{
1070 const auto surfs = region.getSurfaces();
1071 for (const CSGSurface & s : surfs)
1072 {
1073 if (!checkSurfaceInBase(s))
1074 mooseError("Region is being set with a surface named " + s.getName() +
1075 " that is different from the surface of the same name in the CSGBase instance.");
1076 }
1077}

Referenced by createCell(), createCell(), createCell(), createCell(), and updateCellRegion().

◆ checkSurfaceInBase()

bool CSG::CSGBase::checkSurfaceInBase ( const CSGSurface surface) const
private

check that surface being accessed is a part of this CSGBase instance

Definition at line 1080 of file CSGBase.C.

1081{
1082 auto name = surface.getName();
1083 // if no surface by this name exists, an error will be produced by getSurface
1084 auto & list_surf = _surface_list.getSurface(name);
1085 // return whether the surface in the list is the same object as the one provided
1086 return &surface == &list_surf;
1087}

Referenced by addTransformation(), and deleteSurface().

◆ checkUniverseInBase()

bool CSG::CSGBase::checkUniverseInBase ( const CSGUniverse universe) const
private

check that universe being accessed is a part of this CSGBase instance

Definition at line 1100 of file CSGBase.C.

1101{
1102 auto name = universe.getName();
1103 // if no universe by this name exists, an error will be produced by getUniverse
1104 auto & list_univ = _universe_list.getUniverse(name);
1105 // return whether the universe in the list is the same object as the one provided
1106 return &universe == &list_univ;
1107}

Referenced by addCellToUniverse(), addLattice(), addTransformation(), deleteUniverse(), removeCellFromUniverse(), setLatticeOuter(), setLatticeUniverses(), setUniverseAtLatticeIndex(), and updateCellFill().

◆ checkUniverseLinking()

void CSG::CSGBase::checkUniverseLinking ( ) const
private

Check universes linked to root universe match universes defined in _universe_list.

Definition at line 1188 of file CSGBase.C.

1189{
1190 std::vector<std::string> linked_universe_names;
1191 std::vector<std::string> linked_cell_names;
1192
1193 // Recursively figure out which universe names are linked to root universe
1194 getLinkedUniverses(getRootUniverse(), linked_universe_names, linked_cell_names);
1195
1196 // Iterate through all universes in universe list and check that they exist in universes linked
1197 // to root universe list. Universe list includes CSGUniverseEngUnits.
1198 for (const CSGUniverse & univ : getAllUniverses())
1199 if (std::find(linked_universe_names.begin(), linked_universe_names.end(), univ.getName()) ==
1200 linked_universe_names.end())
1201 mooseWarning("Universe with name ", univ.getName(), " is not linked to root universe.");
1202
1203 // Iterate through all cells in cell list and check that they exist in cells linked
1204 // to root universe
1205 for (const CSGCell & cell : getAllCells())
1206 if (std::find(linked_cell_names.begin(), linked_cell_names.end(), cell.getName()) ==
1207 linked_cell_names.end())
1208 mooseWarning("Cell with name ", cell.getName(), " is not linked to root universe.");
1209}
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition MooseError.h:345

◆ clone()

std::unique_ptr< CSGBase > CSG::CSGBase::clone ( ) const
inline

Create a deep copy of this CSGBase instance.

Definition at line 72 of file CSGBase.h.

72{ return std::make_unique<CSGBase>(*this); }

◆ createCell() [1/4]

const CSGCell & CSG::CSGBase::createCell ( const std::string &  name,
const CSGLattice fill_lattice,
const CSGRegion region,
const CSGUniverse add_to_univ = nullptr 
)

Create a Lattice Cell object.

Parameters
nameunique cell name
fill_latticelattice that will fill the cell
regioncell region
add_to_univ(optional) universe to which this cell will be added (default is root universe)
Returns
reference to cell that is created

Definition at line 293 of file CSGBase.C.

297{
298 checkRegionSurfaces(region);
299
300 // check that cell is not being added to a universe that exists in the lattice itself
301 if (add_to_univ)
302 for (auto univ_list : fill_lattice.getUniverses())
303 for (const auto & univ_ref : univ_list)
304 {
305 const CSGUniverse & univ_in_lattice = univ_ref.get();
306 if (&univ_in_lattice == add_to_univ)
307 mooseError("Cell " + name +
308 " cannot be filled with a lattice containing the same universe to which it is "
309 "being added.");
310 }
311
312 auto & cell = _cell_list.addLatticeCell(name, fill_lattice, region);
313 if (add_to_univ)
314 addCellToUniverse(*add_to_univ, cell);
315 else
317 return cell;
318}
void checkRegionSurfaces(const CSGRegion &region) const
check that surfaces used in this region are a part of this CSGBase instance
Definition CSGBase.C:1068

◆ createCell() [2/4]

const CSGCell & CSG::CSGBase::createCell ( const std::string &  name,
const CSGRegion region,
const CSGUniverse add_to_univ = nullptr 
)

Create a Void Cell object.

Parameters
nameunique cell name
regioncell region
add_to_univ(optional) universe to which this cell will be added (default is root universe)
Returns
reference to CSGCell that is created

Definition at line 260 of file CSGBase.C.

263{
264 checkRegionSurfaces(region);
265 auto & cell = _cell_list.addVoidCell(name, region);
266 if (add_to_univ)
267 addCellToUniverse(*add_to_univ, cell);
268 else
270 return cell;
271}

◆ createCell() [3/4]

const CSGCell & CSG::CSGBase::createCell ( const std::string &  name,
const CSGUniverse fill_univ,
const CSGRegion region,
const CSGUniverse add_to_univ = nullptr 
)

Create a Universe Cell object.

Parameters
nameunique cell name
fill_univuniverse that will fill the cell
regioncell region
add_to_univ(optional) universe to which this cell will be added (default is root universe)
Returns
reference to cell that is created

Definition at line 274 of file CSGBase.C.

278{
279 checkRegionSurfaces(region);
280 if (add_to_univ && (&fill_univ == add_to_univ))
281 mooseError("Cell " + name +
282 " cannot be filled with the same universe to which it is being added.");
283
284 auto & cell = _cell_list.addUniverseCell(name, fill_univ, region);
285 if (add_to_univ)
286 addCellToUniverse(*add_to_univ, cell);
287 else
289 return cell;
290}

◆ createCell() [4/4]

const CSGCell & CSG::CSGBase::createCell ( const std::string &  name,
const std::string &  mat_name,
const CSGRegion region,
const CSGUniverse add_to_univ = nullptr 
)

Create a Material Cell object.

Parameters
nameunique cell name
mat_namematerial name
regioncell region
add_to_univ(optional) universe to which this cell will be added (default is root universe)
Returns
reference to CSGCell that is created

Definition at line 245 of file CSGBase.C.

249{
250 checkRegionSurfaces(region);
251 auto & cell = _cell_list.addMaterialCell(name, mat_name, region);
252 if (add_to_univ)
253 addCellToUniverse(*add_to_univ, cell);
254 else
256 return cell;
257}

◆ createUniverse() [1/2]

const CSGUniverse & CSG::CSGBase::createUniverse ( const std::string &  name)
inline

Create an empty Universe object.

Parameters
nameunique universe name
Returns
reference to CSGUniverse that is created

Definition at line 298 of file CSGBase.h.

299 {
300 return _universe_list.addUniverse(name);
301 }

Referenced by addUniverseToList().

◆ createUniverse() [2/2]

const CSGUniverse & CSG::CSGBase::createUniverse ( const std::string &  name,
std::vector< std::reference_wrapper< const CSGCell > > &  cells 
)

Create a Universe object from list of cells.

Parameters
nameunique universe name
cellslist of cells to add to universe
Returns
reference to CSGUniverse that is created

Definition at line 449 of file CSGBase.C.

451{
452 auto & univ = _universe_list.addUniverse(name);
453 addCellsToUniverse(univ, cells); // performs a check that cells are a part of this base
454 return univ;
455}
void addCellsToUniverse(const CSGUniverse &universe, std::vector< std::reference_wrapper< const CSGCell > > &cells)
Add a list of cells to an existing universe.
Definition CSGBase.C:529

◆ deleteCell()

void CSG::CSGBase::deleteCell ( const CSGCell cell)

Remove a Cell object passed in by reference from the stored cell list.

Any CSG components connected to cell will not be recursively removed.

Parameters
cellreference to cell to delete

Definition at line 343 of file CSGBase.C.

344{
345 if (!checkCellInBase(cell))
346 mooseError("Cell with name ",
347 cell.getName(),
348 " cannot be deleted as it is different from the cell of the same name in the "
349 "CSGBase instance.");
350
352 if (const auto * eng_unit = cellToEngUnit(cell))
353 _eng_unit_list.removeEngUnit(*eng_unit);
354 _cell_list.getCellListMap().erase(cell.getName());
355}
void prepareCellDeletion(const CSGCell &cell)
warn and remove cell from any universe that contains it
Definition CSGBase.C:321
std::unordered_map< std::string, std::unique_ptr< CSGCell > > & getCellListMap()
Get non-const map of all names to cells in cell list.
Definition CSGCellList.h:92
void removeEngUnit(const CSGEngUnit &unit)
Remove an engineering unit from this index by address.

◆ deleteEngUnit()

void CSG::CSGBase::deleteEngUnit ( const CSGEngUnit unit)

Remove an engineering unit passed in by reference from the stored engineering unit list.

Parameters
unitreference to the engineering unit to delete

Definition at line 1260 of file CSGBase.C.

1261{
1262 if (!checkEngUnitInBase(unit))
1263 mooseError("Engineering unit with name ",
1264 unit.getName(),
1265 " cannot be deleted as it is different from the engineering unit of the same name "
1266 "in the CSGBase instance.");
1267
1268 // Delegate to the typed delete method which handles EngUnit index cleanup and type list erasure
1269 if (const auto * surf_unit = dynamic_cast<const CSGSurfaceEngUnit *>(&unit))
1270 deleteSurface(static_cast<const CSGSurface &>(*surf_unit));
1271 else if (const auto * cell_unit = dynamic_cast<const CSGCellEngUnit *>(&unit))
1272 deleteCell(static_cast<const CSGCell &>(*cell_unit));
1273 else if (const auto * univ_unit = dynamic_cast<const CSGUniverseEngUnit *>(&unit))
1274 deleteUniverse(static_cast<const CSGUniverse &>(*univ_unit));
1275 else
1276 mooseError(
1277 "Engineering unit '", unit.getName(), "' has an unrecognized type and cannot be deleted.");
1278}
void deleteCell(const CSGCell &cell)
Remove a Cell object passed in by reference from the stored cell list.
Definition CSGBase.C:343
void deleteSurface(const CSGSurface &surface)
Remove a Surface object passed in by reference from the stored surface list.
Definition CSGBase.C:103
void deleteUniverse(const CSGUniverse &univ)
Remove a Universe object passed in by reference from the stored universe list.
Definition CSGBase.C:492

◆ deleteLattice()

void CSG::CSGBase::deleteLattice ( const CSGLattice lattice)

Remove a Lattice object passed in by reference from the stored lattice list.

Any CSG components connected to lattice will not be recursively removed.

Parameters
latticereference to lattice to delete

Definition at line 222 of file CSGBase.C.

223{
224 if (!checkLatticeInBase(lattice))
225 mooseError("Lattice with name ",
226 lattice.getName(),
227 " cannot be deleted as it is different from the lattice of the same name in the "
228 "CSGBase instance.");
229
230 // Check if lattice is used as fill in existing cells
231 for (const auto & cell_ref : _cell_list.getAllCells())
232 {
233 const auto & cell = cell_ref.get();
234 if ((cell.getFillType() == "LATTICE") && (cell.getFillLattice() == lattice))
235 mooseError("Cannot delete lattice with name ",
236 lattice.getName(),
237 " as it is used as the fill of cell with name ",
238 cell.getName());
239 }
240
241 _lattice_list.getLatticeListMap().erase(lattice.getName());
242}
std::unordered_map< std::string, std::unique_ptr< CSGLattice > > & getLatticeListMap()
Get map of all names to lattices in lattice list.

◆ deleteSurface()

void CSG::CSGBase::deleteSurface ( const CSGSurface surface)

Remove a Surface object passed in by reference from the stored surface list.

Any CSG components connected to surface will not be recursively removed.

Parameters
surfacereference to surface to delete

Definition at line 103 of file CSGBase.C.

104{
105 if (!checkSurfaceInBase(surface))
106 mooseError("Surface with name ",
107 surface.getName(),
108 " cannot be deleted as it is different from the surface of the same name in the "
109 "CSGBase instance.");
110
111 prepareSurfaceDeletion(surface);
112 if (const auto * eng_unit = surfaceToEngUnit(surface))
113 _eng_unit_list.removeEngUnit(*eng_unit);
114 _surface_list.getSurfaceListMap().erase(surface.getName());
115}
void prepareSurfaceDeletion(const CSGSurface &surface) const
error if surface is referenced in any cell region
Definition CSGBase.C:88
std::unordered_map< std::string, std::unique_ptr< CSGSurface > > & getSurfaceListMap()
Get non-const map of all names to surfaces in surface list.

◆ deleteUniverse()

void CSG::CSGBase::deleteUniverse ( const CSGUniverse univ)

Remove a Universe object passed in by reference from the stored universe list.

Any CSG components connected to universe will not be recursively removed.

Parameters
univreference to universe to delete

Definition at line 492 of file CSGBase.C.

493{
494 if (!checkUniverseInBase(univ))
495 mooseError("Universe with name ",
496 univ.getName(),
497 " cannot be deleted as it is different from the universe of the same name in the "
498 "CSGBase instance.");
499
501 if (const auto * eng_unit = universeToEngUnit(univ))
502 _eng_unit_list.removeEngUnit(*eng_unit);
503 _universe_list.getUniverseListMap().erase(univ.getName());
504}
void prepareUniverseDeletion(const CSGUniverse &universe) const
error if universe is the root, used in any lattice, or used as a cell fill
Definition CSGBase.C:458
std::unordered_map< std::string, std::unique_ptr< CSGUniverse > > & getUniverseListMap()
Get non-const map of all names to universes in universe list.

◆ expandAllEngUnits()

void CSG::CSGBase::expandAllEngUnits ( )

Expand all registered engineering units into basic CSG objects.

Each expanded EngUnit is removed from the engineering unit list and replaced by the corresponding plain CSG object(s) in the standard lists. After this call, the engineering unit list is empty.

Definition at line 1281 of file CSGBase.C.

1282{
1283 std::set<std::set<std::string>> all_type_sets;
1284 expandAllEngUnitsCycle(all_type_sets);
1285}
void expandAllEngUnitsCycle(std::set< std::set< std::string > > &all_type_sets)
Recursive implementation of expandAllEngUnits().
Definition CSGBase.C:1288

◆ expandAllEngUnitsCycle()

void CSG::CSGBase::expandAllEngUnitsCycle ( std::set< std::set< std::string > > &  all_type_sets)
private

Recursive implementation of expandAllEngUnits().

Each call is one pass: all eng units currently in the base are expanded, then if new units were created the function calls itself to expand them. The set of unit types present at the start of each pass is recorded. If that exact combination was seen in a prior pass, expansion is detected to be a circular dependency and an error is raised.

Parameters
all_type_setsset of the sets of types seen in each pass of expandAllEngUnitsCycle

Definition at line 1288 of file CSGBase.C.

1289{
1290 // One call to this function is one pass: collect all current eng units, expand them, then
1291 // recurse if expansion created new units. Units created during a pass are not in this pass's
1292 // snapshot; they are handled in the next pass.
1293 //
1294 // Cycle check: if the same combination of unit types appeared at the start of a prior pass,
1295 // expansion is stuck repeating the same configuration. Tracking the full type-set (not
1296 // individual types) prevents false positives when a type reappears because it was produced
1297 // by a different type's expansion rather than its own.
1298 std::set<std::string> current_types;
1299 for (const auto & u : getAllEngUnits())
1300 current_types.insert(u.get().getUnitType());
1301
1302 if (all_type_sets.count(
1303 current_types)) // this expansion set was already captured which means we are cycling
1304 mooseError("Circular dependency detected in engineering unit expansion");
1305
1306 all_type_sets.insert(current_types);
1307
1308 // Snapshot raw pointers before expanding. Units are destroyed after expansion so iterating live
1309 // references would dangle.
1310 std::vector<const CSGSurfaceEngUnit *> surfs;
1311 std::vector<const CSGCellEngUnit *> cells;
1312 std::vector<const CSGUniverseEngUnit *> univs;
1313 for (const auto & u : getAllSurfaceEngUnits())
1314 surfs.push_back(&u.get());
1315 for (const auto & u : getAllCellEngUnits())
1316 cells.push_back(&u.get());
1317 for (const auto & u : getAllUniverseEngUnits())
1318 univs.push_back(&u.get());
1319
1320 // Expand all units in this pass
1321 for (const auto * s : surfs)
1322 expandEngUnit(*s);
1323 for (const auto * c : cells)
1324 expandEngUnit(*c);
1325 for (const auto * u : univs)
1326 expandEngUnit(*u);
1327
1328 // if engineering units exist after completion of all expansions above, then start the next "pass"
1329 // through this expansion process. This will create a new set of "current_types" to check.
1330 if (!getAllEngUnits().empty())
1331 expandAllEngUnitsCycle(all_type_sets);
1332}
std::vector< std::reference_wrapper< const CSGEngUnit > > getAllEngUnits() const
Get all engineering units of all types in CSGBase.
Definition CSGBase.h:624
CSGRegion expandEngUnit(const CSGSurfaceEngUnit &unit)
Expand a surface-like engineering unit into basic CSGSurface(s) and return the CSGRegion representing...
Definition CSGBase.C:1335
std::vector< std::reference_wrapper< const CSGSurfaceEngUnit > > getAllSurfaceEngUnits() const
Get all surface-like engineering units in CSGBase.
Definition CSGBase.h:634

◆ expandEngUnit() [1/3]

const CSGCell & CSG::CSGBase::expandEngUnit ( const CSGCellEngUnit unit)

Expand a cell-like engineering unit into a basic CSGCell.

Calls expandUnit() on the EngUnit to create a basic CSGCell, then replaces every reference to the EngUnit in every universe with the new expanded CSGCell. The EngUnit is then removed from the engineering unit list and destroyed.

Parameters
unitidentifies the CSGCellEngUnit to expand. Passed by const reference because the expansion does not mutate through this handle; it operates on and consumes the owned instance re-fetched from the cell list by name.
Returns
const reference to the expanded CSGCell

Definition at line 1383 of file CSGBase.C.

1384{
1385 // unit is const because the eng-unit API exposes only const references; re-fetch a mutable
1386 // reference to the same object from the owning cell list to perform the expansion, which
1387 // mutates and consumes the unit (expandUnit() is non-const).
1388 auto & mutable_unit = static_cast<CSGCellEngUnit &>(_cell_list.getCell(unit.getName()));
1389
1390 // Derived class populates an internal base object (owned by the unit) with the expanded cell (in
1391 // root) and any supports
1392 mutable_unit.expandUnit();
1393
1394 // Capture a reference to the expanded cell before the join. joinOtherBase transfers ownership
1395 // of the cell's unique_ptr but does not relocate the object, so the reference stays valid.
1396 // getExpandedCell also validates that root has exactly 1 cell.
1397 const CSGCell & expanded_cell = mutable_unit.getExpandedCell();
1398
1399 // Join the unit's base object: 1-param merges root cells into this root
1400 joinOtherBase(mutable_unit.releaseBase(), false);
1401
1402 // Propagate any stored transformations from the EngUnit to the expanded cell
1403 const auto & trans = static_cast<const CSGCell &>(mutable_unit).getTransformations();
1404 if (!trans.empty())
1405 {
1406 CSGCell & mutable_cell = _cell_list.getCell(expanded_cell.getName());
1407 for (const auto & [trans_type, values] : trans)
1408 mutable_cell.addTransformation(trans_type, values);
1409 }
1410
1411 // The join added the expanded cell to this root via root-merge; remove it so
1412 // replaceCellRefs() can place it in the correct universe(s)
1413 if (getRootUniverse().hasCell(expanded_cell.getName()))
1414 removeCellFromUniverse(getRootUniverse(), expanded_cell);
1415
1416 // Replace all references to the CSGCellEngUnit in universes with the new expanded CSGCell
1417 replaceCellRefs(static_cast<const CSGCell &>(mutable_unit), expanded_cell);
1418
1419 // Remove the EngUnit (destroyed here, no more references to it after replaceCellRefs)
1420 deleteEngUnit(unit);
1421 return expanded_cell;
1422}
void joinOtherBase(std::unique_ptr< CSGBase > base, const bool ignore_identical_components)
Join another CSGBase object to this one.
Definition CSGBase.C:773
bool hasCell(const std::string &name) const
Check if a cell with given name exists in CSGBase object.
Definition CSGBase.h:218
void removeCellFromUniverse(const CSGUniverse &universe, const CSGCell &cell)
Remove a cell from an existing universe.
Definition CSGBase.C:537
void replaceCellRefs(const CSGCell &old_cell, const CSGCell &new_cell)
Replace all old_cell references with new_cell across all universes in the base.
Definition CSGBase.C:1525
void deleteEngUnit(const CSGEngUnit &unit)
Remove an engineering unit passed in by reference from the stored engineering unit list.
Definition CSGBase.C:1260

◆ expandEngUnit() [2/3]

CSGRegion CSG::CSGBase::expandEngUnit ( const CSGSurfaceEngUnit unit)

Expand a surface-like engineering unit into basic CSGSurface(s) and return the CSGRegion representing the EngUnit's geometry.

Calls expandUnit() then calls getExpansionRegion() to obtain the combined CSGRegion. Every occurrence of the EngUnit as a surface reference in any existing cell region is replaced with the sub-region. The EngUnit is then removed from the engineering unit list and destroyed.

Parameters
unitidentifies the CSGSurfaceEngUnit to expand. Passed by const reference because the expansion does not mutate through this handle; it operates on and consumes the owned instance re-fetched from the surface list by name.
Returns
CSGRegion formed by the expanded CSGSurface(s)

Definition at line 1335 of file CSGBase.C.

1336{
1337 // unit is const because the eng-unit API exposes only const references; re-fetch a mutable
1338 // reference to the same object from the owning surface list to perform the expansion, which
1339 // mutates and consumes the unit (expandUnit() is non-const).
1340 auto & mutable_unit = static_cast<CSGSurfaceEngUnit &>(_surface_list.getSurface(unit.getName()));
1341
1342 // Derived class creates the CSGSurface object(s) in the unit's base object and sets
1343 // _expanded_region
1344 mutable_unit.expandUnit();
1345
1346 // check that the base object that was generated has only surfaces and no cells or universes
1347 // (except root).
1348 auto unit_base = mutable_unit.getBase();
1349 if ((unit_base.getAllCells().size() > 0) || (unit_base.getAllUniverses().size() > 1))
1350 mooseError("CSGSurfaceEngineering unit ",
1351 mutable_unit.getName(),
1352 " of type ",
1353 mutable_unit.getUnitType(),
1354 " contains either cells or universes (beyond the root universe) after expansion, "
1355 "but should only contain surfaces.");
1356
1357 // Join the unit's base object into this; transfers surfaces (and any other objects) during merge.
1358 joinOtherBase(mutable_unit.releaseBase(), false);
1359
1360 // Derived class provides the expanded region formed by the expanded surfaces
1361 CSGRegion expanded_region = mutable_unit.getExpandedRegion();
1362
1363 // Propagate any stored transformations from the EngUnit to all new expanded surfaces
1364 const auto & trans = static_cast<const CSGSurface &>(mutable_unit).getTransformations();
1365 if (!trans.empty())
1366 for (const auto & surf_ref : expanded_region.getSurfaces())
1367 {
1368 CSGSurface & mutable_surf = _surface_list.getSurface(surf_ref.get().getName());
1369 for (const auto & [trans_type, values] : trans)
1370 mutable_surf.addTransformation(trans_type, values);
1371 }
1372
1373 // Replace every CSGSurfaceEngUnit reference in regions of CSGCells with the expanded sub-region
1374 replaceSurfaceRefsWithRegion(static_cast<const CSGSurface &>(mutable_unit), expanded_region);
1375
1376 // Remove the EngUnit (destroyed here, no more references to it after
1377 // replaceSurfaceRefsWithRegion)
1378 deleteEngUnit(unit);
1379 return expanded_region;
1380}
void replaceSurfaceRefsWithRegion(const CSGSurface &old_surf, const CSGRegion &sub_region)
Replace all region occurrences of old_surf with the tokens from sub_region across all cells in the ba...
Definition CSGBase.C:1540

◆ expandEngUnit() [3/3]

const CSGUniverse & CSG::CSGBase::expandEngUnit ( const CSGUniverseEngUnit unit)

Expand a universe-like engineering unit into a basic CSGUniverse.

Calls expandUnit() on the EngUnit to create the equivalent CSGUniverse and any necessary additional CSG components. All references to the original EngUnit in all cell fills, lattice universe maps/outers, and the root universe pointer are replaced with new CSGUniverse. The EngUnit is then removed from the engineering unit list and destroyed.

Parameters
unitidentifies the CSGUniverseEngUnit to expand. Passed by const reference because the expansion does not mutate through this handle; it operates on and consumes the owned instance re-fetched from the universe list by name.
Returns
const reference to the expanded CSGUniverse

Definition at line 1425 of file CSGBase.C.

1426{
1427 auto unit_name = unit.getName();
1428
1429 // unit is const because the eng-unit API exposes only const references; re-fetch a mutable
1430 // reference to the same object from the owning universe list to perform the expansion, which
1431 // mutates and consumes the unit (expandUnit() is non-const).
1432 auto & mutable_unit = static_cast<CSGUniverseEngUnit &>(_universe_list.getUniverse(unit_name));
1433
1434 // Derived class populates the unit's base object; the root of this base is the expanded universe
1435 // that will be used to replace this universe unit
1436 mutable_unit.expandUnit();
1437
1438 // Capture the name of the expanded universe (the unit base's root universe) before the join
1439 // getExpandedUniverse will validate that the root contains cells and was properly
1440 // implemented/expanded such that incoming cells and universes are all linked to the root.
1441 auto & pre_join_univ = mutable_unit.getExpandedUniverse();
1442 auto expanded_name = pre_join_univ.getName();
1443
1444 // Check that the expanded name for the new root universe has been updated to something other than
1445 // ROOT_UNIVERSE. If name was not already updated, issue a warning (debug) and update the name
1446 // automatically. This only matters if the current root universe is also named ROOT_UNIVERSE
1447 // so we only need to check if the name matches the root universe name (rather than explicitly
1448 // checking for the name ROOT_UNIVERSE).
1449
1450 // release the incoming base object to be able to rename if necessary
1451 auto unit_base = mutable_unit.releaseBase();
1452 if (expanded_name == getRootUniverse().getName())
1453 {
1454 // root universe must be renamed
1455 auto new_expanded_name = unit_name + "_expanded_root";
1456#ifdef DEBUG
1457 mooseInfoRepeated("Universe engineering unit " + unit_name +
1458 " has an expanded root universe named " + expanded_name +
1459 ", which is identical to the name of the current root universe. The expanded "
1460 "universe will be renamed " +
1461 new_expanded_name + ".");
1462#endif
1463
1464 unit_base->renameRootUniverse(new_expanded_name);
1465 expanded_name = new_expanded_name;
1466 }
1467
1468 // Join the unit's base into this: all objects are transferred and the incoming root is added as
1469 // a named non-root universe (expanded_name). If the root universe's name is not unique (i.e. it
1470 // was left named ROOT_UNIVERSE), this will throw an error.
1471 joinOtherBase(std::move(unit_base), false, expanded_name);
1472
1473 // must get this by name after joining because the join method rebuilds the universe and the
1474 // previous reference from getExpandedUniverse is not valid anymore.
1475 const CSGUniverse & expanded_univ = getUniverseByName(expanded_name);
1476
1477 // Propagate any stored transformations from the EngUnit to the new expanded universe
1478 const auto & trans = static_cast<const CSGUniverse &>(mutable_unit).getTransformations();
1479 if (!trans.empty())
1480 {
1481 CSGUniverse & mutable_univ = _universe_list.getUniverse(expanded_univ.getName());
1482 for (const auto & [trans_type, values] : trans)
1483 mutable_univ.addTransformation(trans_type, values);
1484 }
1485
1486 // Replace references in cell fills, lattice maps and outers, and the root universe
1487 replaceUniverseRefs(static_cast<const CSGUniverse &>(mutable_unit), expanded_univ);
1488
1489 // Remove the EngUnit (destroyed here, no more references to it after replaceUniverseRefs)
1490 deleteEngUnit(unit);
1491 return expanded_univ;
1492}
void mooseInfoRepeated(Args &&... args)
Emit an informational message with the given stringified, concatenated args.
Definition MooseError.h:409
const CSGUniverse & getUniverseByName(const std::string &name)
Get a universe object by name.
Definition CSGBase.h:371
void replaceUniverseRefs(const CSGUniverse &old_univ, const CSGUniverse &new_univ)
Replace all cell fills and lattice elements/outers referencing old_univ with new_univ.
Definition CSGBase.C:1495
const std::string & getName() const
Get the name of the universe.
Definition CSGUniverse.h:80

◆ FRIEND_TEST() [1/6]

CSG::CSGBase::FRIEND_TEST ( CSGBaseTest  ,
testAddGetSurface   
)
private

◆ FRIEND_TEST() [2/6]

CSG::CSGBase::FRIEND_TEST ( CSGBaseTest  ,
testCellEngUnitAddErrors   
)
private

◆ FRIEND_TEST() [3/6]

CSG::CSGBase::FRIEND_TEST ( CSGBaseTest  ,
testCheckRegionSurfaces   
)
private

Friends for unit testing.

◆ FRIEND_TEST() [4/6]

CSG::CSGBase::FRIEND_TEST ( CSGBaseTest  ,
testEngUnitLinking   
)
private

◆ FRIEND_TEST() [5/6]

CSG::CSGBase::FRIEND_TEST ( CSGBaseTest  ,
testUnivEngUnitAddErrors   
)
private

◆ FRIEND_TEST() [6/6]

CSG::CSGBase::FRIEND_TEST ( CSGBaseTest  ,
testUniverseLinking   
)
private

◆ generateOutput()

nlohmann::json CSG::CSGBase::generateOutput ( ) const

generate the JSON representation output for the CSG object

Returns
nlohmann::json JSON object representing the CSG model

Definition at line 1555 of file CSGBase.C.

1556{
1557 // Check that orphaned universes do not exist in universe list of CSGBase object
1559
1560 nlohmann::json csg_json;
1561
1562 csg_json["surfaces"] = {}; // if empty (all are eng units), this will be deleted later
1563 csg_json["cells"] = {}; // if empty (all are eng units), this will be deleted later
1564 csg_json["universes"] = {}; // root universe always exists, so this does not get deleted later
1565
1566 // get all surfaces information
1567 auto all_surfs = getAllSurfaces();
1568 for (const CSGSurface & s : all_surfs)
1569 {
1570 if (surfaceToEngUnit(s))
1571 continue; // engineering units are written in a separate section
1572 const auto & surf_name = s.getName();
1573 const auto & coeffs = s.getCoeffs();
1574 csg_json["surfaces"][surf_name] = {{"type", s.getSurfaceType()}, {"coefficients", {}}};
1575 for (const auto & c : coeffs)
1576 csg_json["surfaces"][surf_name]["coefficients"][c.first] = c.second;
1577 // include any information about transformations if present
1578 if (s.getTransformations().size() > 0)
1579 csg_json["surfaces"][surf_name]["transformations"] = s.getTransformationsAsStrings();
1580 }
1581
1582 // Drop the surfaces section if nothing was written (e.g. all surfaces were engineering units,
1583 // which are output in the units section instead)
1584 if (csg_json["surfaces"].empty())
1585 csg_json.erase("surfaces");
1586
1587 // Print out cell information
1588 auto all_cells = getAllCells();
1589 for (const CSGCell & c : all_cells)
1590 {
1591 if (cellToEngUnit(c))
1592 continue; // engineering units are written in a separate section
1593 const auto & cell_name = c.getName();
1594 const auto & cell_region_infix = c.getRegion().toInfixJSON();
1595 const auto & cell_region_postfix = c.getRegion().toPostfixStringList();
1596 const auto & cell_filltype = c.getFillType();
1597 const auto & fill_name = c.getFillName();
1598 csg_json["cells"][cell_name]["filltype"] = cell_filltype;
1599 csg_json["cells"][cell_name]["region_infix"] = cell_region_infix;
1600 csg_json["cells"][cell_name]["region_postfix"] = cell_region_postfix;
1601 csg_json["cells"][cell_name]["fill"] = fill_name;
1602 // include any information about transformations if present
1603 if (c.getTransformations().size())
1604 csg_json["cells"][cell_name]["transformations"] = c.getTransformationsAsStrings();
1605 }
1606
1607 // Drop the cells section if nothing was written (e.g. all cells were engineering units,
1608 // which are output in the units section instead)
1609 if (csg_json["cells"].empty())
1610 csg_json.erase("cells");
1611
1612 // Print out universe information
1613 auto all_univs = getAllUniverses();
1614 for (const CSGUniverse & u : all_univs)
1615 {
1616 if (universeToEngUnit(u))
1617 continue; // engineering units are written in a separate section
1618 const auto & univ_name = u.getName();
1619 const auto & univ_cells = u.getAllCells();
1620 csg_json["universes"][univ_name]["cells"] = {};
1621 for (const CSGCell & c : univ_cells)
1622 csg_json["universes"][univ_name]["cells"].push_back(c.getName());
1623 if (u.isRoot())
1624 csg_json["universes"][univ_name]["root"] = u.isRoot();
1625 // include any information about transformations if present
1626 if (u.getTransformations().size())
1627 csg_json["universes"][univ_name]["transformations"] = u.getTransformationsAsStrings();
1628 }
1629
1630 // print out lattice information if lattices exist
1631 auto all_lats = getAllLattices();
1632 if (all_lats.size())
1633 {
1634 csg_json["lattices"] = {};
1635 for (const CSGLattice & lat : all_lats)
1636 {
1637 const auto & lat_name = lat.getName();
1638 csg_json["lattices"][lat_name] = {};
1639 csg_json["lattices"][lat_name]["type"] = lat.getType();
1640 const auto & outer_type = lat.getOuterType();
1641 csg_json["lattices"][lat_name]["outertype"] = outer_type;
1642 if (outer_type == "UNIVERSE")
1643 csg_json["lattices"][lat_name]["outer"] = lat.getOuterUniverse().getName();
1644 else if (outer_type == "CSG_MATERIAL")
1645 csg_json["lattices"][lat_name]["outer"] = lat.getOuterMaterial();
1646 // write out any additional attributes
1647 csg_json["lattices"][lat_name]["attributes"] = {};
1648 const auto & lat_attrs = lat.getAttributes();
1649 for (const auto & attr : lat_attrs)
1650 csg_json["lattices"][lat_name]["attributes"][attr.first] = attr.second;
1651 // write the map of universe names: list of lists
1652 csg_json["lattices"][lat_name]["universes"] = lat.getUniverseNameMap();
1653 // include any information about transformations if present
1654 if (lat.getTransformations().size())
1655 csg_json["lattices"][lat_name]["transformations"] = lat.getTransformationsAsStrings();
1656 }
1657 }
1658
1659 // include engineering units if they exist
1660 auto all_units = getAllEngUnits();
1661 if (all_units.size())
1662 {
1663 csg_json["units"] = {};
1664 for (const CSGEngUnit & unit : all_units)
1665 {
1666 const auto & unit_name = unit.getName();
1667 csg_json["units"][unit_name] = {};
1668 // behavior and type
1669 csg_json["units"][unit_name]["unit_type"] = unit.getUnitType();
1670 csg_json["units"][unit_name]["behavior"] = unit.getBehavior();
1671 // any unit-specific attributes
1672 csg_json["units"][unit_name]["attributes"] = {};
1673 const auto & unit_attrs = unit.getAttributes();
1674 for (const auto & attr : unit_attrs)
1675 csg_json["units"][unit_name]["attributes"][attr.first] = attr.second;
1676 if (unit.getTransformations().size())
1677 csg_json["units"][unit_name]["transformations"] = unit.getTransformationsAsStrings();
1678 }
1679 }
1680
1681 return csg_json;
1682}
std::vector< std::reference_wrapper< const CSGLattice > > getAllLattices() const
Get all lattice objects.
Definition CSGBase.h:486
std::vector< std::reference_wrapper< const CSGSurface > > getAllSurfaces() const
Get all surface objects.
Definition CSGBase.h:96
void checkUniverseLinking() const
Check universes linked to root universe match universes defined in _universe_list.
Definition CSGBase.C:1188

◆ getAllCellEngUnits()

std::vector< std::reference_wrapper< const CSGCellEngUnit > > CSG::CSGBase::getAllCellEngUnits ( ) const
inline

Get all cell-like engineering units in CSGBase.

Returns
list of const references to all CSGCellEngUnit objects

Definition at line 644 of file CSGBase.h.

645 {
647 }
std::vector< std::reference_wrapper< const CSGCellEngUnit > > getAllCellEngUnits() const
Get all cell-like engineering units.

Referenced by CSGBase().

◆ getAllCells()

std::vector< std::reference_wrapper< const CSGCell > > CSG::CSGBase::getAllCells ( ) const
inline

Get all cell objects.

Returns
list of references to all CSGCell objects in CSGBase

Definition at line 199 of file CSGBase.h.

200 {
201 return _cell_list.getAllCells();
202 }
std::vector< std::reference_wrapper< const CSGCell > > getAllCells() const
Get all the cells in CSGBase instance.
Definition CSGCellList.C:83

◆ getAllEngUnits()

std::vector< std::reference_wrapper< const CSGEngUnit > > CSG::CSGBase::getAllEngUnits ( ) const
inline

Get all engineering units of all types in CSGBase.

Returns
list of const references to all CSGEngUnit objects

Definition at line 624 of file CSGBase.h.

625 {
627 }
std::vector< std::reference_wrapper< const CSGEngUnit > > getAllEngUnits() const
Get all engineering units of all types in the list.

◆ getAllLattices()

std::vector< std::reference_wrapper< const CSGLattice > > CSG::CSGBase::getAllLattices ( ) const
inline

Get all lattice objects.

Returns
list of references to CSGLattice objects in this CSGBase instance

Definition at line 486 of file CSGBase.h.

487 {
489 }
std::vector< std::reference_wrapper< const CSGLattice > > getAllLattices() const
Get all the lattices in CSGBase instance.

◆ getAllSurfaceEngUnits()

std::vector< std::reference_wrapper< const CSGSurfaceEngUnit > > CSG::CSGBase::getAllSurfaceEngUnits ( ) const
inline

Get all surface-like engineering units in CSGBase.

Returns
list of const references to all CSGSurfaceEngUnit objects

Definition at line 634 of file CSGBase.h.

635 {
637 }
std::vector< std::reference_wrapper< const CSGSurfaceEngUnit > > getAllSurfaceEngUnits() const
Get all surface-like engineering units.

◆ getAllSurfaces()

std::vector< std::reference_wrapper< const CSGSurface > > CSG::CSGBase::getAllSurfaces ( ) const
inline

Get all surface objects.

Returns
list of references to all CSGSurface objects in CSGBase

Definition at line 96 of file CSGBase.h.

97 {
99 }
std::vector< std::reference_wrapper< const CSGSurface > > getAllSurfaces() const
Get list of references to all surfaces in surface list.

◆ getAllUniverseEngUnits()

std::vector< std::reference_wrapper< const CSGUniverseEngUnit > > CSG::CSGBase::getAllUniverseEngUnits ( ) const
inline

Get all universe-like engineering units.

Returns
list of const references to all CSGUniverseEngUnit objects

Definition at line 654 of file CSGBase.h.

655 {
657 }
std::vector< std::reference_wrapper< const CSGUniverseEngUnit > > getAllUniverseEngUnits() const
Get all universe-like engineering units.

Referenced by CSGBase().

◆ getAllUniverses()

std::vector< std::reference_wrapper< const CSGUniverse > > CSG::CSGBase::getAllUniverses ( ) const
inline

Get all universe objects.

Returns
list of references to CSGUniverse objects in this CSGBase instance

Definition at line 360 of file CSGBase.h.

361 {
363 }
std::vector< std::reference_wrapper< const CSGUniverse > > getAllUniverses() const
Get all the universes in CSGBase instance.

◆ getCellByName()

const CSGCell & CSG::CSGBase::getCellByName ( const std::string &  name) const
inline

Get a Cell object by name.

Parameters
namecell name
Returns
reference to CSGCell object

Definition at line 210 of file CSGBase.h.

210{ return _cell_list.getCell(name); }

◆ getCellList() [1/2]

CSGCellList & CSG::CSGBase::getCellList ( )
inlineprivate

Get a non-const reference to the CSGCellList object.

Returns
CSGCellList

Definition at line 985 of file CSGBase.h.

985{ return _cell_list; }

◆ getCellList() [2/2]

const CSGCellList & CSG::CSGBase::getCellList ( ) const
inlineprivate

Get a const reference to the CSGCellList object.

Returns
CSGCellList

Definition at line 978 of file CSGBase.h.

978{ return _cell_list; }

Referenced by CSGBase(), operator==(), replaceLatticeRefsByName(), replaceSurfaceRefsByName(), and replaceUniverseRefsByName().

◆ getEngUnitByName()

template<typename EngUnitType = CSGEngUnit>
const EngUnitType & CSG::CSGBase::getEngUnitByName ( const std::string &  name) const
inline

Get a engineering unit object of the specified type by name.

This is a templated method with a default type of CSGEngUnit. If a specific unit type is needed, it can be specified when calling. If the type is unknown or not specified, it will default to CSGEngUnit to get the base class reference. NOTE: if CSGEngUnit is used as the template type, any type-specific attributes or methods may not be accessible, except using a reference cast.

Parameters
nameengineering unit name
Returns
const reference to the engineering unit

Definition at line 592 of file CSGBase.h.

593 {
594 const CSGEngUnit & unit = _eng_unit_list.getEngUnit(name);
595 const EngUnitType * typed_unit = dynamic_cast<const EngUnitType *>(&unit);
596 if (!typed_unit)
597 mooseError("Cannot get engineering unit " + name +
598 ". Engineering unit is not of specified type " +
599 MooseUtils::prettyCppType<EngUnitType>());
600 return *typed_unit;
601 }

◆ getEngUnitList()

const CSGEngUnitList & CSG::CSGBase::getEngUnitList ( ) const
inlineprivate

Get a const reference to the CSGEngUnitList object.

Returns
CSGEngUnitList

Definition at line 1078 of file CSGBase.h.

1078{ return _eng_unit_list; }

Referenced by operator==().

◆ getLatticeByName()

template<typename LatticeType = CSGLattice>
const LatticeType & CSG::CSGBase::getLatticeByName ( const std::string &  name)
inline

Get a lattice object of the specified type by name.

This is a templated method with a default type of CSGLattice. If a specific lattice type is needed, it can be specified when calling. If the type is unknown or not specified, it will default to CSGLattice to get the base class reference. NOTE: if CSGLattice is used as the template type, any lattice type-specific attributes or methods may not be accessible, except using a reference cast.

Parameters
namelattice name
Returns
reference to CSGLattice object

Definition at line 504 of file CSGBase.h.

505 {
506 const CSGLattice & lattice = _lattice_list.getLattice(name);
507 const LatticeType * typed_lattice = dynamic_cast<const LatticeType *>(&lattice);
508 if (!typed_lattice)
509 mooseError("Cannot get lattice " + name + ". Lattice is not of specified type " +
510 MooseUtils::prettyCppType<LatticeType>());
511 return *typed_lattice;
512 }

◆ getLatticeList() [1/2]

CSGLatticeList & CSG::CSGBase::getLatticeList ( )
inlineprivate

Get the CSGLatticeList object.

Returns
CSGLatticeList

Definition at line 1013 of file CSGBase.h.

1013{ return _lattice_list; }

◆ getLatticeList() [2/2]

const CSGLatticeList & CSG::CSGBase::getLatticeList ( ) const
inlineprivate

Get a const reference to the CSGLatticeList object.

Returns
CSGLatticeList

Definition at line 1006 of file CSGBase.h.

1006{ return _lattice_list; }

Referenced by CSGBase(), operator==(), and replaceUniverseRefsByName().

◆ getLinkedUniverses()

void CSG::CSGBase::getLinkedUniverses ( const CSGUniverse univ,
std::vector< std::string > &  linked_universe_names,
std::vector< std::string > &  linked_cell_names 
) const
private

Recursive method to retrieve all universes and cells linked to current universe.

Parameters
univReference to universe under consideration
linked_universe_namesList of universe names linked to current universe
linked_cell_namesList of cell names linked to current universe

Definition at line 1229 of file CSGBase.C.

1232{
1233 linked_universe_names.push_back(univ.getName());
1234 const auto & univ_cells = univ.getAllCells();
1235 for (const CSGCell & cell : univ_cells)
1236 {
1237 linked_cell_names.push_back(cell.getName());
1238 if (cell.getFillType() == "UNIVERSE")
1239 getLinkedUniverses(cell.getFillUniverse(), linked_universe_names, linked_cell_names);
1240 else if (cell.getFillType() == "LATTICE")
1241 {
1242 const auto & lattice = cell.getFillLattice();
1243 for (const auto & univ_list : lattice.getUniverses())
1244 for (const auto & univ_ref : univ_list)
1245 {
1246 const CSGUniverse & lattice_univ = univ_ref.get();
1247 getLinkedUniverses(lattice_univ, linked_universe_names, linked_cell_names);
1248 }
1249
1250 if (lattice.getOuterType() == "UNIVERSE")
1251 {
1252 const CSGUniverse & outer_univ = lattice.getOuterUniverse();
1253 getLinkedUniverses(outer_univ, linked_universe_names, linked_cell_names);
1254 }
1255 }
1256 }
1257}

◆ getRootUniverse()

const CSGUniverse & CSG::CSGBase::getRootUniverse ( ) const
inline

Get the Root Universe object.

Returns
reference to root CSGUniverse

Definition at line 272 of file CSGBase.h.

272{ return _universe_list.getRoot(); }
const CSGUniverse & getRoot() const
Get the root universe.

Referenced by addEngUnit(), createCell(), createCell(), createCell(), createCell(), CSGBase(), prepareCellDeletion(), and prepareUniverseDeletion().

◆ getSurface()

CSGSurface & CSG::CSGBase::getSurface ( const std::string &  name)
inlineprivate

Get a Surface object by name.

Note: This is a private method that returns a non-const reference. For the public method that returns a const reference, use getSurfaceByName

Parameters
namesurface name
Returns
reference to CSGSurface object

Definition at line 931 of file CSGBase.h.

931{ return _surface_list.getSurface(name); }

◆ getSurfaceByName()

const CSGSurface & CSG::CSGBase::getSurfaceByName ( const std::string &  name) const
inline

Get a Surface object by name.

Parameters
namesurface name
Returns
reference to CSGSurface object

Definition at line 107 of file CSGBase.h.

108 {
109 return _surface_list.getSurface(name);
110 }

Referenced by updateIncomingCSGReferences().

◆ getSurfaceList() [1/2]

CSGSurfaceList & CSG::CSGBase::getSurfaceList ( )
inlineprivate

Get a non-const reference to the CSGSurfaceList object.

Returns
CSGSurfaceList

Definition at line 971 of file CSGBase.h.

971{ return _surface_list; }

◆ getSurfaceList() [2/2]

const CSGSurfaceList & CSG::CSGBase::getSurfaceList ( ) const
inlineprivate

Get a const reference to the CSGSurfaceList object.

Returns
CSGSurfaceList

Definition at line 964 of file CSGBase.h.

964{ return _surface_list; }

Referenced by operator==(), and updateIncomingCSGReferences().

◆ getUniverseByName()

const CSGUniverse & CSG::CSGBase::getUniverseByName ( const std::string &  name)
inline

Get a universe object by name.

Parameters
nameuniverse name
Returns
reference to CSGUniverse object

Definition at line 371 of file CSGBase.h.

372 {
373 return _universe_list.getUniverse(name);
374 }

◆ getUniverseList() [1/2]

CSGUniverseList & CSG::CSGBase::getUniverseList ( )
inlineprivate

Get a non-const reference to the CSGUniverseList object.

Returns
CSGUniverseList

Definition at line 999 of file CSGBase.h.

999{ return _universe_list; }

◆ getUniverseList() [2/2]

const CSGUniverseList & CSG::CSGBase::getUniverseList ( ) const
inlineprivate

Get a const reference to the CSGUniverseList object.

Returns
CSGUniverseList

Definition at line 992 of file CSGBase.h.

992{ return _universe_list; }

Referenced by CSGBase(), operator==(), and replaceCellRefsByName().

◆ hasCell()

bool CSG::CSGBase::hasCell ( const std::string &  name) const
inline

Check if a cell with given name exists in CSGBase object.

Parameters
namecell name
Returns
true if cell with given name exists in CSGBase

Definition at line 218 of file CSGBase.h.

218{ return _cell_list.hasCell(name); }

◆ hasEngUnit()

bool CSG::CSGBase::hasEngUnit ( const std::string &  name) const
inline

Check if an engineeering unit with given name exists in CSGBase object.

Parameters
nameengineering unit name
Returns
Check if an engineering unit with given name exists in CSGBase object

Definition at line 609 of file CSGBase.h.

609{ return _eng_unit_list.hasEngUnit(name); }

◆ hasLattice()

bool CSG::CSGBase::hasLattice ( const std::string &  name) const
inline

Check if a lattice with given name exists in CSGBase object.

Parameters
namelattice name
Returns
true if lattice with given name exists in CSGBase

Definition at line 520 of file CSGBase.h.

520{ return _lattice_list.hasLattice(name); }

◆ hasSurface()

bool CSG::CSGBase::hasSurface ( const std::string &  name) const
inline

Check if a surface with given name exists in CSGBase object.

Parameters
namesurface name
Returns
true if surface with given name exists in CSGBase

Definition at line 118 of file CSGBase.h.

118{ return _surface_list.hasSurface(name); }
bool hasSurface(const std::string &name) const
return whether surface with given name exists in surface list

Referenced by updateIncomingCSGReferences().

◆ hasUniverse()

bool CSG::CSGBase::hasUniverse ( const std::string &  name) const
inline

Check if a universe with given name exists in CSGBase object.

Parameters
nameuniverse name
Returns
true if universe with given name exists in CSGBase

Definition at line 382 of file CSGBase.h.

382{ return _universe_list.hasUniverse(name); }

◆ joinCellList()

void CSG::CSGBase::joinCellList ( CSGCellList cell_list,
const bool  ignore_identical_cells 
)
private

join a separate CSGCellList object to this one

Parameters
cell_listCSGCellList from a separate CSGBase object
ignore_identical_cellsif true, will skip adding identical cells to the CSGBase object

Definition at line 963 of file CSGBase.C.

964{
965 auto & cell_list_map = cell_list.getCellListMap();
966 for (auto & c : cell_list_map)
967 _cell_list.addCell(std::move(c.second), ignore_identical_cells);
968}

Referenced by joinOtherBase(), joinOtherBase(), and joinOtherBase().

◆ joinLatticeList()

void CSG::CSGBase::joinLatticeList ( CSGLatticeList lattice_list,
const bool  ignore_identical_lattices 
)
private

join a separate CSGLatticeList object to this one

Parameters
lattice_listCSGLatticeList from a separate CSGBase object
ignore_identical_latticesif true, will skip adding identical lattices to the CSGBase object

Definition at line 971 of file CSGBase.C.

972{
973 auto & lat_list_map = lattice_list.getLatticeListMap();
974 for (auto & lat : lat_list_map)
975 _lattice_list.addLattice(std::move(lat.second), ignore_identical_lattices);
976}

Referenced by joinOtherBase(), joinOtherBase(), and joinOtherBase().

◆ joinOtherBase() [1/3]

void CSG::CSGBase::joinOtherBase ( std::unique_ptr< CSGBase base,
const bool  ignore_identical_components 
)

Join another CSGBase object to this one.

The cells of the root universe of the incoming CSGBase will be added to the existing root universe of this CSGBase.

Parameters
basepointer to a different CSGBase object
ignore_identical_componentsif true, will skip adding identical components (surfaces, cells, universes, lattices) to the CSGBase object

Definition at line 773 of file CSGBase.C.

774{
775 // If we are ignoring identical incoming CSG components, we need to update any references
776 // stored by these components to point to the references of the pre-existing CSGBase object
777 if (ignore_identical_components)
779 joinSurfaceList(base->getSurfaceList(), ignore_identical_components);
780 joinCellList(base->getCellList(), ignore_identical_components);
781 joinLatticeList(base->getLatticeList(), ignore_identical_components);
782 joinUniverseList(base->getUniverseList(), ignore_identical_components);
783 rebuildEngUnitList(); // finds all engineering units again, allowing us to keep any ignored
784 // surfaces that were removed from the surface list out of this list
785}
void joinUniverseList(CSGUniverseList &univ_list, const bool ignore_identical_universes)
join a separate CSGUniverseList object to this one; root universes from univ_list will be combined in...
Definition CSGBase.C:997
void updateIncomingCSGReferences(CSGBase &incoming_base)
update references of incoming CSGbase to point to those of existing CSGBase object.
Definition CSGBase.C:824
void joinCellList(CSGCellList &cell_list, const bool ignore_identical_cells)
join a separate CSGCellList object to this one
Definition CSGBase.C:963
void joinLatticeList(CSGLatticeList &lattice_list, const bool ignore_identical_lattices)
join a separate CSGLatticeList object to this one
Definition CSGBase.C:971
void joinSurfaceList(CSGSurfaceList &surf_list, const bool ignore_identical_surfaces)
join a separate CSGSurfaceList object to this one
Definition CSGBase.C:955

◆ joinOtherBase() [2/3]

void CSG::CSGBase::joinOtherBase ( std::unique_ptr< CSGBase base,
const bool  ignore_identical_components,
const std::string &  new_root_name_base,
const std::string &  new_root_name_join 
)

Join another CSGBase object to this one.

The root universe for the incoming CSGBase object is added to this CSGBase object as a non-root universe with a new name. The root universe of this CSGBase object will be renamed and designated as non-root. Note: upon completion of this join method, the root universe of this CSGBase object will be empty. Neither of the new non-root universes will be connected to the new root universe by default.

Parameters
basepointer to a different CSGBase object
ignore_identical_componentsif true, will skip adding identical components (surfaces, cells, universes, lattices) to the CSGBase object
new_root_name_basenew name for universe generated from this root universe
new_root_name_joinnew name for the universe generated from the incoming root universe

Definition at line 805 of file CSGBase.C.

809{
810 // If we are ignoring identical incoming CSG components, we need to update any references
811 // stored by these components to point to the references of the pre-existing CSGBase object
812 if (ignore_identical_components)
814 joinSurfaceList(base->getSurfaceList(), ignore_identical_components);
815 joinCellList(base->getCellList(), ignore_identical_components);
816 joinLatticeList(base->getLatticeList(), ignore_identical_components);
818 base->getUniverseList(), ignore_identical_components, new_root_name_base, new_root_name_join);
819 rebuildEngUnitList(); // finds all engineering units again, allowing us to keep any ignored
820 // surfaces that were removed from the surface list out of this list
821}

◆ joinOtherBase() [3/3]

void CSG::CSGBase::joinOtherBase ( std::unique_ptr< CSGBase base,
const bool  ignore_identical_components,
const std::string &  new_root_name_join 
)

Join another CSGBase object to this one.

For the incoming CSGBase object, the root universe is added to this CSGBase object as a new non-root universe with the specified new name. Note: this newly created universe will not be connected to the root universe of this CSGBase object by default.

Parameters
basepointer to a different CSGBase object
ignore_identical_componentsif true, will skip adding identical components (surfaces, cells, universes, lattices) to the CSGBase object
new_root_name_joinnew name for the universe generated from the incoming root universe

Definition at line 788 of file CSGBase.C.

791{
792 // If we are ignoring identical incoming CSG components, we need to update any references
793 // stored by these components to point to the references of the pre-existing CSGBase object
794 if (ignore_identical_components)
796 joinSurfaceList(base->getSurfaceList(), ignore_identical_components);
797 joinCellList(base->getCellList(), ignore_identical_components);
798 joinLatticeList(base->getLatticeList(), ignore_identical_components);
799 joinUniverseList(base->getUniverseList(), ignore_identical_components, new_root_name_join);
800 rebuildEngUnitList(); // finds all engineering units again, allowing us to keep any ignored
801 // surfaces that were removed from the surface list out of this list
802}

◆ joinSurfaceList()

void CSG::CSGBase::joinSurfaceList ( CSGSurfaceList surf_list,
const bool  ignore_identical_surfaces 
)
private

join a separate CSGSurfaceList object to this one

Parameters
surf_listCSGSurfaceList from a separate CSGBase object
ignore_identical_surfacesif true, will skip adding identical surfaces to the CSGBase object

Definition at line 955 of file CSGBase.C.

956{
957 auto & surf_list_map = surf_list.getSurfaceListMap();
958 for (auto & s : surf_list_map)
959 _surface_list.addSurface(std::move(s.second), ignore_identical_surfaces);
960}
const CSGSurface & addSurface(std::unique_ptr< CSGSurface > surf)
add a unique surface pointer to this base instance
Definition CSGBase.C:78

Referenced by joinOtherBase(), joinOtherBase(), and joinOtherBase().

◆ joinUniverseList() [1/3]

void CSG::CSGBase::joinUniverseList ( CSGUniverseList univ_list,
const bool  ignore_identical_universes 
)
private

join a separate CSGUniverseList object to this one; root universes from univ_list will be combined into this root universe

Parameters
univ_listCSGUniverseList from a separate CSGBase object
ignore_identical_universesif true, will skip adding identical universes to the CSGBase object

Definition at line 997 of file CSGBase.C.

998{
999 // case 1: incoming root is joined into existing root; no new universes are created
1000 auto & univ_list_map = univ_list.getUniverseListMap();
1001 auto & root = getRootUniverse(); // this root universe
1002 for (auto & u : univ_list_map)
1003 {
1004 if (u.second->isRoot())
1005 {
1006 // add existing cells to current root instead of creating new universe
1007 auto all_cells = u.second->getAllCells();
1008 for (auto & cell : all_cells)
1009 addCellToUniverse(root, cell);
1010 }
1011 else // unique non-root universe to add to list
1012 _universe_list.addUniverse(std::move(u.second), ignore_identical_universes);
1013 }
1014}

Referenced by joinOtherBase(), joinOtherBase(), and joinOtherBase().

◆ joinUniverseList() [2/3]

void CSG::CSGBase::joinUniverseList ( CSGUniverseList univ_list,
const bool  ignore_identical_universes,
const std::string &  new_root_name_base,
const std::string &  new_root_name_incoming 
)
private

join a separate CSGUniverseList object to this one; both this root universe and the incoming root universe will be maintained as separate universes of the specified names.

Note: upon completion of this join method, the root universe will be empty.

Parameters
univ_listCSGUniverseList from a separate CSGBase object
ignore_identical_universesif true, will skip adding identical lattices to the CSGBase object
new_root_name_basenew name for universe generated from this root universe
new_root_name_incomingnew name for the universe generated from the incoming root universe

Definition at line 1039 of file CSGBase.C.

1043{
1044 // case 3: each root universe becomes a new universe and a new root is created
1045
1046 // make a new universe from the existing root universe
1047 auto & root = getRootUniverse();
1048 auto root_cells = root.getAllCells();
1049 createUniverse(new_root_name_base, root_cells);
1050 removeCellsFromUniverse(root, root_cells);
1051
1052 // add incoming universes to current Base
1053 auto & all_univs = univ_list.getUniverseListMap();
1054 for (auto & u : all_univs)
1055 {
1056 if (u.second->isRoot())
1057 {
1058 // create new universe from incoming root universe
1059 auto all_cells = u.second->getAllCells();
1060 createUniverse(new_root_name_incoming, all_cells);
1061 }
1062 else // unique non-root universe to add to list
1063 _universe_list.addUniverse(std::move(u.second), ignore_identical_universes);
1064 }
1065}
void removeCellsFromUniverse(const CSGUniverse &universe, std::vector< std::reference_wrapper< const CSGCell > > &cells)
Remove a list of cells from an existing universe.
Definition CSGBase.C:556

◆ joinUniverseList() [3/3]

void CSG::CSGBase::joinUniverseList ( CSGUniverseList univ_list,
const bool  ignore_identical_universes,
const std::string &  new_root_name_incoming 
)
private

join a separate CSGUniverseList object to this one; the incoming root universe will be moved to a new universe of the new name specified.

Parameters
univ_listCSGUniverseList from a separate CSGBase object
ignore_identical_universesif true, will skip adding identical universes to the CSGBase object
new_root_name_incomingnew name for the universe generated from the incoming root universe

Definition at line 1017 of file CSGBase.C.

1020{
1021 // case 2: incoming root is turned into new universe and existing root remains root
1022
1023 // add incoming universes to current Base
1024 auto & all_univs = univ_list.getUniverseListMap();
1025 for (auto & u : all_univs)
1026 {
1027 if (u.second->isRoot())
1028 {
1029 // create new universe from incoming root universe
1030 auto all_cells = u.second->getAllCells();
1031 createUniverse(new_root_name_incoming, all_cells);
1032 }
1033 else // unique non-root universe to add to list
1034 _universe_list.addUniverse(std::move(u.second), ignore_identical_universes);
1035 }
1036}

◆ operator!=()

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

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

Definition at line 1703 of file CSGBase.C.

1704{
1705 return !(*this == other);
1706}

◆ operator==()

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

Operator overload for checking if two CSGBase objects are equal.

Definition at line 1685 of file CSGBase.C.

1686{
1687 const auto & surf_list = this->getSurfaceList();
1688 const auto & other_surf_list = other.getSurfaceList();
1689 const auto & cell_list = this->getCellList();
1690 const auto & other_cell_list = other.getCellList();
1691 const auto & univ_list = this->getUniverseList();
1692 const auto & other_univ_list = other.getUniverseList();
1693 const auto & lat_list = this->getLatticeList();
1694 const auto & other_lat_list = other.getLatticeList();
1695 const auto & eng_unit_list = this->getEngUnitList();
1696 const auto & other_eng_unit_list = other.getEngUnitList();
1697 return (surf_list == other_surf_list) && (cell_list == other_cell_list) &&
1698 (univ_list == other_univ_list) && (lat_list == other_lat_list) &&
1699 (eng_unit_list == other_eng_unit_list);
1700}
const CSGSurfaceList & getSurfaceList() const
Get a const reference to the CSGSurfaceList object.
Definition CSGBase.h:964
const CSGEngUnitList & getEngUnitList() const
Get a const reference to the CSGEngUnitList object.
Definition CSGBase.h:1078

◆ prepareCellDeletion()

void CSG::CSGBase::prepareCellDeletion ( const CSGCell cell)
private

warn and remove cell from any universe that contains it

Definition at line 321 of file CSGBase.C.

322{
323 for (const auto & univ_ref : _universe_list.getAllUniverses())
324 {
325 const auto & univ = univ_ref.get();
326 for (const auto & univ_cell : univ.getAllCells())
327 if (cell == univ_cell.get())
328 {
329 // must remove from root intentionally too, but don't warn in this case (too noisy for
330 // expected behavior)
331 if (univ != getRootUniverse())
332 mooseWarning("Removing cell ",
333 cell.getName(),
334 " from universe with name ",
335 univ.getName(),
336 " before cell deletion.");
337 _universe_list.getUniverse(univ.getName()).removeCell(cell.getName());
338 }
339 }
340}
void removeCell(const std::string &name)
remove a cell of the specified name from the universe
Definition CSGUniverse.C:60

Referenced by deleteCell().

◆ prepareSurfaceDeletion()

void CSG::CSGBase::prepareSurfaceDeletion ( const CSGSurface surface) const
private

error if surface is referenced in any cell region

Definition at line 88 of file CSGBase.C.

89{
90 for (const auto & cell_ref : _cell_list.getAllCells())
91 {
92 const auto & cell = cell_ref.get();
93 for (const auto & region_surf : cell.getRegion().getSurfaces())
94 if (region_surf.get() == surface)
95 mooseError("Cannot delete surface with name ",
96 surface.getName(),
97 " as it is used in region definition of cell with name ",
98 cell.getName());
99 }
100}

Referenced by deleteSurface().

◆ prepareUniverseDeletion()

void CSG::CSGBase::prepareUniverseDeletion ( const CSGUniverse universe) const
private

error if universe is the root, used in any lattice, or used as a cell fill

Definition at line 458 of file CSGBase.C.

459{
460 if (univ == getRootUniverse())
461 mooseError("Cannot delete root universe from CSGBase instance");
462
463 // Check if universe is used in any existing lattices
464 for (const auto & lat : _lattice_list.getAllLattices())
465 {
466 for (const auto & lat_univ : lat.get().getUniqueUniverses())
467 if (univ == lat_univ.get())
468 mooseError("Cannot delete universe with name ",
469 univ.getName(),
470 " as it is used in lattice with name ",
471 lat.get().getName());
472 if ((lat.get().getOuterType() == "UNIVERSE") && (lat.get().getOuterUniverse() == univ))
473 mooseError("Cannot delete universe with name ",
474 univ.getName(),
475 " as it is used as the outer universe of lattice with name ",
476 lat.get().getName());
477 }
478
479 // Check if universe is used as fill in existing cells
480 for (const auto & cell_ref : _cell_list.getAllCells())
481 {
482 const auto & cell = cell_ref.get();
483 if ((cell.getFillType() == "UNIVERSE") && (cell.getFillUniverse() == univ))
484 mooseError("Cannot delete universe with name ",
485 univ.getName(),
486 " as it is used as the fill of cell with name ",
487 cell.getName());
488 }
489}

Referenced by deleteUniverse().

◆ rebuildEngUnitList()

void CSG::CSGBase::rebuildEngUnitList ( )
private

rebuilds the list of raw pointers to engineering units by iterating through the surface, cell, and universe lists.

Definition at line 979 of file CSGBase.C.

980{
981 _eng_unit_list = CSGEngUnitList(); // reset to empty
982
983 // iterate through all existing lists to find all CSGEngUnit types and store the pointers to the
984 // rebuilt engineering unit list
985 for (auto & [name, surf] : _surface_list.getSurfaceListMap())
986 if (auto * eu = dynamic_cast<CSGSurfaceEngUnit *>(surf.get()))
988 for (auto & [name, cell] : _cell_list.getCellListMap())
989 if (auto * eu = dynamic_cast<CSGCellEngUnit *>(cell.get()))
991 for (auto & [name, univ] : _universe_list.getUniverseListMap())
992 if (auto * eu = dynamic_cast<CSGUniverseEngUnit *>(univ.get()))
994}

Referenced by CSGBase(), joinOtherBase(), joinOtherBase(), and joinOtherBase().

◆ removeCellFromUniverse()

void CSG::CSGBase::removeCellFromUniverse ( const CSGUniverse universe,
const CSGCell cell 
)

Remove a cell from an existing universe.

Parameters
universeuniverse from which to remove the cell
cellcell to remove

Definition at line 537 of file CSGBase.C.

538{
539 // make sure cell is a part of this CSGBase instance
540 if (!checkCellInBase(cell))
541 mooseError("A cell named " + cell.getName() + " is being removed from universe " +
542 universe.getName() +
543 " that is different from the cell of the same name in the CSGBase instance.");
544 // make sure universe is a part of this CSGBase instance
545 if (!checkUniverseInBase(universe))
546 mooseError("Cells are being removed from a universe named " + universe.getName() +
547 " that is different " +
548 "from the universe of the same name in the CSGBase instance.");
549 auto & univ = _universe_list.getUniverse(universe.getName());
550 // removeCell will produce error that cell is not found in the case that the universe is actually
551 // an engineering unit, so we don't need to check that.
552 univ.removeCell(cell.getName());
553}

Referenced by removeCellsFromUniverse().

◆ removeCellsFromUniverse()

void CSG::CSGBase::removeCellsFromUniverse ( const CSGUniverse universe,
std::vector< std::reference_wrapper< const CSGCell > > &  cells 
)

Remove a list of cells from an existing universe.

Parameters
universeuniverse from which to remove the cells
cellslist of references to cells to remove

Definition at line 556 of file CSGBase.C.

558{
559 for (auto & c : cells)
560 removeCellFromUniverse(universe, c);
561}

◆ renameCell()

void CSG::CSGBase::renameCell ( const CSGCell cell,
const std::string &  name 
)

rename the specified cell

Parameters
cellreference to CSGCell to rename
namenew name

Definition at line 1161 of file CSGBase.C.

1162{
1163 // if cell is actually an engineering unit, we have to also check that no other units have the
1164 // same name already
1165 if (cellToEngUnit(cell))
1166 if (_eng_unit_list.hasEngUnit(name))
1167 mooseError("Cannot rename cell " + cell.getName() + " to " + name + ". " + cell.getName() +
1168 " is an engineering unit and a unit with name " + name + " already exists.");
1169
1170 _cell_list.renameCell(cell, name);
1171}
void renameCell(const CSGCell &cell, const std::string &name)
rename the specified cell
Definition CSGCellList.C:92

◆ renameEngUnit()

void CSG::CSGBase::renameEngUnit ( const CSGEngUnit unit,
const std::string &  name 
)

Rename the specified engineering unit.

Parameters
unitreference to engineering unit to rename
namenew name

Definition at line 1130 of file CSGBase.C.

1131{
1132 // Rename in the owning type list (updates the object's name and the type list map key).
1133 // The EngUnit index stores raw pointers; because the object's name is updated in-place,
1134 // no index update is needed.
1135 if (const auto * surf = dynamic_cast<const CSGSurfaceEngUnit *>(&unit))
1136 renameSurface(*surf, name);
1137 else if (const auto * cell = dynamic_cast<const CSGCellEngUnit *>(&unit))
1138 renameCell(*cell, name);
1139 else if (const auto * univ = dynamic_cast<const CSGUniverseEngUnit *>(&unit))
1140 renameUniverse(*univ, name);
1141 else
1142 mooseError(
1143 "Engineering unit '", unit.getName(), "' has an unrecognized type and cannot be renamed.");
1144}
void renameSurface(const CSGSurface &surface, const std::string &name)
rename the specified surface
Definition CSGBase.C:1147
void renameUniverse(const CSGUniverse &universe, const std::string &name)
rename the specified universe
Definition CSGBase.C:1174
void renameCell(const CSGCell &cell, const std::string &name)
rename the specified cell
Definition CSGBase.C:1161

◆ renameLattice()

void CSG::CSGBase::renameLattice ( const CSGLattice lattice,
const std::string &  name 
)
inline

rename the lattice

Parameters
latticelattice to rename
namenew name

Definition at line 451 of file CSGBase.h.

452 {
453 _lattice_list.renameLattice(lattice, name);
454 }
void renameLattice(const CSGLattice &lattice, const std::string &name)
rename the specified lattice

◆ renameRootUniverse()

void CSG::CSGBase::renameRootUniverse ( const std::string &  name)
inline

rename the root universe for this instance (default is ROOT_UNIVERSE)

Parameters
namenew name for the root universe

Definition at line 279 of file CSGBase.h.

280 {
282 }

◆ renameSurface()

void CSG::CSGBase::renameSurface ( const CSGSurface surface,
const std::string &  name 
)

rename the specified surface

Parameters
surfaceCSGSurface to rename
namenew name

Definition at line 1147 of file CSGBase.C.

1148{
1149 // if surface is actually an engineering unit, we have to also check that no other units have the
1150 // same name already
1151 if (surfaceToEngUnit(surface))
1152 if (_eng_unit_list.hasEngUnit(name))
1153 mooseError("Cannot rename surface " + surface.getName() + " to " + name + ". " +
1154 surface.getName() + " is an engineering unit and a unit with name " + name +
1155 " already exists.");
1156
1157 _surface_list.renameSurface(surface, name);
1158}
void renameSurface(const CSGSurface &surface, const std::string &name)
rename the specified surface

◆ renameUniverse()

void CSG::CSGBase::renameUniverse ( const CSGUniverse universe,
const std::string &  name 
)

rename the specified universe

Parameters
universereference to CSGUniverse to rename
namenew name

Definition at line 1174 of file CSGBase.C.

1175{
1176 // if universe is actually an engineering unit, we have to also check that no other units have the
1177 // same name already
1178 if (universeToEngUnit(universe))
1179 if (_eng_unit_list.hasEngUnit(name))
1180 mooseError("Cannot rename universe " + universe.getName() + " to " + name + ". " +
1181 universe.getName() + " is an engineering unit and a unit with name " + name +
1182 " already exists.");
1183
1184 _universe_list.renameUniverse(universe, name);
1185}
void renameUniverse(const CSGUniverse &universe, const std::string &name)
rename the specified universe

Referenced by renameRootUniverse().

◆ replaceCellRefs()

void CSG::CSGBase::replaceCellRefs ( const CSGCell old_cell,
const CSGCell new_cell 
)
private

Replace all old_cell references with new_cell across all universes in the base.

Definition at line 1525 of file CSGBase.C.

1526{
1527 for (const auto & univ_ref : getAllUniverses())
1528 {
1529 const CSGUniverse & univ = univ_ref.get();
1530 for (const auto & cell_ref : univ.getAllCells())
1531 if (&cell_ref.get() == &old_cell)
1532 {
1533 removeCellFromUniverse(univ, old_cell);
1534 addCellToUniverse(univ, new_cell);
1535 }
1536 }
1537}

◆ replaceCellRefsByName()

void CSG::CSGBase::replaceCellRefsByName ( std::map< std::string, std::reference_wrapper< const CSGCell > > &  identical_cell_refs,
CSGBase base 
)
private

update cell references of incoming CSGbase to point to those of existing CSGBase object based on CSGCell name.

This involves updating the cell references of universes.

Parameters
identical_cell_refsmap of cell names to cell references that will be used for replacement
baseCSGBase object that contains references that should be updated

Definition at line 884 of file CSGBase.C.

887{
888 // Update cell references of universes to those of this base
889 for (auto & [univ_name, univ_ptr] : base.getUniverseList().getUniverseListMap())
890 for (auto & [cell_name, cell_ref] : identical_cell_refs)
891 if (univ_ptr->hasCell(cell_name))
892 {
893 univ_ptr->removeCell(cell_name);
894 univ_ptr->addCell(cell_ref);
895 }
896}

◆ replaceLatticeRefsByName()

void CSG::CSGBase::replaceLatticeRefsByName ( std::map< std::string, std::reference_wrapper< const CSGLattice > > &  identical_lattice_refs,
CSGBase base 
)
private

update lattice references of incoming CSGbase to point to those of existing CSGBase object based on CSGLattice name.

This involves updating the lattice references of cells.

Parameters
identical_lattice_refsmap of lattice names to lattice references that will be used for replacement
baseCSGBase object that contains references that should be updated

Definition at line 936 of file CSGBase.C.

939{
940 // Update lattice references of cells to those of this base
941 for (auto & [cell_name, cell_ptr] : base.getCellList().getCellListMap())
942 {
943 const auto fill_type = cell_ptr->getFillType();
944 const auto fill_name = cell_ptr->getFillName();
945 if ((fill_type == "LATTICE") &&
946 (identical_lattice_refs.find(fill_name) != identical_lattice_refs.end()))
947 {
948 const CSGLattice * lat_ptr = &identical_lattice_refs.at(fill_name).get();
949 cell_ptr->updateCellFill(lat_ptr);
950 }
951 }
952}

◆ replaceSurfaceRefsByName()

void CSG::CSGBase::replaceSurfaceRefsByName ( std::map< std::string, std::reference_wrapper< const CSGSurface > > &  identical_surface_refs,
CSGBase base 
)
private

update surface references of incoming CSGBase to point to those of existing CSGBase object based on CSGSurface name.

This involves updating the surface references of cell regions.

Parameters
identical_surface_refsmap of surface names to surface references that will be used for replacement
baseCSGBase object that contains references that should be updated

Definition at line 874 of file CSGBase.C.

877{
878 // Update surface references of cell regions to those of this base
879 for (auto & [cell_name, cell_ptr] : base.getCellList().getCellListMap())
880 cell_ptr->updateCellRegionSurfaces(identical_surface_refs);
881}

◆ replaceSurfaceRefsWithRegion()

void CSG::CSGBase::replaceSurfaceRefsWithRegion ( const CSGSurface old_surf,
const CSGRegion sub_region 
)
private

Replace all region occurrences of old_surf with the tokens from sub_region across all cells in the base.

Definition at line 1540 of file CSGBase.C.

1541{
1542 for (const auto & cell_ref : getAllCells())
1543 {
1544 const CSGCell & cell = cell_ref.get();
1545 CSGRegion new_region = cell.getRegion();
1546 if (new_region.getRegionType() == CSGRegion::RegionType::EMPTY)
1547 continue; // cell units do not have a region so skip (can also skip if a regular cell has an
1548 // empty region)
1549 new_region.replaceWithSubRegion(old_surf, sub_region);
1550 updateCellRegion(cell, new_region);
1551 }
1552}
void updateCellRegion(const CSGCell &cell, const CSGRegion &region)
change the region of the specified cell
Definition CSGBase.C:358

◆ replaceUniverseRefs()

void CSG::CSGBase::replaceUniverseRefs ( const CSGUniverse old_univ,
const CSGUniverse new_univ 
)
private

Replace all cell fills and lattice elements/outers referencing old_univ with new_univ.

Definition at line 1495 of file CSGBase.C.

1496{
1497 // 1. Cell fills
1498 for (const auto & cell_ref : getAllCells())
1499 {
1500 const CSGCell & cell = cell_ref.get();
1501 if (cell.getFillType() == "UNIVERSE" && cell.getFillUniverse() == old_univ)
1502 updateCellFill(cell, &new_univ);
1503 }
1504
1505 // 2. Lattice universe maps and outer fills
1506 for (const auto & lat_ref : getAllLattices())
1507 {
1508 const CSGLattice & lat = lat_ref.get();
1509 if (lat.getOuterType() == "UNIVERSE" && lat.getOuterUniverse() == old_univ)
1510 setLatticeOuter(lat, new_univ);
1511
1512 auto lat_map = lat.getUniverses();
1513 for (std::size_t row = 0; row < lat_map.size(); ++row)
1514 for (std::size_t col = 0; col < lat_map[row].size(); ++col)
1515 if (lat_map[row][col].get() == old_univ)
1516 setUniverseAtLatticeIndex(lat, new_univ, {static_cast<int>(row), static_cast<int>(col)});
1517 }
1518
1519 // 3. Root universe pointer in universe list
1520 if (getRootUniverse() == old_univ)
1521 _universe_list._root_universe = &new_univ;
1522}
void setUniverseAtLatticeIndex(const CSGLattice &lattice, const CSGUniverse &universe, std::pair< int, int > index)
set location in the lattice to be the provided universe
Definition CSGBase.C:600
void setLatticeOuter(const CSGLattice &lattice, const std::string &outer_name)
Set the outer fill for the lattice to the material name provided.
Definition CSGBase.C:564
void updateCellFill(const CSGCell &cell, const std::string &mat_name)
change the fill of the specified cell to a material fill
Definition CSGBase.C:391
const CSGUniverse * _root_universe
root universe for the CSGBase instance

◆ replaceUniverseRefsByName()

void CSG::CSGBase::replaceUniverseRefsByName ( std::map< std::string, std::reference_wrapper< const CSGUniverse > > &  identical_universe_refs,
CSGBase base 
)
private

update universe references of incoming CSGbase to point to those of existing CSGBase object based on CSGUniverse name.

This involves updating the universe references of cells and universe references of lattices.

Parameters
identical_universe_refsmap of universe names to universe references that will be used for replacement
baseCSGBase object that contains references that should be updated

Definition at line 899 of file CSGBase.C.

902{
903 // Update universe references of cells to those of this base
904 for (auto & [cell_name, cell_ptr] : base.getCellList().getCellListMap())
905 {
906 const auto fill_type = cell_ptr->getFillType();
907 const auto fill_name = cell_ptr->getFillName();
908 if ((fill_type == "UNIVERSE") &&
909 (identical_universe_refs.find(fill_name) != identical_universe_refs.end()))
910 {
911 const CSGUniverse * univ_ptr = &identical_universe_refs.at(fill_name).get();
912 cell_ptr->updateCellFill(univ_ptr);
913 }
914 }
915
916 // Update universe references of lattices to those of this base
917 for (auto & [lat_name, lat_ptr] : base.getLatticeList().getLatticeListMap())
918 for (auto & [univ_name, univ_ref] : identical_universe_refs)
919 {
920 // Check if universe belongs to lattice
921 if (lat_ptr->hasUniverse(univ_name))
922 {
923 // If so, replace all instances of this universe in the lattice
924 const auto univ_indices = lat_ptr->getUniverseIndices(univ_name);
925 for (const auto & index : univ_indices)
926 lat_ptr->setUniverseAtIndex(univ_ref, index);
927 }
928 // Check if universe belongs to lattice outer
929 if ((lat_ptr->getOuterType() == "UNIVERSE") &&
930 (lat_ptr->getOuterUniverse().getName() == univ_name))
931 lat_ptr->updateOuter(univ_ref);
932 }
933}

◆ resetCellFill()

void CSG::CSGBase::resetCellFill ( const CSGCell cell)

reset the fill of the specified cell to void

Parameters
cellcell to update the fill for

Definition at line 375 of file CSGBase.C.

376{
377 // cannot update region for a cell that is actually an engineering unit
378 if (cellToEngUnit(cell))
379 mooseError("Fill cannot be reset for cell '" + cell.getName() +
380 "' because it is a CSGCellEngUnit.");
381
382 if (!checkCellInBase(cell))
383 mooseError("The fill of cell with name " + cell.getName() +
384 " that is being updated is different " +
385 "from the cell of the same name in the CSGBase instance.");
386 auto & list_cell = _cell_list.getCell(cell.getName());
387 list_cell.resetCellFill();
388}
void resetCellFill()
Reset the cell fill to void.
Definition CSGCell.C:86

◆ resetLatticeOuter()

void CSG::CSGBase::resetLatticeOuter ( const CSGLattice lattice)

reset the outer fill for the lattice to VOID

Parameters
latticelattice to update

Definition at line 589 of file CSGBase.C.

590{
591 auto name = lattice.getName();
592 if (!checkLatticeInBase(lattice))
593 mooseError("Cannot reset outer for lattice " + name +
594 ". Lattice is different from the lattice of the same name in the "
595 "CSGBase instance.");
597}
void resetOuter()
reset the outer fill around the lattice elements to be VOID
Definition CSGLattice.C:143

◆ setLatticeOuter() [1/2]

void CSG::CSGBase::setLatticeOuter ( const CSGLattice lattice,
const CSGUniverse outer_univ 
)

Set the outer fill for the lattice to the universe provided.

This will set the outer type to UNIVERSE regardless of its previous outer type.

Parameters
latticelattice to update
outer_univuniverse to use as outer fill between lattice elements

Definition at line 575 of file CSGBase.C.

576{
577 auto name = lattice.getName();
578 if (!checkLatticeInBase(lattice))
579 mooseError("Cannot set outer universe for lattice " + name +
580 ". Lattice is different from the lattice of the same name in the "
581 "CSGBase instance.");
582 if (!checkUniverseInBase(outer_univ))
583 mooseError("Cannot set outer universe for lattice " + name + ". Outer universe " +
584 outer_univ.getName() + " is not in the CSGBase instance.");
585 _lattice_list.getLattice(name).updateOuter(outer_univ);
586}
void updateOuter(const std::string &outer_name)
Update the outer of the lattice to be the provided material name.
Definition CSGLattice.C:135

◆ setLatticeOuter() [2/2]

void CSG::CSGBase::setLatticeOuter ( const CSGLattice lattice,
const std::string &  outer_name 
)

Set the outer fill for the lattice to the material name provided.

This will set the outer type to CSG_MATERIAL regardless of its previous outer type.

Parameters
latticelattice to update
outer_namename of material to use as outer fill between lattice elements

Definition at line 564 of file CSGBase.C.

565{
566 auto name = lattice.getName();
567 if (!checkLatticeInBase(lattice))
568 mooseError("Cannot set outer for lattice " + name +
569 ". Lattice is different from the lattice of the same name in the "
570 "CSGBase instance.");
571 _lattice_list.getLattice(name).updateOuter(outer_name);
572}

◆ setLatticeUniverses()

void CSG::CSGBase::setLatticeUniverses ( const CSGLattice lattice,
std::vector< std::vector< std::reference_wrapper< const CSGUniverse > > > &  universes 
)

Set provided universes as the layout of the lattice.

Parameters
latticelattice to add universes to
universeslist of list of universes in the proper layout for the lattice type and dimensions

Definition at line 616 of file CSGBase.C.

619{
620 auto name = lattice.getName();
621 if (!checkLatticeInBase(lattice))
622 mooseError("Cannot set universes for lattice " + name +
623 ". Lattice is different from the lattice of the same name in the "
624 "CSGBase instance.");
625 // make sure all universes are a part of this base instance
626 for (auto univ_list : universes)
627 for (const CSGUniverse & univ : univ_list)
628 if (!checkUniverseInBase(univ))
629 mooseError("Cannot set universes for lattice " + name + ". Universe " + univ.getName() +
630 " is not in the CSGBase instance.");
631 _lattice_list.getLattice(name).setUniverses(universes);
632}
virtual void setUniverses(std::vector< std::vector< std::reference_wrapper< const CSGUniverse > > > universes)=0
assign the vectors of universes as the lattice elements

◆ setUniverseAtLatticeIndex()

void CSG::CSGBase::setUniverseAtLatticeIndex ( const CSGLattice lattice,
const CSGUniverse universe,
std::pair< int, int index 
)

set location in the lattice to be the provided universe

Parameters
latticelattice to update
universeuniverse to set at the location
indexindex of the lattice element (int, int)

Definition at line 600 of file CSGBase.C.

603{
604 auto name = lattice.getName();
605 if (!checkLatticeInBase(lattice))
606 mooseError("Cannot set universe at index for lattice " + name +
607 ". Lattice is different from the lattice of the same name in the "
608 "CSGBase instance.");
609 if (!checkUniverseInBase(universe))
610 mooseError("Cannot add universe " + universe.getName() + " to lattice " + lattice.getName() +
611 ". Universe is not in the CSGBase instance.");
612 _lattice_list.getLattice(name).setUniverseAtIndex(universe, index);
613}
void setUniverseAtIndex(const CSGUniverse &universe, const std::pair< int, int > index)
replace the element at specified index in the lattice with the provided CSGUniverse.
Definition CSGLattice.C:28

◆ surfaceToEngUnit()

const CSGSurfaceEngUnit * CSG::CSGBase::surfaceToEngUnit ( const CSGSurface surf) const
inlineprivate

Returns the CSGSurfaceEngUnit pointer if surf is an eng unit, nullptr otherwise.

Usable as a boolean check or to access the eng unit directly.

Parameters
surfCSGSurface to check/get as an engineering unit
Returns
const CSGSurfaceEngUnit* or nullptr

Definition at line 1199 of file CSGBase.h.

1200 {
1201 return dynamic_cast<const CSGSurfaceEngUnit *>(&surf);
1202 }

Referenced by addSurface(), and deleteSurface().

◆ universeToEngUnit()

const CSGUniverseEngUnit * CSG::CSGBase::universeToEngUnit ( const CSGUniverse univ) const
inlineprivate

Returns the CSGUniverseEngUnit pointer if univ is an eng unit, nullptr otherwise.

Usable as a boolean check or to access the eng unit directly.

Parameters
univCSGUniverse to check/get as an engineering unit
Returns
const CSGUniverseEngUnit* or nullptr

Definition at line 1223 of file CSGBase.h.

1224 {
1225 return dynamic_cast<const CSGUniverseEngUnit *>(&univ);
1226 }

Referenced by addCellToUniverse(), addUniverseToList(), CSGBase(), and deleteUniverse().

◆ updateCellFill() [1/3]

void CSG::CSGBase::updateCellFill ( const CSGCell cell,
const CSGLattice lattice 
)

change the fill of the specified cell to a lattice fill

Parameters
cellcell to update the fill for
latticepointer to lattice fill

Definition at line 428 of file CSGBase.C.

429{
430 // cannot update region for a cell that is actually an engineering unit
431 if (cellToEngUnit(cell))
432 mooseError("Fill cannot be updated for cell '" + cell.getName() +
433 "' because it is a CSGCellEngUnit.");
434
435 if (!checkLatticeInBase(*lattice))
436 mooseError("Lattice with name ",
437 lattice->getName(),
438 " is being used as a cell fill that is different from the lattice of the same name "
439 "in the CSGBase instance.");
440 if (!checkCellInBase(cell))
441 mooseError("The fill of cell with name " + cell.getName() +
442 " that is being updated is different " +
443 "from the cell of the same name in the CSGBase instance.");
444 auto & list_cell = _cell_list.getCell(cell.getName());
445 list_cell.updateCellFill(lattice);
446}
void updateCellFill(const std::string &mat_name)
Set the cell fill to a material name.
Definition CSGCell.C:95

◆ updateCellFill() [2/3]

void CSG::CSGBase::updateCellFill ( const CSGCell cell,
const CSGUniverse univ 
)

change the fill of the specified cell to a universe fill

Parameters
cellcell to update the fill for
univpointer to universe fill

Definition at line 407 of file CSGBase.C.

408{
409 // cannot update region for a cell that is actually an engineering unit
410 if (cellToEngUnit(cell))
411 mooseError("Fill cannot be updated for cell '" + cell.getName() +
412 "' because it is a CSGCellEngUnit.");
413
414 if (!checkUniverseInBase(*univ))
415 mooseError("Universe with name ",
416 univ->getName(),
417 " is being used as a cell fill that is different from the universe of the same name "
418 "in the CSGBase instance.");
419 if (!checkCellInBase(cell))
420 mooseError("The fill of cell with name " + cell.getName() +
421 " that is being updated is different " +
422 "from the cell of the same name in the CSGBase instance.");
423 auto & list_cell = _cell_list.getCell(cell.getName());
424 list_cell.updateCellFill(univ);
425}

◆ updateCellFill() [3/3]

void CSG::CSGBase::updateCellFill ( const CSGCell cell,
const std::string &  mat_name 
)

change the fill of the specified cell to a material fill

Parameters
cellcell to update the fill for
mat_namename of material fill

Definition at line 391 of file CSGBase.C.

392{
393 // cannot update region for a cell that is actually an engineering unit
394 if (cellToEngUnit(cell))
395 mooseError("Fill cannot be updated for cell '" + cell.getName() +
396 "' because it is a CSGCellEngUnit.");
397
398 if (!checkCellInBase(cell))
399 mooseError("The region of cell with name " + cell.getName() +
400 " that is being updated is different " +
401 "from the cell of the same name in the CSGBase instance.");
402 auto & list_cell = _cell_list.getCell(cell.getName());
403 list_cell.updateCellFill(mat_name);
404}

◆ updateCellRegion()

void CSG::CSGBase::updateCellRegion ( const CSGCell cell,
const CSGRegion region 
)

change the region of the specified cell

Parameters
cellcell to update the region for
regionnew region to assign to cell

Definition at line 358 of file CSGBase.C.

359{
360 // cannot update region for a cell that is actually an engineering unit
361 if (cellToEngUnit(cell))
362 mooseError("Region cannot be updated for cell '" + cell.getName() +
363 "' because it is a CSGCellEngUnit.");
364
365 checkRegionSurfaces(region);
366 if (!checkCellInBase(cell))
367 mooseError("The region of cell with name " + cell.getName() +
368 " that is being updated is different " +
369 "from the cell of the same name in the CSGBase instance.");
370 auto & list_cell = _cell_list.getCell(cell.getName());
371 list_cell.updateRegion(region);
372}
void updateRegion(const CSGRegion &region)
Definition CSGCell.h:151

◆ updateIncomingCSGReferences()

void CSG::CSGBase::updateIncomingCSGReferences ( CSGBase incoming_base)
private

update references of incoming CSGbase to point to those of existing CSGBase object.

This includes updating the surface references of cell regions, universe/lattice references of cell fills, cell references of universes, and universe references of lattices

Parameters
incoming_baseCSGBase object that contains references that should be updated

Definition at line 824 of file CSGBase.C.

825{
826 // Iterate through all incoming surfaces and track which ones have names already
827 // defined within this CSGSurfaceList object
828 std::map<std::string, std::reference_wrapper<const CSGSurface>> identical_surface_refs;
829 auto & surf_list_map = incoming_base.getSurfaceList().getSurfaceListMap();
830 for (const auto & [surf_name, surf_ptr] : surf_list_map)
831 if (hasSurface(surf_name))
832 identical_surface_refs.insert({surf_name, getSurfaceByName(surf_name)});
833
834 // Iterate through all incoming cells and track which ones have names already
835 // defined within this CSGCellList object
836 std::map<std::string, std::reference_wrapper<const CSGCell>> identical_cell_refs;
837 auto & cell_list_map = incoming_base.getCellList().getCellListMap();
838 for (const auto & [cell_name, cell_ptr] : cell_list_map)
839 if (hasCell(cell_name))
840 identical_cell_refs.insert({cell_name, getCellByName(cell_name)});
841
842 // Iterate through all incoming universes and track which ones have names already
843 // defined within this CSGUniverseList object
844 std::map<std::string, std::reference_wrapper<const CSGUniverse>> identical_universe_refs;
845 auto & universe_list_map = incoming_base.getUniverseList().getUniverseListMap();
846 for (const auto & [univ_name, univ_ptr] : universe_list_map)
847 if (hasUniverse(univ_name))
848 identical_universe_refs.insert({univ_name, getUniverseByName(univ_name)});
849
850 // Iterate through all incoming lattices and track which ones have names already
851 // defined within this CSGLatticeList object
852 std::map<std::string, std::reference_wrapper<const CSGLattice>> identical_lattice_refs;
853 auto & lattice_list_map = incoming_base.getLatticeList().getLatticeListMap();
854 for (const auto & [lat_name, lat_ptr] : lattice_list_map)
855 if (hasLattice(lat_name))
856 identical_lattice_refs.insert({lat_name, getLatticeByName(lat_name)});
857
858 // Update all surface, cell, universe, and lattice references of incoming base to those of this
859 // base
860 if (!identical_surface_refs.empty())
861 replaceSurfaceRefsByName(identical_surface_refs, incoming_base);
862
863 if (!identical_cell_refs.empty())
864 replaceCellRefsByName(identical_cell_refs, incoming_base);
865
866 if (!identical_universe_refs.empty())
867 replaceUniverseRefsByName(identical_universe_refs, incoming_base);
868
869 if (!identical_lattice_refs.empty())
870 replaceLatticeRefsByName(identical_lattice_refs, incoming_base);
871}
void replaceUniverseRefsByName(std::map< std::string, std::reference_wrapper< const CSGUniverse > > &identical_universe_refs, CSGBase &base)
update universe references of incoming CSGbase to point to those of existing CSGBase object based on ...
Definition CSGBase.C:899
const CSGSurface & getSurfaceByName(const std::string &name) const
Get a Surface object by name.
Definition CSGBase.h:107
void replaceLatticeRefsByName(std::map< std::string, std::reference_wrapper< const CSGLattice > > &identical_lattice_refs, CSGBase &base)
update lattice references of incoming CSGbase to point to those of existing CSGBase object based on C...
Definition CSGBase.C:936
bool hasUniverse(const std::string &name) const
Check if a universe with given name exists in CSGBase object.
Definition CSGBase.h:382
bool hasLattice(const std::string &name) const
Check if a lattice with given name exists in CSGBase object.
Definition CSGBase.h:520
bool hasSurface(const std::string &name) const
Check if a surface with given name exists in CSGBase object.
Definition CSGBase.h:118
const LatticeType & getLatticeByName(const std::string &name)
Get a lattice object of the specified type by name.
Definition CSGBase.h:504
void replaceCellRefsByName(std::map< std::string, std::reference_wrapper< const CSGCell > > &identical_cell_refs, CSGBase &base)
update cell references of incoming CSGbase to point to those of existing CSGBase object based on CSGC...
Definition CSGBase.C:884
void replaceSurfaceRefsByName(std::map< std::string, std::reference_wrapper< const CSGSurface > > &identical_surface_refs, CSGBase &base)
update surface references of incoming CSGBase to point to those of existing CSGBase object based on C...
Definition CSGBase.C:874
const CSGCell & getCellByName(const std::string &name) const
Get a Cell object by name.
Definition CSGBase.h:210

Referenced by joinOtherBase(), joinOtherBase(), and joinOtherBase().

Member Data Documentation

◆ _cell_list

CSGCellList CSG::CSGBase::_cell_list
private

◆ _eng_unit_list

CSGEngUnitList CSG::CSGBase::_eng_unit_list
private

◆ _lattice_list

CSGLatticeList CSG::CSGBase::_lattice_list
private

◆ _surface_list

CSGSurfaceList CSG::CSGBase::_surface_list
private

List of surfaces associated with CSG object.

Definition at line 1253 of file CSGBase.h.

Referenced by addEngUnit(), addSurface(), addTransformation(), deleteSurface(), getAllSurfaces(), getSurface(), getSurfaceByName(), getSurfaceList(), getSurfaceList(), and hasSurface().

◆ _universe_list

CSGUniverseList CSG::CSGBase::_universe_list
private

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