diff --git a/include/openmc/material.h b/include/openmc/material.h index 8db9bb6283..deaee2469b 100644 --- a/include/openmc/material.h +++ b/include/openmc/material.h @@ -90,6 +90,12 @@ public: void set_densities( const vector& name, const vector& density); + //! Clone the material by deep-copying all members, except for the ID, + // which will get auto-assigned to the next available ID. After creating + // the new material, it is added to openmc::model::materials. + //! \return reference to the cloned material + Material & clone(); + //---------------------------------------------------------------------------- // Accessors diff --git a/src/material.cpp b/src/material.cpp index 74a8d7e350..82dd0d4d9e 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -353,6 +353,35 @@ Material::~Material() model::material_map.erase(id_); } +Material & Material::clone() +{ + std::unique_ptr mat = std::make_unique(); + + // set all other parameters to whatever the calling Material has + mat->name_ = name_; + mat->nuclide_ = nuclide_; + mat->element_ = element_; + mat->ncrystal_mat_ = ncrystal_mat_; + mat->atom_density_ = atom_density_; + mat->density_ = density_; + mat->density_gpcc_ = density_gpcc_; + mat->volume_ = volume_; + mat->fissionable_ = fissionable_; + mat->depletable_ = depletable_; + mat->p0_ = p0_; + mat->mat_nuclide_index_ = mat_nuclide_index_; + mat->thermal_tables_ = thermal_tables_; + mat->temperature_ = temperature_; + + if (ttb_) + mat->ttb_ = std::make_unique(*ttb_); + + mat->index_ = model::materials.size(); + mat->set_id(C_NONE); + model::materials.push_back(std::move(mat)); + return *model::materials.back(); +} + void Material::finalize() { // Set fissionable if any nuclide is fissionable