From 6940656c8a421a00c8d8e34253e2a8c616066f9b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 15 Nov 2018 15:25:48 -0600 Subject: [PATCH] Start reading nuclides on C++ side --- include/openmc/nuclide.h | 23 +++++++++++++++++++++++ src/nuclide.cpp | 24 ++++++++++++++++++++++++ src/nuclide_header.F90 | 10 ++++++++++ 3 files changed, 57 insertions(+) diff --git a/include/openmc/nuclide.h b/include/openmc/nuclide.h index db30a1a50a..c86ba63345 100644 --- a/include/openmc/nuclide.h +++ b/include/openmc/nuclide.h @@ -5,11 +5,32 @@ #define OPENMC_NUCLIDE_H #include +#include + +#include #include "openmc/constants.h" namespace openmc { +//=============================================================================== +// Data for a nuclide +//=============================================================================== + +class Nuclide { +public: + // Constructors + Nuclide(hid_t group); + + // Data members + std::string name_; //! Name of nuclide, e.g. "U235" + int Z_; //! Atomic number + int A_; //! Mass number + int metastable_; //! Metastable state + double awr_; //! Atomic weight ratio + +}; + //============================================================================== // Global variables //============================================================================== @@ -21,6 +42,8 @@ namespace data { extern std::array energy_min; extern std::array energy_max; +extern std::vector nuclides; + } // namespace data //=============================================================================== diff --git a/src/nuclide.cpp b/src/nuclide.cpp index 18e7e5a7e1..82022159f7 100644 --- a/src/nuclide.cpp +++ b/src/nuclide.cpp @@ -1,5 +1,7 @@ #include "openmc/nuclide.h" +#include "openmc/hdf5_interface.h" + namespace openmc { //============================================================================== @@ -11,8 +13,25 @@ namespace data { std::array energy_min {0.0, 0.0}; std::array energy_max {INFTY, INFTY}; +std::vector nuclides; + } // namespace data +//============================================================================== +// Nuclide implementation +//============================================================================== + +Nuclide::Nuclide(hid_t group) +{ + // Get name of nuclide from group, removing leading '/' + name_ = object_name(group).substr(1); + + read_attribute(group, "Z", Z_); + read_attribute(group, "A", A_); + read_attribute(group, "metastable", metastable_); + read_attribute(group, "atomic_weight_ratio", awr_); +} + //============================================================================== // Fortran compatibility functions //============================================================================== @@ -24,4 +43,9 @@ set_particle_energy_bounds(int particle, double E_min, double E_max) data::energy_max[particle - 1] = E_max; } +extern "C" void nuclide_from_hdf5_c(hid_t group) +{ + data::nuclides.emplace_back(group); +} + } // namespace openmc diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 921dcd3bd2..aaf619d8c0 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -363,6 +363,16 @@ contains type(VectorInt) :: temps_to_read type(VectorInt) :: index_inelastic_scatter + interface + subroutine nuclide_from_hdf5_c(group) bind(C) + import HID_T + integer(HID_T), value :: group + end subroutine + end interface + + ! Read data on C++ side + call nuclide_from_hdf5_c(group_id) + ! Get name of nuclide from group this % name = get_name(group_id)