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 areCSGObjectsLinked () const
 Check whether all universes, cells, and surfaces 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 getLinkedCSGObjects (const CSGUniverse &univ, std::set< std::string > &linked_universe_names, std::set< std::string > &linked_cell_names, std::set< std::string > &linked_surface_names) const
 Recursive method to retrieve all universes, cells, and surfaces 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:1264
CSGSurfaceList _surface_list
List of surfaces associated with CSG object.
Definition CSGBase.h:1261
CSGLatticeList _lattice_list
List of lattices associated with CSG object.
Definition CSGBase.h:1270
CSGUniverseList _universe_list
List of universes associated with CSG object.
Definition CSGBase.h:1267

◆ 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:136
const CSGCellList & getCellList() const
Get a const reference to the CSGCellList object.
Definition CSGBase.h:986
std::unique_ptr< CSGBase > clone() const
Create a deep copy of this CSGBase instance.
Definition CSGBase.C:78
const CSGLattice & addLatticeToList(const CSGLattice &lattice)
Add a new lattice to the lattice list based on a lattice reference.
Definition CSGBase.C:202
const CSGUniverse & addUniverseToList(const CSGUniverse &univ)
Add a new universe to the universe list based on a universe reference.
Definition CSGBase.C:177
std::vector< std::reference_wrapper< const CSGUniverseEngUnit > > getAllUniverseEngUnits() const
Get all universe-like engineering units.
Definition CSGBase.h:659
std::vector< std::reference_wrapper< const CSGCell > > getAllCells() const
Get all cell objects.
Definition CSGBase.h:204
const CSGUniverseList & getUniverseList() const
Get a const reference to the CSGUniverseList object.
Definition CSGBase.h:1000
void rebuildEngUnitList()
rebuilds the list of raw pointers to engineering units by iterating through the surface,...
Definition CSGBase.C:997
const CSGLatticeList & getLatticeList() const
Get a const reference to the CSGLatticeList object.
Definition CSGBase.h:1014
const CSGUniverse & getRootUniverse() const
Get the Root Universe object.
Definition CSGBase.h:277
const CSGUniverseEngUnit * universeToEngUnit(const CSGUniverse &univ) const
Returns the CSGUniverseEngUnit pointer if univ is an eng unit, nullptr otherwise.
Definition CSGBase.h:1231
std::vector< std::reference_wrapper< const CSGCellEngUnit > > getAllCellEngUnits() const
Get all cell-like engineering units in CSGBase.
Definition CSGBase.h:649
void addCellToUniverse(const CSGUniverse &universe, const CSGCell &cell)
Add a cell to an existing universe.
Definition CSGBase.C:525
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:539
const CSGCellEngUnit * cellToEngUnit(const CSGCell &cell) const
Returns the CSGCellEngUnit pointer if cell is an eng unit, nullptr otherwise.
Definition CSGBase.h:1219
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 547 of file CSGBase.C.

549{
550 for (auto & c : cells)
551 addCellToUniverse(universe, c);
552}

◆ 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 136 of file CSGBase.C.

137{
138 // If cell has already been created, we just return a reference to it
139 const auto name = cell.getName();
140 if (_cell_list.hasCell(name))
141 return _cell_list.getCell(name);
142
143 // Engineering unit cells must be registered via addEngUnit(), not addCellToList()
144 if (cellToEngUnit(cell))
145 mooseError("Cell '",
146 name,
147 "' is a CSGCellEngUnit and must be added via addEngUnit(), not addCellToList().");
148
149 // Otherwise if the cell has material or void cell, we can create it directly
150 const auto fill_type = cell.getFillType();
151 const auto region = cell.getRegion();
152 if (fill_type == "VOID")
153 return _cell_list.addVoidCell(name, region);
154 else if (fill_type == "CSG_MATERIAL")
155 {
156 const auto mat_name = cell.getFillMaterial();
157 return _cell_list.addMaterialCell(name, mat_name, region);
158 }
159 else if (fill_type == "LATTICE")
160 {
161 // add lattice recursively to capture all linked universes in the lattice
162 const CSGLattice & lattice = addLatticeToList(cell.getFillLattice());
163 return _cell_list.addLatticeCell(name, lattice, region);
164 }
165 // Otherwise if the cell has a universe fill, we need to recursively define
166 // all linked universes and cells first before defining this cell
167 else if (fill_type == "UNIVERSE")
168 {
169 const auto & univ = addUniverseToList(cell.getFillUniverse());
170 return _cell_list.addUniverseCell(name, univ, region);
171 }
172 else
173 mooseError("Cell " + name + " has unrecognized fill type " + fill_type);
174}
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 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 525 of file CSGBase.C.

526{
527 // if universe is actually engineering unit, cannot add cells
528 if (universeToEngUnit(universe))
529 mooseError("Universe '" + universe.getName() +
530 "' cannot add cells because it is a CSGUniverseEngUnit.");
531
532 // make sure cell is a part of this CSGBase instance
533 if (!checkCellInBase(cell))
534 mooseError("A cell named " + cell.getName() + " is being added to universe " +
535 universe.getName() +
536 " that is different from the cell of the same name in the CSGBase instance.");
537 // make sure universe is a part of this CSGBase instance
538 if (!checkUniverseInBase(universe))
539 mooseError("Cells are being added to a universe named " + universe.getName() +
540 " that is different " +
541 "from the universe of the same name in the CSGBase instance.");
542 auto & univ = _universe_list.getUniverse(universe.getName());
543 univ.addCell(cell);
544}
bool checkCellInBase(const CSGCell &cell) const
check that cell being accessed is a part of this CSGBase instance
Definition CSGBase.C:1108
bool checkUniverseInBase(const CSGUniverse &universe) const
check that universe being accessed is a part of this CSGBase instance
Definition CSGBase.C:1118
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 addEngUnit(), 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 539 of file CSGBase.h.

540 {
541 static_assert(std::is_base_of_v<CSGEngUnit, T>, "T must derive from CSGEngUnit");
542 static_assert(std::is_base_of_v<CSGSurface, T> || std::is_base_of_v<CSGCell, T> ||
543 std::is_base_of_v<CSGUniverse, T>,
544 "T must also derive from CSGSurface, CSGCell, or CSGUniverse");
545 // create raw pointer so we can transfer ownership to the proper type list without destroying
546 // it, and also can store the pointer in the CSGEngUnitList (non-owning list)
547 T * raw = unit.get();
548
549 // must check if an engineering unit of the same name (regardless of type) exists already before
550 // adding it to any list so that we don't add to a type-list before knowing if it is actually
551 // allowable as a unit. The addX checks below will check that the name doesn't conflict with a
552 // real type unit too.
553 if (_eng_unit_list.hasEngUnit(raw->getName()))
555 "An engineering unit with name '", raw->getName(), "' already exists in geometry.");
556
557 // Transfer ownership to the appropriate type list
558 if constexpr (std::is_base_of_v<CSGSurface, T>)
559 _surface_list.addSurface(std::move(unit));
560 else if constexpr (std::is_base_of_v<CSGCell, T>)
561 {
562 // must add a cell unit to the appropriate universe
563 auto & cell = _cell_list.addCell(std::move(unit));
564 if (add_to_univ)
565 addCellToUniverse(*add_to_univ, cell);
566 else
568 }
569 else if constexpr (std::is_base_of_v<CSGUniverse, T>)
570 _universe_list.addUniverse(std::move(unit));
571
572 // Register non-owning pointer in the CSGEngUnitList if no name conflicts identified above.
573 _eng_unit_list.addEngUnit(cast_ref<CSGEngUnit &>(*raw));
574 return *raw;
575 }
CSGEngUnitList _eng_unit_list
Container for all associated engineering units.
Definition CSGBase.h:1273
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 398 of file CSGBase.h.

399 {
400 static_assert(std::is_base_of_v<CSGLattice, LatticeType>, "Is not a CSGLattice");
401 // make sure all universes are a part of this base instance
402 auto universes = lattice->getUniverses();
403 for (auto univ_list : universes)
404 for (const CSGUniverse & univ : univ_list)
405 if (!checkUniverseInBase(univ))
406 mooseError("Cannot add lattice " + lattice->getName() + " of type " + lattice->getType() +
407 ". Universe " + univ.getName() + " is not in the CSGBase instance.");
408
409 if (lattice->getOuterType() == "UNIVERSE")
410 {
411 const CSGUniverse & outer_univ = lattice->getOuterUniverse();
412 if (!checkUniverseInBase(outer_univ))
413 mooseError("Cannot add lattice " + lattice->getName() + " of type " + lattice->getType() +
414 ". Outer universe " + outer_univ.getName() + " is not in the CSGBase instance.");
415 }
416 auto & lat_ref = _lattice_list.addLattice(std::move(lattice));
417 return dynamic_cast<LatticeType &>(lat_ref);
418 }
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.

◆ 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 202 of file CSGBase.C.

203{
204 // If lattice has already been created, we just return a reference to it
205 const auto name = lattice.getName();
206 if (_lattice_list.hasLattice(name))
207 return _lattice_list.getLattice(name);
208
209 // Clone the lattice (associated universes need to be transferred and set)
210 auto cloned_lattice = lattice.clone();
211
212 // If lattice has associated universes, we need to add them to this CSGBase instance as well.
213 // addUniverseToList is called recursively in case associated universes have not been added to
214 // the universe list yet.
215 std::vector<std::vector<std::reference_wrapper<const CSGUniverse>>> current_univ_map;
216 for (const auto & univ_list : lattice.getUniverses())
217 {
218 std::vector<std::reference_wrapper<const CSGUniverse>> current_univ_list;
219 for (const auto & univ_ref : univ_list)
220 current_univ_list.push_back(addUniverseToList(univ_ref.get()));
221 current_univ_map.push_back(current_univ_list);
222 }
223
224 // Set universes only if lattice has universes defined
225 if (current_univ_map.size() > 0)
226 cloned_lattice->setUniverses(current_univ_map);
227
228 // Update reference to outer universe if it exists
229 if (lattice.getOuterType() == "UNIVERSE")
230 {
231 const auto & outer_univ_ref = addUniverseToList(lattice.getOuterUniverse());
232 cloned_lattice->updateOuter(outer_univ_ref);
233 }
234
235 // Use addLattice to add the cloned lattice
236 return addLattice(std::move(cloned_lattice));
237}
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:398
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 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 96 of file CSGBase.C.

97{
98 if (surfaceToEngUnit(*surf))
99 mooseError("Surface '",
100 surf->getName(),
101 "' is a CSGSurfaceEngUnit and must be added via addEngUnit(), not addSurface().");
102 return _surface_list.addSurface(std::move(surf));
103}
const CSGSurfaceEngUnit * surfaceToEngUnit(const CSGSurface &surf) const
Returns the CSGSurfaceEngUnit pointer if surf is an eng unit, nullptr otherwise.
Definition CSGBase.h:1207

◆ 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 807 of file CSGBase.h.

810 {
811 addTransformation(CSGObjectVariant{std::cref(unit)}, type, values);
812 }
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:653
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 653 of file CSGBase.C.

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

178{
179 // If universe has already been created, we just return a reference to it
180 const auto name = univ.getName();
181 if (_universe_list.hasUniverse(name))
182 return _universe_list.getUniverse(name);
183
184 // Engineering unit universes must be registered via addEngUnit(), not addUniverseToList()
185 if (universeToEngUnit(univ))
186 mooseError("Universe '",
187 name,
188 "' is a CSGUniverseEngUnit and must be added via addEngUnit(), not "
189 "addUniverseToList().");
190
191 // Otherwise we create a new universe based on its associated cells.
192 // addCellToList is called recursively in case associated cells have not
193 // been added to the cell list yet.
194 const auto univ_cells = univ.getAllCells();
195 std::vector<std::reference_wrapper<const CSGCell>> current_univ_cells;
196 for (const auto & univ_cell : univ_cells)
197 current_univ_cells.push_back(addCellToList(univ_cell));
198 return createUniverse(name, current_univ_cells);
199}
const CSGUniverse & createUniverse(const std::string &name)
Create an empty Universe object.
Definition CSGBase.h:303
bool hasUniverse(const std::string &name) const
return whether universe with given name exists in universe list

Referenced by 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 893 of file CSGBase.h.

894 {
895 applyAxisRotation(CSGObjectVariant{std::cref(unit)}, axis, angle);
896 }
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:761

◆ 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 761 of file CSGBase.C.

764{
765 // convert to the Euler angles (phi, theta, psi) based on axis
766 Real phi = 0.0;
767 Real theta = 0.0;
768 Real psi = 0.0;
769
770 switch (axis)
771 {
773 theta = angle;
774 break;
776 phi = 90.0;
777 theta = angle;
778 psi = -90.0;
779 break;
781 phi = angle;
782 break;
783 default:
784 mooseError("Invalid axis type provided for axis rotation.");
785 }
786
787 addTransformation(csg_object, TransformationType::ROTATION, std::make_tuple(phi, theta, psi));
788}
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 866 of file CSGBase.h.

867 {
869 }

◆ 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 849 of file CSGBase.h.

851 {
853 }

◆ 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 921 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 904 of file CSGBase.h.

906 {
908 }

◆ 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 838 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 820 of file CSGBase.h.

822 {
824 }

◆ areCSGObjectsLinked()

bool CSG::CSGBase::areCSGObjectsLinked ( ) const

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

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

Definition at line 1236 of file CSGBase.C.

1237{
1238 std::set<std::string> linked_univs, linked_cells, linked_surfs;
1239 getLinkedCSGObjects(getRootUniverse(), linked_univs, linked_cells, linked_surfs);
1240
1241 for (const CSGUniverse & univ : getAllUniverses())
1242 if (linked_univs.find(univ.getName()) == linked_univs.end())
1243 return false;
1244
1245 for (const CSGCell & cell : getAllCells())
1246 if (linked_cells.find(cell.getName()) == linked_cells.end())
1247 return false;
1248
1249 for (const CSGSurface & surf : getAllSurfaces())
1250 if (linked_surfs.find(surf.getName()) == linked_surfs.end())
1251 return false;
1252
1253 return true;
1254}
std::vector< std::reference_wrapper< const CSGUniverse > > getAllUniverses() const
Get all universe objects.
Definition CSGBase.h:365
std::vector< std::reference_wrapper< const CSGSurface > > getAllSurfaces() const
Get all surface objects.
Definition CSGBase.h:101
void getLinkedCSGObjects(const CSGUniverse &univ, std::set< std::string > &linked_universe_names, std::set< std::string > &linked_cell_names, std::set< std::string > &linked_surface_names) const
Recursive method to retrieve all universes, cells, and surfaces linked to current universe.
Definition CSGBase.C:1257
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 1219 of file CSGBase.h.

1220 {
1221 return dynamic_cast<const CSGCellEngUnit *>(&cell);
1222 }

Referenced by CSGBase().

◆ 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 1108 of file CSGBase.C.

1109{
1110 auto name = cell.getName();
1111 // if no cell by this name exists, an error will be produced by getCell
1112 auto & list_cell = _cell_list.getCell(name);
1113 // return whether the cell in the list is the same object as the one provided
1114 return &cell == &list_cell;
1115}

◆ 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 1138 of file CSGBase.C.

1139{
1140 const auto & name = unit.getName();
1141 // if no engineering unit by this name exists, an error will be produced by getEngUnit
1142 const auto & list_unit = _eng_unit_list.getEngUnit(name);
1143 // compare CSGEngUnit subobject addresses
1144 return &unit == &list_unit;
1145}

◆ 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 1128 of file CSGBase.C.

1129{
1130 auto name = lattice.getName();
1131 // if no lattice by this name exists, an error will be produced by getLattice
1132 auto & list_lattice = _lattice_list.getLattice(name);
1133 // return whether that the lattice in the list is the same as the lattice provided (in memory)
1134 return &lattice == &list_lattice;
1135}

◆ 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 1086 of file CSGBase.C.

1087{
1088 const auto surfs = region.getSurfaces();
1089 for (const CSGSurface & s : surfs)
1090 {
1091 if (!checkSurfaceInBase(s))
1092 mooseError("Region is being set with a surface named " + s.getName() +
1093 " that is different from the surface of the same name in the CSGBase instance.");
1094 }
1095}

◆ 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 1098 of file CSGBase.C.

1099{
1100 auto name = surface.getName();
1101 // if no surface by this name exists, an error will be produced by getSurface
1102 auto & list_surf = _surface_list.getSurface(name);
1103 // return whether the surface in the list is the same object as the one provided
1104 return &surface == &list_surf;
1105}

◆ 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 1118 of file CSGBase.C.

1119{
1120 auto name = universe.getName();
1121 // if no universe by this name exists, an error will be produced by getUniverse
1122 auto & list_univ = _universe_list.getUniverse(name);
1123 // return whether the universe in the list is the same object as the one provided
1124 return &universe == &list_univ;
1125}

Referenced by addLattice().

◆ checkUniverseLinking()

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

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

Definition at line 1206 of file CSGBase.C.

1207{
1208 std::set<std::string> linked_universe_names;
1209 std::set<std::string> linked_cell_names;
1210 std::set<std::string> linked_surf_names;
1211
1212 // Recursively figure out which CSG objects are linked to root universe
1214 getRootUniverse(), linked_universe_names, linked_cell_names, linked_surf_names);
1215
1216 // Iterate through all universes in universe list and check that they exist in universes linked
1217 // to root universe list. Universe list includes CSGUniverseEngUnits.
1218 for (const CSGUniverse & univ : getAllUniverses())
1219 if (linked_universe_names.find(univ.getName()) == linked_universe_names.end())
1220 mooseWarning("Universe with name ", univ.getName(), " is not linked to root universe.");
1221
1222 // Iterate through all cells in cell list and check that they exist in cells linked
1223 // to root universe
1224 for (const CSGCell & cell : getAllCells())
1225 if (linked_cell_names.find(cell.getName()) == linked_cell_names.end())
1226 mooseWarning("Cell with name ", cell.getName(), " is not linked to root universe.");
1227
1228 // Iterate through all surfaces in surface list and check that they exist in surfaces linked
1229 // to root universe
1230 for (const CSGSurface & surf : getAllSurfaces())
1231 if (linked_surf_names.find(surf.getName()) == linked_surf_names.end())
1232 mooseWarning("Surface with name ", surf.getName(), " is not linked to root universe.");
1233}
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

Create a deep copy of this CSGBase instance.

This method calls std::make_unique to create the deep copy. However, the surface references of all cloned cells are updated manually to make sure they point to the surfaces of the cloned object and not the original CSGBase instance.

Definition at line 78 of file CSGBase.C.

79{
80 std::unique_ptr<CSGBase> clone = std::make_unique<CSGBase>(*this);
81
82 // Store list of surface names to surface references in clone to update region definitions
83 std::map<std::string, std::reference_wrapper<const CSGSurface>> identical_surface_refs;
84 auto & surf_list_map = clone->getSurfaceList().getSurfaceListMap();
85 for (const auto & [surf_name, surf_ptr] : surf_list_map)
86 identical_surface_refs.insert({surf_name, clone->getSurfaceByName(surf_name)});
87
88 // Update surface references of cell regions to those of clone
89 for (auto & [cell_name, cell_ptr] : clone->getCellList().getCellListMap())
90 cell_ptr->updateCellRegionSurfaces(identical_surface_refs);
91
92 return clone;
93}

Referenced by clone().

◆ 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 311 of file CSGBase.C.

315{
316 checkRegionSurfaces(region);
317
318 // check that cell is not being added to a universe that exists in the lattice itself
319 if (add_to_univ)
320 for (auto univ_list : fill_lattice.getUniverses())
321 for (const auto & univ_ref : univ_list)
322 {
323 const CSGUniverse & univ_in_lattice = univ_ref.get();
324 if (&univ_in_lattice == add_to_univ)
325 mooseError("Cell " + name +
326 " cannot be filled with a lattice containing the same universe to which it is "
327 "being added.");
328 }
329
330 auto & cell = _cell_list.addLatticeCell(name, fill_lattice, region);
331 if (add_to_univ)
332 addCellToUniverse(*add_to_univ, cell);
333 else
335 return cell;
336}
void checkRegionSurfaces(const CSGRegion &region) const
check that surfaces used in this region are a part of this CSGBase instance
Definition CSGBase.C:1086

◆ 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 278 of file CSGBase.C.

281{
282 checkRegionSurfaces(region);
283 auto & cell = _cell_list.addVoidCell(name, region);
284 if (add_to_univ)
285 addCellToUniverse(*add_to_univ, cell);
286 else
288 return cell;
289}

◆ 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 292 of file CSGBase.C.

296{
297 checkRegionSurfaces(region);
298 if (add_to_univ && (&fill_univ == add_to_univ))
299 mooseError("Cell " + name +
300 " cannot be filled with the same universe to which it is being added.");
301
302 auto & cell = _cell_list.addUniverseCell(name, fill_univ, region);
303 if (add_to_univ)
304 addCellToUniverse(*add_to_univ, cell);
305 else
307 return cell;
308}

◆ 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 263 of file CSGBase.C.

267{
268 checkRegionSurfaces(region);
269 auto & cell = _cell_list.addMaterialCell(name, mat_name, region);
270 if (add_to_univ)
271 addCellToUniverse(*add_to_univ, cell);
272 else
274 return cell;
275}

◆ 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 303 of file CSGBase.h.

304 {
305 return _universe_list.addUniverse(name);
306 }

◆ 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 467 of file CSGBase.C.

469{
470 auto & univ = _universe_list.addUniverse(name);
471 addCellsToUniverse(univ, cells); // performs a check that cells are a part of this base
472 return univ;
473}
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:547

◆ 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 361 of file CSGBase.C.

362{
363 if (!checkCellInBase(cell))
364 mooseError("Cell with name ",
365 cell.getName(),
366 " cannot be deleted as it is different from the cell of the same name in the "
367 "CSGBase instance.");
368
370 if (const auto * eng_unit = cellToEngUnit(cell))
371 _eng_unit_list.removeEngUnit(*eng_unit);
372 _cell_list.getCellListMap().erase(cell.getName());
373}
void prepareCellDeletion(const CSGCell &cell)
warn and remove cell from any universe that contains it
Definition CSGBase.C:339
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 1295 of file CSGBase.C.

1296{
1297 if (!checkEngUnitInBase(unit))
1298 mooseError("Engineering unit with name ",
1299 unit.getName(),
1300 " cannot be deleted as it is different from the engineering unit of the same name "
1301 "in the CSGBase instance.");
1302
1303 // Delegate to the typed delete method which handles EngUnit index cleanup and type list erasure
1304 if (const auto * surf_unit = dynamic_cast<const CSGSurfaceEngUnit *>(&unit))
1305 deleteSurface(cast_ref<const CSGSurface &>(*surf_unit));
1306 else if (const auto * cell_unit = dynamic_cast<const CSGCellEngUnit *>(&unit))
1307 deleteCell(cast_ref<const CSGCell &>(*cell_unit));
1308 else if (const auto * univ_unit = dynamic_cast<const CSGUniverseEngUnit *>(&unit))
1309 deleteUniverse(cast_ref<const CSGUniverse &>(*univ_unit));
1310 else
1311 mooseError(
1312 "Engineering unit '", unit.getName(), "' has an unrecognized type and cannot be deleted.");
1313}
void deleteCell(const CSGCell &cell)
Remove a Cell object passed in by reference from the stored cell list.
Definition CSGBase.C:361
void deleteSurface(const CSGSurface &surface)
Remove a Surface object passed in by reference from the stored surface list.
Definition CSGBase.C:121
void deleteUniverse(const CSGUniverse &univ)
Remove a Universe object passed in by reference from the stored universe list.
Definition CSGBase.C:510

◆ 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 240 of file CSGBase.C.

241{
242 if (!checkLatticeInBase(lattice))
243 mooseError("Lattice with name ",
244 lattice.getName(),
245 " cannot be deleted as it is different from the lattice of the same name in the "
246 "CSGBase instance.");
247
248 // Check if lattice is used as fill in existing cells
249 for (const auto & cell_ref : _cell_list.getAllCells())
250 {
251 const auto & cell = cell_ref.get();
252 if ((cell.getFillType() == "LATTICE") && (cell.getFillLattice() == lattice))
253 mooseError("Cannot delete lattice with name ",
254 lattice.getName(),
255 " as it is used as the fill of cell with name ",
256 cell.getName());
257 }
258
259 _lattice_list.getLatticeListMap().erase(lattice.getName());
260}
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 121 of file CSGBase.C.

122{
123 if (!checkSurfaceInBase(surface))
124 mooseError("Surface with name ",
125 surface.getName(),
126 " cannot be deleted as it is different from the surface of the same name in the "
127 "CSGBase instance.");
128
129 prepareSurfaceDeletion(surface);
130 if (const auto * eng_unit = surfaceToEngUnit(surface))
131 _eng_unit_list.removeEngUnit(*eng_unit);
132 _surface_list.getSurfaceListMap().erase(surface.getName());
133}
void prepareSurfaceDeletion(const CSGSurface &surface) const
error if surface is referenced in any cell region
Definition CSGBase.C:106
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 510 of file CSGBase.C.

511{
512 if (!checkUniverseInBase(univ))
513 mooseError("Universe with name ",
514 univ.getName(),
515 " cannot be deleted as it is different from the universe of the same name in the "
516 "CSGBase instance.");
517
519 if (const auto * eng_unit = universeToEngUnit(univ))
520 _eng_unit_list.removeEngUnit(*eng_unit);
521 _universe_list.getUniverseListMap().erase(univ.getName());
522}
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:476
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 1316 of file CSGBase.C.

1317{
1318 std::set<std::set<std::string>> all_type_sets;
1319 expandAllEngUnitsCycle(all_type_sets);
1320}
void expandAllEngUnitsCycle(std::set< std::set< std::string > > &all_type_sets)
Recursive implementation of expandAllEngUnits().
Definition CSGBase.C:1323

◆ 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 1323 of file CSGBase.C.

1324{
1325 // One call to this function is one pass: collect all current eng units, expand them, then
1326 // recurse if expansion created new units. Units created during a pass are not in this pass's
1327 // snapshot; they are handled in the next pass.
1328 //
1329 // Cycle check: if the same combination of unit types appeared at the start of a prior pass,
1330 // expansion is stuck repeating the same configuration. Tracking the full type-set (not
1331 // individual types) prevents false positives when a type reappears because it was produced
1332 // by a different type's expansion rather than its own.
1333 std::set<std::string> current_types;
1334 for (const auto & u : getAllEngUnits())
1335 current_types.insert(u.get().getUnitType());
1336
1337 if (all_type_sets.count(
1338 current_types)) // this expansion set was already captured which means we are cycling
1339 mooseError("Circular dependency detected in engineering unit expansion");
1340
1341 all_type_sets.insert(current_types);
1342
1343 // Snapshot raw pointers before expanding. Units are destroyed after expansion so iterating live
1344 // references would dangle.
1345 std::vector<const CSGSurfaceEngUnit *> surfs;
1346 std::vector<const CSGCellEngUnit *> cells;
1347 std::vector<const CSGUniverseEngUnit *> univs;
1348 for (const auto & u : getAllSurfaceEngUnits())
1349 surfs.push_back(&u.get());
1350 for (const auto & u : getAllCellEngUnits())
1351 cells.push_back(&u.get());
1352 for (const auto & u : getAllUniverseEngUnits())
1353 univs.push_back(&u.get());
1354
1355 // Expand all units in this pass
1356 for (const auto * s : surfs)
1357 expandEngUnit(*s);
1358 for (const auto * c : cells)
1359 expandEngUnit(*c);
1360 for (const auto * u : univs)
1361 expandEngUnit(*u);
1362
1363 // if engineering units exist after completion of all expansions above, then start the next "pass"
1364 // through this expansion process. This will create a new set of "current_types" to check.
1365 if (!getAllEngUnits().empty())
1366 expandAllEngUnitsCycle(all_type_sets);
1367}
std::vector< std::reference_wrapper< const CSGEngUnit > > getAllEngUnits() const
Get all engineering units of all types in CSGBase.
Definition CSGBase.h:629
CSGRegion expandEngUnit(const CSGSurfaceEngUnit &unit)
Expand a surface-like engineering unit into basic CSGSurface(s) and return the CSGRegion representing...
Definition CSGBase.C:1370
std::vector< std::reference_wrapper< const CSGSurfaceEngUnit > > getAllSurfaceEngUnits() const
Get all surface-like engineering units in CSGBase.
Definition CSGBase.h:639

◆ 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 1418 of file CSGBase.C.

1419{
1420 // unit is const because the eng-unit API exposes only const references; re-fetch a mutable
1421 // reference to the same object from the owning cell list to perform the expansion, which
1422 // mutates and consumes the unit (expandUnit() is non-const).
1423 auto & mutable_unit = cast_ref<CSGCellEngUnit &>(_cell_list.getCell(unit.getName()));
1424
1425 // Derived class populates an internal base object (owned by the unit) with the expanded cell (in
1426 // root) and any supports
1427 mutable_unit.expandUnit();
1428
1429 // Capture a reference to the expanded cell before the join. joinOtherBase transfers ownership
1430 // of the cell's unique_ptr but does not relocate the object, so the reference stays valid.
1431 // getExpandedCell also validates that root has exactly 1 cell.
1432 const CSGCell & expanded_cell = mutable_unit.getExpandedCell();
1433
1434 // Join the unit's base object: 1-param merges root cells into this root
1435 joinOtherBase(mutable_unit.releaseBase(), false);
1436
1437 // Propagate any stored transformations from the EngUnit to the expanded cell
1438 const auto & trans = cast_ref<const CSGCell &>(mutable_unit).getTransformations();
1439 if (!trans.empty())
1440 {
1441 CSGCell & mutable_cell = _cell_list.getCell(expanded_cell.getName());
1442 for (const auto & [trans_type, values] : trans)
1443 mutable_cell.addTransformation(trans_type, values);
1444 }
1445
1446 // The join added the expanded cell to this root via root-merge; remove it so
1447 // replaceCellRefs() can place it in the correct universe(s)
1448 if (getRootUniverse().hasCell(expanded_cell.getName()))
1449 removeCellFromUniverse(getRootUniverse(), expanded_cell);
1450
1451 // Replace all references to the CSGCellEngUnit in universes with the new expanded CSGCell
1452 replaceCellRefs(cast_ref<const CSGCell &>(mutable_unit), expanded_cell);
1453
1454 // Remove the EngUnit (destroyed here, no more references to it after replaceCellRefs)
1455 deleteEngUnit(unit);
1456 return expanded_cell;
1457}
void joinOtherBase(std::unique_ptr< CSGBase > base, const bool ignore_identical_components)
Join another CSGBase object to this one.
Definition CSGBase.C:791
bool hasCell(const std::string &name) const
Check if a cell with given name exists in CSGBase object.
Definition CSGBase.h:223
void removeCellFromUniverse(const CSGUniverse &universe, const CSGCell &cell)
Remove a cell from an existing universe.
Definition CSGBase.C:555
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:1560
void deleteEngUnit(const CSGEngUnit &unit)
Remove an engineering unit passed in by reference from the stored engineering unit list.
Definition CSGBase.C:1295

◆ 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 1370 of file CSGBase.C.

1371{
1372 // unit is const because the eng-unit API exposes only const references; re-fetch a mutable
1373 // reference to the same object from the owning surface list to perform the expansion, which
1374 // mutates and consumes the unit (expandUnit() is non-const).
1375 auto & mutable_unit = cast_ref<CSGSurfaceEngUnit &>(_surface_list.getSurface(unit.getName()));
1376
1377 // Derived class creates the CSGSurface object(s) in the unit's base object and sets
1378 // _expanded_region
1379 mutable_unit.expandUnit();
1380
1381 // check that the base object that was generated has only surfaces and no cells or universes
1382 // (except root).
1383 auto unit_base = mutable_unit.getBase();
1384 if ((unit_base.getAllCells().size() > 0) || (unit_base.getAllUniverses().size() > 1))
1385 mooseError("CSGSurfaceEngineering unit ",
1386 mutable_unit.getName(),
1387 " of type ",
1388 mutable_unit.getUnitType(),
1389 " contains either cells or universes (beyond the root universe) after expansion, "
1390 "but should only contain surfaces.");
1391
1392 // Join the unit's base object into this; transfers surfaces (and any other objects) during merge.
1393 joinOtherBase(mutable_unit.releaseBase(), false);
1394
1395 // Derived class provides the expanded region formed by the expanded surfaces
1396 CSGRegion expanded_region = mutable_unit.getExpandedRegion();
1397
1398 // Propagate any stored transformations from the EngUnit to all new expanded surfaces
1399 const auto & trans = cast_ref<const CSGSurface &>(mutable_unit).getTransformations();
1400 if (!trans.empty())
1401 for (const auto & surf_ref : expanded_region.getSurfaces())
1402 {
1403 CSGSurface & mutable_surf = _surface_list.getSurface(surf_ref.get().getName());
1404 for (const auto & [trans_type, values] : trans)
1405 mutable_surf.addTransformation(trans_type, values);
1406 }
1407
1408 // Replace every CSGSurfaceEngUnit reference in regions of CSGCells with the expanded sub-region
1409 replaceSurfaceRefsWithRegion(cast_ref<const CSGSurface &>(mutable_unit), expanded_region);
1410
1411 // Remove the EngUnit (destroyed here, no more references to it after
1412 // replaceSurfaceRefsWithRegion)
1413 deleteEngUnit(unit);
1414 return expanded_region;
1415}
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:1575

◆ 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 1460 of file CSGBase.C.

1461{
1462 auto unit_name = unit.getName();
1463
1464 // unit is const because the eng-unit API exposes only const references; re-fetch a mutable
1465 // reference to the same object from the owning universe list to perform the expansion, which
1466 // mutates and consumes the unit (expandUnit() is non-const).
1467 auto & mutable_unit = cast_ref<CSGUniverseEngUnit &>(_universe_list.getUniverse(unit_name));
1468
1469 // Derived class populates the unit's base object; the root of this base is the expanded universe
1470 // that will be used to replace this universe unit
1471 mutable_unit.expandUnit();
1472
1473 // Capture the name of the expanded universe (the unit base's root universe) before the join
1474 // getExpandedUniverse will validate that the root contains cells and was properly
1475 // implemented/expanded such that incoming cells and universes are all linked to the root.
1476 auto & pre_join_univ = mutable_unit.getExpandedUniverse();
1477 auto expanded_name = pre_join_univ.getName();
1478
1479 // Check that the expanded name for the new root universe has been updated to something other than
1480 // ROOT_UNIVERSE. If name was not already updated, issue a warning (debug) and update the name
1481 // automatically. This only matters if the current root universe is also named ROOT_UNIVERSE
1482 // so we only need to check if the name matches the root universe name (rather than explicitly
1483 // checking for the name ROOT_UNIVERSE).
1484
1485 // release the incoming base object to be able to rename if necessary
1486 auto unit_base = mutable_unit.releaseBase();
1487 if (expanded_name == getRootUniverse().getName())
1488 {
1489 // root universe must be renamed
1490 auto new_expanded_name = unit_name + "_expanded_root";
1491#ifdef DEBUG
1492 mooseInfoRepeated("Universe engineering unit " + unit_name +
1493 " has an expanded root universe named " + expanded_name +
1494 ", which is identical to the name of the current root universe. The expanded "
1495 "universe will be renamed " +
1496 new_expanded_name + ".");
1497#endif
1498
1499 unit_base->renameRootUniverse(new_expanded_name);
1500 expanded_name = new_expanded_name;
1501 }
1502
1503 // Join the unit's base into this: all objects are transferred and the incoming root is added as
1504 // a named non-root universe (expanded_name). If the root universe's name is not unique (i.e. it
1505 // was left named ROOT_UNIVERSE), this will throw an error.
1506 joinOtherBase(std::move(unit_base), false, expanded_name);
1507
1508 // must get this by name after joining because the join method rebuilds the universe and the
1509 // previous reference from getExpandedUniverse is not valid anymore.
1510 const CSGUniverse & expanded_univ = getUniverseByName(expanded_name);
1511
1512 // Propagate any stored transformations from the EngUnit to the new expanded universe
1513 const auto & trans = cast_ref<const CSGUniverse &>(mutable_unit).getTransformations();
1514 if (!trans.empty())
1515 {
1516 CSGUniverse & mutable_univ = _universe_list.getUniverse(expanded_univ.getName());
1517 for (const auto & [trans_type, values] : trans)
1518 mutable_univ.addTransformation(trans_type, values);
1519 }
1520
1521 // Replace references in cell fills, lattice maps and outers, and the root universe
1522 replaceUniverseRefs(cast_ref<const CSGUniverse &>(mutable_unit), expanded_univ);
1523
1524 // Remove the EngUnit (destroyed here, no more references to it after replaceUniverseRefs)
1525 deleteEngUnit(unit);
1526 return expanded_univ;
1527}
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:376
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:1530

◆ 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 1590 of file CSGBase.C.

1591{
1592 // Check that orphaned universes do not exist in universe list of CSGBase object
1594
1595 nlohmann::json csg_json;
1596
1597 csg_json["surfaces"] = {}; // if empty (all are eng units), this will be deleted later
1598 csg_json["cells"] = {}; // if empty (all are eng units), this will be deleted later
1599 csg_json["universes"] = {}; // root universe always exists, so this does not get deleted later
1600
1601 // get all surfaces information
1602 auto all_surfs = getAllSurfaces();
1603 for (const CSGSurface & s : all_surfs)
1604 {
1605 if (surfaceToEngUnit(s))
1606 continue; // engineering units are written in a separate section
1607 const auto & surf_name = s.getName();
1608 const auto & coeffs = s.getCoeffs();
1609 csg_json["surfaces"][surf_name] = {{"type", s.getSurfaceType()}, {"coefficients", {}}};
1610 for (const auto & c : coeffs)
1611 csg_json["surfaces"][surf_name]["coefficients"][c.first] = c.second;
1612 // include any information about transformations if present
1613 if (s.getTransformations().size() > 0)
1614 csg_json["surfaces"][surf_name]["transformations"] = s.getTransformationsAsStrings();
1615 }
1616
1617 // Drop the surfaces section if nothing was written (e.g. all surfaces were engineering units,
1618 // which are output in the units section instead)
1619 if (csg_json["surfaces"].empty())
1620 csg_json.erase("surfaces");
1621
1622 // Print out cell information
1623 auto all_cells = getAllCells();
1624 for (const CSGCell & c : all_cells)
1625 {
1626 if (cellToEngUnit(c))
1627 continue; // engineering units are written in a separate section
1628 const auto & cell_name = c.getName();
1629 const auto & cell_region_infix = c.getRegion().toInfixJSON();
1630 const auto & cell_region_postfix = c.getRegion().toPostfixStringList();
1631 const auto & cell_filltype = c.getFillType();
1632 const auto & fill_name = c.getFillName();
1633 csg_json["cells"][cell_name]["filltype"] = cell_filltype;
1634 csg_json["cells"][cell_name]["region_infix"] = cell_region_infix;
1635 csg_json["cells"][cell_name]["region_postfix"] = cell_region_postfix;
1636 csg_json["cells"][cell_name]["fill"] = fill_name;
1637 // include any information about transformations if present
1638 if (c.getTransformations().size())
1639 csg_json["cells"][cell_name]["transformations"] = c.getTransformationsAsStrings();
1640 }
1641
1642 // Drop the cells section if nothing was written (e.g. all cells were engineering units,
1643 // which are output in the units section instead)
1644 if (csg_json["cells"].empty())
1645 csg_json.erase("cells");
1646
1647 // Print out universe information
1648 auto all_univs = getAllUniverses();
1649 for (const CSGUniverse & u : all_univs)
1650 {
1651 if (universeToEngUnit(u))
1652 continue; // engineering units are written in a separate section
1653 const auto & univ_name = u.getName();
1654 const auto & univ_cells = u.getAllCells();
1655 csg_json["universes"][univ_name]["cells"] = {};
1656 for (const CSGCell & c : univ_cells)
1657 csg_json["universes"][univ_name]["cells"].push_back(c.getName());
1658 if (u.isRoot())
1659 csg_json["universes"][univ_name]["root"] = u.isRoot();
1660 // include any information about transformations if present
1661 if (u.getTransformations().size())
1662 csg_json["universes"][univ_name]["transformations"] = u.getTransformationsAsStrings();
1663 }
1664
1665 // print out lattice information if lattices exist
1666 auto all_lats = getAllLattices();
1667 if (all_lats.size())
1668 {
1669 csg_json["lattices"] = {};
1670 for (const CSGLattice & lat : all_lats)
1671 {
1672 const auto & lat_name = lat.getName();
1673 csg_json["lattices"][lat_name] = {};
1674 csg_json["lattices"][lat_name]["type"] = lat.getType();
1675 const auto & outer_type = lat.getOuterType();
1676 csg_json["lattices"][lat_name]["outertype"] = outer_type;
1677 if (outer_type == "UNIVERSE")
1678 csg_json["lattices"][lat_name]["outer"] = lat.getOuterUniverse().getName();
1679 else if (outer_type == "CSG_MATERIAL")
1680 csg_json["lattices"][lat_name]["outer"] = lat.getOuterMaterial();
1681 // write out any additional attributes
1682 csg_json["lattices"][lat_name]["attributes"] = {};
1683 const auto & lat_attrs = lat.getAttributes();
1684 for (const auto & attr : lat_attrs)
1685 csg_json["lattices"][lat_name]["attributes"][attr.first] = attr.second;
1686 // write the map of universe names: list of lists
1687 csg_json["lattices"][lat_name]["universes"] = lat.getUniverseNameMap();
1688 // include any information about transformations if present
1689 if (lat.getTransformations().size())
1690 csg_json["lattices"][lat_name]["transformations"] = lat.getTransformationsAsStrings();
1691 }
1692 }
1693
1694 // include engineering units if they exist
1695 auto all_units = getAllEngUnits();
1696 if (all_units.size())
1697 {
1698 csg_json["units"] = {};
1699 for (const CSGEngUnit & unit : all_units)
1700 {
1701 const auto & unit_name = unit.getName();
1702 csg_json["units"][unit_name] = {};
1703 // behavior and type
1704 csg_json["units"][unit_name]["unit_type"] = unit.getUnitType();
1705 csg_json["units"][unit_name]["behavior"] = unit.getBehavior();
1706 // any unit-specific attributes
1707 csg_json["units"][unit_name]["attributes"] = {};
1708 const auto & unit_attrs = unit.getAttributes();
1709 for (const auto & attr : unit_attrs)
1710 csg_json["units"][unit_name]["attributes"][attr.first] = attr.second;
1711 if (unit.getTransformations().size())
1712 csg_json["units"][unit_name]["transformations"] = unit.getTransformationsAsStrings();
1713 }
1714 }
1715
1716 return csg_json;
1717}
std::vector< std::reference_wrapper< const CSGLattice > > getAllLattices() const
Get all lattice objects.
Definition CSGBase.h:491
void checkUniverseLinking() const
Check universes linked to root universe match universes defined in _universe_list.
Definition CSGBase.C:1206

◆ 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 649 of file CSGBase.h.

650 {
652 }
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 204 of file CSGBase.h.

205 {
206 return _cell_list.getAllCells();
207 }
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 629 of file CSGBase.h.

630 {
632 }
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 491 of file CSGBase.h.

492 {
494 }
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 639 of file CSGBase.h.

640 {
642 }
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 101 of file CSGBase.h.

102 {
104 }
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 659 of file CSGBase.h.

660 {
662 }
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 365 of file CSGBase.h.

366 {
368 }
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 215 of file CSGBase.h.

215{ 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 993 of file CSGBase.h.

993{ 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 986 of file CSGBase.h.

986{ 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 597 of file CSGBase.h.

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

◆ getEngUnitList()

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

Get a const reference to the CSGEngUnitList object.

Returns
CSGEngUnitList

Definition at line 1086 of file CSGBase.h.

1086{ 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 509 of file CSGBase.h.

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

◆ getLatticeList() [1/2]

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

Get the CSGLatticeList object.

Returns
CSGLatticeList

Definition at line 1021 of file CSGBase.h.

1021{ 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 1014 of file CSGBase.h.

1014{ return _lattice_list; }

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

◆ getLinkedCSGObjects()

void CSG::CSGBase::getLinkedCSGObjects ( const CSGUniverse univ,
std::set< std::string > &  linked_universe_names,
std::set< std::string > &  linked_cell_names,
std::set< std::string > &  linked_surface_names 
) const
private

Recursive method to retrieve all universes, cells, and surfaces 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
linked_surface_namesList of surface names linked to current universe

Definition at line 1257 of file CSGBase.C.

1261{
1262 linked_universe_names.insert(univ.getName());
1263 const auto & univ_cells = univ.getAllCells();
1264 for (const CSGCell & cell : univ_cells)
1265 {
1266 linked_cell_names.insert(cell.getName());
1267 for (const CSGSurface & cell_surf : cell.getRegion().getSurfaces())
1268 linked_surface_names.insert(cell_surf.getName());
1269
1270 if (cell.getFillType() == "UNIVERSE")
1272 cell.getFillUniverse(), linked_universe_names, linked_cell_names, linked_surface_names);
1273 else if (cell.getFillType() == "LATTICE")
1274 {
1275 const auto & lattice = cell.getFillLattice();
1276 for (const auto & univ_list : lattice.getUniverses())
1277 for (const auto & univ_ref : univ_list)
1278 {
1279 const CSGUniverse & lattice_univ = univ_ref.get();
1281 lattice_univ, linked_universe_names, linked_cell_names, linked_surface_names);
1282 }
1283
1284 if (lattice.getOuterType() == "UNIVERSE")
1285 {
1286 const CSGUniverse & outer_univ = lattice.getOuterUniverse();
1288 outer_univ, linked_universe_names, linked_cell_names, linked_surface_names);
1289 }
1290 }
1291 }
1292}

◆ getRootUniverse()

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

Get the Root Universe object.

Returns
reference to root CSGUniverse

Definition at line 277 of file CSGBase.h.

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

Referenced by addEngUnit(), and CSGBase().

◆ 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 936 of file CSGBase.h.

936{ 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 112 of file CSGBase.h.

113 {
114 return _surface_list.getSurface(name);
115 }

◆ getSurfaceList() [1/2]

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

Get a non-const reference to the CSGSurfaceList object.

Returns
CSGSurfaceList

Definition at line 979 of file CSGBase.h.

979{ 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 972 of file CSGBase.h.

972{ 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 376 of file CSGBase.h.

377 {
378 return _universe_list.getUniverse(name);
379 }

◆ getUniverseList() [1/2]

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

Get a non-const reference to the CSGUniverseList object.

Returns
CSGUniverseList

Definition at line 1007 of file CSGBase.h.

1007{ 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 1000 of file CSGBase.h.

1000{ 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 223 of file CSGBase.h.

223{ 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 614 of file CSGBase.h.

614{ 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 525 of file CSGBase.h.

525{ 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 123 of file CSGBase.h.

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

◆ 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 387 of file CSGBase.h.

387{ 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 981 of file CSGBase.C.

982{
983 auto & cell_list_map = cell_list.getCellListMap();
984 for (auto & c : cell_list_map)
985 _cell_list.addCell(std::move(c.second), ignore_identical_cells);
986}

◆ 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 989 of file CSGBase.C.

990{
991 auto & lat_list_map = lattice_list.getLatticeListMap();
992 for (auto & lat : lat_list_map)
993 _lattice_list.addLattice(std::move(lat.second), ignore_identical_lattices);
994}

◆ 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 791 of file CSGBase.C.

792{
793 // If we are ignoring identical incoming CSG components, we need to update any references
794 // stored by these components to point to the references of the pre-existing CSGBase object
795 if (ignore_identical_components)
797 joinSurfaceList(base->getSurfaceList(), ignore_identical_components);
798 joinCellList(base->getCellList(), ignore_identical_components);
799 joinLatticeList(base->getLatticeList(), ignore_identical_components);
800 joinUniverseList(base->getUniverseList(), ignore_identical_components);
801 rebuildEngUnitList(); // finds all engineering units again, allowing us to keep any ignored
802 // surfaces that were removed from the surface list out of this list
803}
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:1015
void updateIncomingCSGReferences(CSGBase &incoming_base)
update references of incoming CSGbase to point to those of existing CSGBase object.
Definition CSGBase.C:842
void joinCellList(CSGCellList &cell_list, const bool ignore_identical_cells)
join a separate CSGCellList object to this one
Definition CSGBase.C:981
void joinLatticeList(CSGLatticeList &lattice_list, const bool ignore_identical_lattices)
join a separate CSGLatticeList object to this one
Definition CSGBase.C:989
void joinSurfaceList(CSGSurfaceList &surf_list, const bool ignore_identical_surfaces)
join a separate CSGSurfaceList object to this one
Definition CSGBase.C:973

◆ 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 823 of file CSGBase.C.

827{
828 // If we are ignoring identical incoming CSG components, we need to update any references
829 // stored by these components to point to the references of the pre-existing CSGBase object
830 if (ignore_identical_components)
832 joinSurfaceList(base->getSurfaceList(), ignore_identical_components);
833 joinCellList(base->getCellList(), ignore_identical_components);
834 joinLatticeList(base->getLatticeList(), ignore_identical_components);
836 base->getUniverseList(), ignore_identical_components, new_root_name_base, new_root_name_join);
837 rebuildEngUnitList(); // finds all engineering units again, allowing us to keep any ignored
838 // surfaces that were removed from the surface list out of this list
839}

◆ 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 806 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);
817 joinUniverseList(base->getUniverseList(), ignore_identical_components, new_root_name_join);
818 rebuildEngUnitList(); // finds all engineering units again, allowing us to keep any ignored
819 // surfaces that were removed from the surface list out of this list
820}

◆ 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 973 of file CSGBase.C.

974{
975 auto & surf_list_map = surf_list.getSurfaceListMap();
976 for (auto & s : surf_list_map)
977 _surface_list.addSurface(std::move(s.second), ignore_identical_surfaces);
978}
const CSGSurface & addSurface(std::unique_ptr< CSGSurface > surf)
add a unique surface pointer to this base instance
Definition CSGBase.C:96

◆ 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 1015 of file CSGBase.C.

1016{
1017 // case 1: incoming root is joined into existing root; no new universes are created
1018 auto & univ_list_map = univ_list.getUniverseListMap();
1019 auto & root = getRootUniverse(); // this root universe
1020 for (auto & u : univ_list_map)
1021 {
1022 if (u.second->isRoot())
1023 {
1024 // add existing cells to current root instead of creating new universe
1025 auto all_cells = u.second->getAllCells();
1026 for (auto & cell : all_cells)
1027 addCellToUniverse(root, cell);
1028 }
1029 else // unique non-root universe to add to list
1030 _universe_list.addUniverse(std::move(u.second), ignore_identical_universes);
1031 }
1032}

◆ 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 1057 of file CSGBase.C.

1061{
1062 // case 3: each root universe becomes a new universe and a new root is created
1063
1064 // make a new universe from the existing root universe
1065 auto & root = getRootUniverse();
1066 auto root_cells = root.getAllCells();
1067 createUniverse(new_root_name_base, root_cells);
1068 removeCellsFromUniverse(root, root_cells);
1069
1070 // add incoming universes to current Base
1071 auto & all_univs = univ_list.getUniverseListMap();
1072 for (auto & u : all_univs)
1073 {
1074 if (u.second->isRoot())
1075 {
1076 // create new universe from incoming root universe
1077 auto all_cells = u.second->getAllCells();
1078 createUniverse(new_root_name_incoming, all_cells);
1079 }
1080 else // unique non-root universe to add to list
1081 _universe_list.addUniverse(std::move(u.second), ignore_identical_universes);
1082 }
1083}
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:574

◆ 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 1035 of file CSGBase.C.

1038{
1039 // case 2: incoming root is turned into new universe and existing root remains root
1040
1041 // add incoming universes to current Base
1042 auto & all_univs = univ_list.getUniverseListMap();
1043 for (auto & u : all_univs)
1044 {
1045 if (u.second->isRoot())
1046 {
1047 // create new universe from incoming root universe
1048 auto all_cells = u.second->getAllCells();
1049 createUniverse(new_root_name_incoming, all_cells);
1050 }
1051 else // unique non-root universe to add to list
1052 _universe_list.addUniverse(std::move(u.second), ignore_identical_universes);
1053 }
1054}

◆ operator!=()

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

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

Definition at line 1738 of file CSGBase.C.

1739{
1740 return !(*this == other);
1741}

◆ operator==()

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

Operator overload for checking if two CSGBase objects are equal.

Definition at line 1720 of file CSGBase.C.

1721{
1722 const auto & surf_list = this->getSurfaceList();
1723 const auto & other_surf_list = other.getSurfaceList();
1724 const auto & cell_list = this->getCellList();
1725 const auto & other_cell_list = other.getCellList();
1726 const auto & univ_list = this->getUniverseList();
1727 const auto & other_univ_list = other.getUniverseList();
1728 const auto & lat_list = this->getLatticeList();
1729 const auto & other_lat_list = other.getLatticeList();
1730 const auto & eng_unit_list = this->getEngUnitList();
1731 const auto & other_eng_unit_list = other.getEngUnitList();
1732 return (surf_list == other_surf_list) && (cell_list == other_cell_list) &&
1733 (univ_list == other_univ_list) && (lat_list == other_lat_list) &&
1734 (eng_unit_list == other_eng_unit_list);
1735}
const CSGSurfaceList & getSurfaceList() const
Get a const reference to the CSGSurfaceList object.
Definition CSGBase.h:972
const CSGEngUnitList & getEngUnitList() const
Get a const reference to the CSGEngUnitList object.
Definition CSGBase.h:1086

◆ prepareCellDeletion()

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

warn and remove cell from any universe that contains it

Definition at line 339 of file CSGBase.C.

340{
341 for (const auto & univ_ref : _universe_list.getAllUniverses())
342 {
343 const auto & univ = univ_ref.get();
344 for (const auto & univ_cell : univ.getAllCells())
345 if (cell == univ_cell.get())
346 {
347 // must remove from root intentionally too, but don't warn in this case (too noisy for
348 // expected behavior)
349 if (univ != getRootUniverse())
350 mooseWarning("Removing cell ",
351 cell.getName(),
352 " from universe with name ",
353 univ.getName(),
354 " before cell deletion.");
355 _universe_list.getUniverse(univ.getName()).removeCell(cell.getName());
356 }
357 }
358}
void removeCell(const std::string &name)
remove a cell of the specified name from the universe
Definition CSGUniverse.C:60

◆ prepareSurfaceDeletion()

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

error if surface is referenced in any cell region

Definition at line 106 of file CSGBase.C.

107{
108 for (const auto & cell_ref : _cell_list.getAllCells())
109 {
110 const auto & cell = cell_ref.get();
111 for (const auto & region_surf : cell.getRegion().getSurfaces())
112 if (region_surf.get() == surface)
113 mooseError("Cannot delete surface with name ",
114 surface.getName(),
115 " as it is used in region definition of cell with name ",
116 cell.getName());
117 }
118}

◆ 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 476 of file CSGBase.C.

477{
478 if (univ == getRootUniverse())
479 mooseError("Cannot delete root universe from CSGBase instance");
480
481 // Check if universe is used in any existing lattices
482 for (const auto & lat : _lattice_list.getAllLattices())
483 {
484 for (const auto & lat_univ : lat.get().getUniqueUniverses())
485 if (univ == lat_univ.get())
486 mooseError("Cannot delete universe with name ",
487 univ.getName(),
488 " as it is used in lattice with name ",
489 lat.get().getName());
490 if ((lat.get().getOuterType() == "UNIVERSE") && (lat.get().getOuterUniverse() == univ))
491 mooseError("Cannot delete universe with name ",
492 univ.getName(),
493 " as it is used as the outer universe of lattice with name ",
494 lat.get().getName());
495 }
496
497 // Check if universe is used as fill in existing cells
498 for (const auto & cell_ref : _cell_list.getAllCells())
499 {
500 const auto & cell = cell_ref.get();
501 if ((cell.getFillType() == "UNIVERSE") && (cell.getFillUniverse() == univ))
502 mooseError("Cannot delete universe with name ",
503 univ.getName(),
504 " as it is used as the fill of cell with name ",
505 cell.getName());
506 }
507}

◆ 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 997 of file CSGBase.C.

998{
999 _eng_unit_list = CSGEngUnitList(); // reset to empty
1000
1001 // iterate through all existing lists to find all CSGEngUnit types and store the pointers to the
1002 // rebuilt engineering unit list
1003 for (auto & [name, surf] : _surface_list.getSurfaceListMap())
1004 if (auto * eu = dynamic_cast<CSGSurfaceEngUnit *>(surf.get()))
1006 for (auto & [name, cell] : _cell_list.getCellListMap())
1007 if (auto * eu = dynamic_cast<CSGCellEngUnit *>(cell.get()))
1009 for (auto & [name, univ] : _universe_list.getUniverseListMap())
1010 if (auto * eu = dynamic_cast<CSGUniverseEngUnit *>(univ.get()))
1012}

Referenced by CSGBase().

◆ 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 555 of file CSGBase.C.

556{
557 // make sure cell is a part of this CSGBase instance
558 if (!checkCellInBase(cell))
559 mooseError("A cell named " + cell.getName() + " is being removed from universe " +
560 universe.getName() +
561 " that is different from the cell of the same name in the CSGBase instance.");
562 // make sure universe is a part of this CSGBase instance
563 if (!checkUniverseInBase(universe))
564 mooseError("Cells are being removed from a universe named " + universe.getName() +
565 " that is different " +
566 "from the universe of the same name in the CSGBase instance.");
567 auto & univ = _universe_list.getUniverse(universe.getName());
568 // removeCell will produce error that cell is not found in the case that the universe is actually
569 // an engineering unit, so we don't need to check that.
570 univ.removeCell(cell.getName());
571}

◆ 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 574 of file CSGBase.C.

576{
577 for (auto & c : cells)
578 removeCellFromUniverse(universe, c);
579}

◆ 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 1179 of file CSGBase.C.

1180{
1181 // if cell is actually an engineering unit, we have to also check that no other units have the
1182 // same name already
1183 if (cellToEngUnit(cell))
1184 if (_eng_unit_list.hasEngUnit(name))
1185 mooseError("Cannot rename cell " + cell.getName() + " to " + name + ". " + cell.getName() +
1186 " is an engineering unit and a unit with name " + name + " already exists.");
1187
1188 _cell_list.renameCell(cell, name);
1189}
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 1148 of file CSGBase.C.

1149{
1150 // Rename in the owning type list (updates the object's name and the type list map key).
1151 // The EngUnit index stores raw pointers; because the object's name is updated in-place,
1152 // no index update is needed.
1153 if (const auto * surf = dynamic_cast<const CSGSurfaceEngUnit *>(&unit))
1154 renameSurface(*surf, name);
1155 else if (const auto * cell = dynamic_cast<const CSGCellEngUnit *>(&unit))
1156 renameCell(*cell, name);
1157 else if (const auto * univ = dynamic_cast<const CSGUniverseEngUnit *>(&unit))
1158 renameUniverse(*univ, name);
1159 else
1160 mooseError(
1161 "Engineering unit '", unit.getName(), "' has an unrecognized type and cannot be renamed.");
1162}
void renameSurface(const CSGSurface &surface, const std::string &name)
rename the specified surface
Definition CSGBase.C:1165
void renameUniverse(const CSGUniverse &universe, const std::string &name)
rename the specified universe
Definition CSGBase.C:1192
void renameCell(const CSGCell &cell, const std::string &name)
rename the specified cell
Definition CSGBase.C:1179

◆ 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 456 of file CSGBase.h.

457 {
458 _lattice_list.renameLattice(lattice, name);
459 }
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 284 of file CSGBase.h.

285 {
287 }

◆ 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 1165 of file CSGBase.C.

1166{
1167 // if surface is actually an engineering unit, we have to also check that no other units have the
1168 // same name already
1169 if (surfaceToEngUnit(surface))
1170 if (_eng_unit_list.hasEngUnit(name))
1171 mooseError("Cannot rename surface " + surface.getName() + " to " + name + ". " +
1172 surface.getName() + " is an engineering unit and a unit with name " + name +
1173 " already exists.");
1174
1175 _surface_list.renameSurface(surface, name);
1176}
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 1192 of file CSGBase.C.

1193{
1194 // if universe is actually an engineering unit, we have to also check that no other units have the
1195 // same name already
1196 if (universeToEngUnit(universe))
1197 if (_eng_unit_list.hasEngUnit(name))
1198 mooseError("Cannot rename universe " + universe.getName() + " to " + name + ". " +
1199 universe.getName() + " is an engineering unit and a unit with name " + name +
1200 " already exists.");
1201
1202 _universe_list.renameUniverse(universe, name);
1203}
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 1560 of file CSGBase.C.

1561{
1562 for (const auto & univ_ref : getAllUniverses())
1563 {
1564 const CSGUniverse & univ = univ_ref.get();
1565 for (const auto & cell_ref : univ.getAllCells())
1566 if (&cell_ref.get() == &old_cell)
1567 {
1568 removeCellFromUniverse(univ, old_cell);
1569 addCellToUniverse(univ, new_cell);
1570 }
1571 }
1572}

◆ 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 902 of file CSGBase.C.

905{
906 // Update cell references of universes to those of this base
907 for (auto & [univ_name, univ_ptr] : base.getUniverseList().getUniverseListMap())
908 for (auto & [cell_name, cell_ref] : identical_cell_refs)
909 if (univ_ptr->hasCell(cell_name))
910 {
911 univ_ptr->removeCell(cell_name);
912 univ_ptr->addCell(cell_ref);
913 }
914}

◆ 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 954 of file CSGBase.C.

957{
958 // Update lattice references of cells to those of this base
959 for (auto & [cell_name, cell_ptr] : base.getCellList().getCellListMap())
960 {
961 const auto fill_type = cell_ptr->getFillType();
962 const auto fill_name = cell_ptr->getFillName();
963 if ((fill_type == "LATTICE") &&
964 (identical_lattice_refs.find(fill_name) != identical_lattice_refs.end()))
965 {
966 const CSGLattice * lat_ptr = &identical_lattice_refs.at(fill_name).get();
967 cell_ptr->updateCellFill(lat_ptr);
968 }
969 }
970}

◆ 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 892 of file CSGBase.C.

895{
896 // Update surface references of cell regions to those of this base
897 for (auto & [cell_name, cell_ptr] : base.getCellList().getCellListMap())
898 cell_ptr->updateCellRegionSurfaces(identical_surface_refs);
899}

◆ 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 1575 of file CSGBase.C.

1576{
1577 for (const auto & cell_ref : getAllCells())
1578 {
1579 const CSGCell & cell = cell_ref.get();
1580 CSGRegion new_region = cell.getRegion();
1581 if (new_region.getRegionType() == CSGRegion::RegionType::EMPTY)
1582 continue; // cell units do not have a region so skip (can also skip if a regular cell has an
1583 // empty region)
1584 new_region.replaceWithSubRegion(old_surf, sub_region);
1585 updateCellRegion(cell, new_region);
1586 }
1587}
void updateCellRegion(const CSGCell &cell, const CSGRegion &region)
change the region of the specified cell
Definition CSGBase.C:376

◆ 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 1530 of file CSGBase.C.

1531{
1532 // 1. Cell fills
1533 for (const auto & cell_ref : getAllCells())
1534 {
1535 const CSGCell & cell = cell_ref.get();
1536 if (cell.getFillType() == "UNIVERSE" && cell.getFillUniverse() == old_univ)
1537 updateCellFill(cell, &new_univ);
1538 }
1539
1540 // 2. Lattice universe maps and outer fills
1541 for (const auto & lat_ref : getAllLattices())
1542 {
1543 const CSGLattice & lat = lat_ref.get();
1544 if (lat.getOuterType() == "UNIVERSE" && lat.getOuterUniverse() == old_univ)
1545 setLatticeOuter(lat, new_univ);
1546
1547 auto lat_map = lat.getUniverses();
1548 for (std::size_t row = 0; row < lat_map.size(); ++row)
1549 for (std::size_t col = 0; col < lat_map[row].size(); ++col)
1550 if (lat_map[row][col].get() == old_univ)
1551 setUniverseAtLatticeIndex(lat, new_univ, {static_cast<int>(row), static_cast<int>(col)});
1552 }
1553
1554 // 3. Root universe pointer in universe list
1555 if (getRootUniverse() == old_univ)
1556 _universe_list._root_universe = &new_univ;
1557}
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:618
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:582
void updateCellFill(const CSGCell &cell, const std::string &mat_name)
change the fill of the specified cell to a material fill
Definition CSGBase.C:409
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 917 of file CSGBase.C.

920{
921 // Update universe references of cells to those of this base
922 for (auto & [cell_name, cell_ptr] : base.getCellList().getCellListMap())
923 {
924 const auto fill_type = cell_ptr->getFillType();
925 const auto fill_name = cell_ptr->getFillName();
926 if ((fill_type == "UNIVERSE") &&
927 (identical_universe_refs.find(fill_name) != identical_universe_refs.end()))
928 {
929 const CSGUniverse * univ_ptr = &identical_universe_refs.at(fill_name).get();
930 cell_ptr->updateCellFill(univ_ptr);
931 }
932 }
933
934 // Update universe references of lattices to those of this base
935 for (auto & [lat_name, lat_ptr] : base.getLatticeList().getLatticeListMap())
936 for (auto & [univ_name, univ_ref] : identical_universe_refs)
937 {
938 // Check if universe belongs to lattice
939 if (lat_ptr->hasUniverse(univ_name))
940 {
941 // If so, replace all instances of this universe in the lattice
942 const auto univ_indices = lat_ptr->getUniverseIndices(univ_name);
943 for (const auto & index : univ_indices)
944 lat_ptr->setUniverseAtIndex(univ_ref, index);
945 }
946 // Check if universe belongs to lattice outer
947 if ((lat_ptr->getOuterType() == "UNIVERSE") &&
948 (lat_ptr->getOuterUniverse().getName() == univ_name))
949 lat_ptr->updateOuter(univ_ref);
950 }
951}

◆ 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 393 of file CSGBase.C.

394{
395 // cannot update region for a cell that is actually an engineering unit
396 if (cellToEngUnit(cell))
397 mooseError("Fill cannot be reset for cell '" + cell.getName() +
398 "' because it is a CSGCellEngUnit.");
399
400 if (!checkCellInBase(cell))
401 mooseError("The fill of cell with name " + cell.getName() +
402 " that is being updated is different " +
403 "from the cell of the same name in the CSGBase instance.");
404 auto & list_cell = _cell_list.getCell(cell.getName());
405 list_cell.resetCellFill();
406}
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 607 of file CSGBase.C.

608{
609 auto name = lattice.getName();
610 if (!checkLatticeInBase(lattice))
611 mooseError("Cannot reset outer for lattice " + name +
612 ". Lattice is different from the lattice of the same name in the "
613 "CSGBase instance.");
615}
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 593 of file CSGBase.C.

594{
595 auto name = lattice.getName();
596 if (!checkLatticeInBase(lattice))
597 mooseError("Cannot set outer universe for lattice " + name +
598 ". Lattice is different from the lattice of the same name in the "
599 "CSGBase instance.");
600 if (!checkUniverseInBase(outer_univ))
601 mooseError("Cannot set outer universe for lattice " + name + ". Outer universe " +
602 outer_univ.getName() + " is not in the CSGBase instance.");
603 _lattice_list.getLattice(name).updateOuter(outer_univ);
604}
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 582 of file CSGBase.C.

583{
584 auto name = lattice.getName();
585 if (!checkLatticeInBase(lattice))
586 mooseError("Cannot set outer for lattice " + name +
587 ". Lattice is different from the lattice of the same name in the "
588 "CSGBase instance.");
589 _lattice_list.getLattice(name).updateOuter(outer_name);
590}

◆ 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 634 of file CSGBase.C.

637{
638 auto name = lattice.getName();
639 if (!checkLatticeInBase(lattice))
640 mooseError("Cannot set universes for lattice " + name +
641 ". Lattice is different from the lattice of the same name in the "
642 "CSGBase instance.");
643 // make sure all universes are a part of this base instance
644 for (auto univ_list : universes)
645 for (const CSGUniverse & univ : univ_list)
646 if (!checkUniverseInBase(univ))
647 mooseError("Cannot set universes for lattice " + name + ". Universe " + univ.getName() +
648 " is not in the CSGBase instance.");
649 _lattice_list.getLattice(name).setUniverses(universes);
650}
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 618 of file CSGBase.C.

621{
622 auto name = lattice.getName();
623 if (!checkLatticeInBase(lattice))
624 mooseError("Cannot set universe at index for lattice " + name +
625 ". Lattice is different from the lattice of the same name in the "
626 "CSGBase instance.");
627 if (!checkUniverseInBase(universe))
628 mooseError("Cannot add universe " + universe.getName() + " to lattice " + lattice.getName() +
629 ". Universe is not in the CSGBase instance.");
630 _lattice_list.getLattice(name).setUniverseAtIndex(universe, index);
631}
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 1207 of file CSGBase.h.

1208 {
1209 return dynamic_cast<const CSGSurfaceEngUnit *>(&surf);
1210 }

◆ 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 1231 of file CSGBase.h.

1232 {
1233 return dynamic_cast<const CSGUniverseEngUnit *>(&univ);
1234 }

Referenced by CSGBase().

◆ 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 446 of file CSGBase.C.

447{
448 // cannot update region for a cell that is actually an engineering unit
449 if (cellToEngUnit(cell))
450 mooseError("Fill cannot be updated for cell '" + cell.getName() +
451 "' because it is a CSGCellEngUnit.");
452
453 if (!checkLatticeInBase(*lattice))
454 mooseError("Lattice with name ",
455 lattice->getName(),
456 " is being used as a cell fill that is different from the lattice of the same name "
457 "in the CSGBase instance.");
458 if (!checkCellInBase(cell))
459 mooseError("The fill of cell with name " + cell.getName() +
460 " that is being updated is different " +
461 "from the cell of the same name in the CSGBase instance.");
462 auto & list_cell = _cell_list.getCell(cell.getName());
463 list_cell.updateCellFill(lattice);
464}
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 425 of file CSGBase.C.

426{
427 // cannot update region for a cell that is actually an engineering unit
428 if (cellToEngUnit(cell))
429 mooseError("Fill cannot be updated for cell '" + cell.getName() +
430 "' because it is a CSGCellEngUnit.");
431
432 if (!checkUniverseInBase(*univ))
433 mooseError("Universe with name ",
434 univ->getName(),
435 " is being used as a cell fill that is different from the universe of the same name "
436 "in the CSGBase instance.");
437 if (!checkCellInBase(cell))
438 mooseError("The fill of cell with name " + cell.getName() +
439 " that is being updated is different " +
440 "from the cell of the same name in the CSGBase instance.");
441 auto & list_cell = _cell_list.getCell(cell.getName());
442 list_cell.updateCellFill(univ);
443}

◆ 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 409 of file CSGBase.C.

410{
411 // cannot update region for a cell that is actually an engineering unit
412 if (cellToEngUnit(cell))
413 mooseError("Fill cannot be updated for cell '" + cell.getName() +
414 "' because it is a CSGCellEngUnit.");
415
416 if (!checkCellInBase(cell))
417 mooseError("The region of cell with name " + cell.getName() +
418 " that is being updated is different " +
419 "from the cell of the same name in the CSGBase instance.");
420 auto & list_cell = _cell_list.getCell(cell.getName());
421 list_cell.updateCellFill(mat_name);
422}

◆ 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 376 of file CSGBase.C.

377{
378 // cannot update region for a cell that is actually an engineering unit
379 if (cellToEngUnit(cell))
380 mooseError("Region cannot be updated for cell '" + cell.getName() +
381 "' because it is a CSGCellEngUnit.");
382
383 checkRegionSurfaces(region);
384 if (!checkCellInBase(cell))
385 mooseError("The region of cell with name " + cell.getName() +
386 " that is being updated is different " +
387 "from the cell of the same name in the CSGBase instance.");
388 auto & list_cell = _cell_list.getCell(cell.getName());
389 list_cell.updateRegion(region);
390}
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 842 of file CSGBase.C.

843{
844 // Iterate through all incoming surfaces and track which ones have names already
845 // defined within this CSGSurfaceList object
846 std::map<std::string, std::reference_wrapper<const CSGSurface>> identical_surface_refs;
847 auto & surf_list_map = incoming_base.getSurfaceList().getSurfaceListMap();
848 for (const auto & [surf_name, surf_ptr] : surf_list_map)
849 if (hasSurface(surf_name))
850 identical_surface_refs.insert({surf_name, getSurfaceByName(surf_name)});
851
852 // Iterate through all incoming cells and track which ones have names already
853 // defined within this CSGCellList object
854 std::map<std::string, std::reference_wrapper<const CSGCell>> identical_cell_refs;
855 auto & cell_list_map = incoming_base.getCellList().getCellListMap();
856 for (const auto & [cell_name, cell_ptr] : cell_list_map)
857 if (hasCell(cell_name))
858 identical_cell_refs.insert({cell_name, getCellByName(cell_name)});
859
860 // Iterate through all incoming universes and track which ones have names already
861 // defined within this CSGUniverseList object
862 std::map<std::string, std::reference_wrapper<const CSGUniverse>> identical_universe_refs;
863 auto & universe_list_map = incoming_base.getUniverseList().getUniverseListMap();
864 for (const auto & [univ_name, univ_ptr] : universe_list_map)
865 if (hasUniverse(univ_name))
866 identical_universe_refs.insert({univ_name, getUniverseByName(univ_name)});
867
868 // Iterate through all incoming lattices and track which ones have names already
869 // defined within this CSGLatticeList object
870 std::map<std::string, std::reference_wrapper<const CSGLattice>> identical_lattice_refs;
871 auto & lattice_list_map = incoming_base.getLatticeList().getLatticeListMap();
872 for (const auto & [lat_name, lat_ptr] : lattice_list_map)
873 if (hasLattice(lat_name))
874 identical_lattice_refs.insert({lat_name, getLatticeByName(lat_name)});
875
876 // Update all surface, cell, universe, and lattice references of incoming base to those of this
877 // base
878 if (!identical_surface_refs.empty())
879 replaceSurfaceRefsByName(identical_surface_refs, incoming_base);
880
881 if (!identical_cell_refs.empty())
882 replaceCellRefsByName(identical_cell_refs, incoming_base);
883
884 if (!identical_universe_refs.empty())
885 replaceUniverseRefsByName(identical_universe_refs, incoming_base);
886
887 if (!identical_lattice_refs.empty())
888 replaceLatticeRefsByName(identical_lattice_refs, incoming_base);
889}
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:917
const CSGSurface & getSurfaceByName(const std::string &name) const
Get a Surface object by name.
Definition CSGBase.h:112
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:954
bool hasUniverse(const std::string &name) const
Check if a universe with given name exists in CSGBase object.
Definition CSGBase.h:387
bool hasLattice(const std::string &name) const
Check if a lattice with given name exists in CSGBase object.
Definition CSGBase.h:525
bool hasSurface(const std::string &name) const
Check if a surface with given name exists in CSGBase object.
Definition CSGBase.h:123
const LatticeType & getLatticeByName(const std::string &name)
Get a lattice object of the specified type by name.
Definition CSGBase.h:509
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:902
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:892
const CSGCell & getCellByName(const std::string &name) const
Get a Cell object by name.
Definition CSGBase.h:215

Member Data Documentation

◆ _cell_list

CSGCellList CSG::CSGBase::_cell_list
private

List of cells associated with CSG object.

Definition at line 1264 of file CSGBase.h.

Referenced by addEngUnit(), CSGBase(), getAllCells(), getCellByName(), getCellList(), getCellList(), and hasCell().

◆ _eng_unit_list

CSGEngUnitList CSG::CSGBase::_eng_unit_list
private

Container for all associated engineering units.

Definition at line 1273 of file CSGBase.h.

Referenced by addEngUnit(), getAllCellEngUnits(), getAllEngUnits(), getAllSurfaceEngUnits(), getAllUniverseEngUnits(), getEngUnitByName(), getEngUnitList(), and hasEngUnit().

◆ _lattice_list

CSGLatticeList CSG::CSGBase::_lattice_list
private

List of lattices associated with CSG object.

Definition at line 1270 of file CSGBase.h.

Referenced by addLattice(), getAllLattices(), getLatticeByName(), getLatticeList(), getLatticeList(), hasLattice(), and renameLattice().

◆ _surface_list

CSGSurfaceList CSG::CSGBase::_surface_list
private

List of surfaces associated with CSG object.

Definition at line 1261 of file CSGBase.h.

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

◆ _universe_list

CSGUniverseList CSG::CSGBase::_universe_list
private

List of universes associated with CSG object.

Definition at line 1267 of file CSGBase.h.

Referenced by addEngUnit(), createUniverse(), getAllUniverses(), getRootUniverse(), getUniverseByName(), getUniverseList(), getUniverseList(), hasUniverse(), and renameRootUniverse().


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