From 2220fb02a7e65d2d03f16d5bbfce6233a24b1259 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 3 May 2016 04:40:59 -0400 Subject: [PATCH] Added zaid and awr data to summary so that openmc.mgxs.Library can access that information and pass it forward to the outputted microscopic library. --- openmc/mgxs/library.py | 5 +++++ openmc/mgxs_library.py | 36 ++++++++++++++++++++++++++++++++++ openmc/summary.py | 16 +++++++++++++-- src/summary.F90 | 44 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 1e9156ce58..0ceb154b89 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -410,6 +410,7 @@ class Library(object): self._sp_filename = statepoint._f.filename self._openmc_geometry = statepoint.summary.openmc_geometry + self._nuclides = statepoint.summary.nuclides if statepoint.run_mode == 'k-eigenvalue': self._keff = statepoint.k_combined[0] @@ -872,6 +873,10 @@ class Library(object): name += '.' + xs_ids[i] xsdata = openmc.XSdata(name, self.energy_groups) xsdata.order = order + print(self._nuclides) + print(nuclide) + xsdata.zaid = self._nuclides[nuclide][0] + xsdata.awr = self._nuclides[nuclide][1] # Now get xs data itself if 'total' in self.mgxs_types: diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index ef12c6c8ab..9f16888c1f 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -204,6 +204,8 @@ class XSdata(object): self._energy_groups = energy_groups self._representation = representation self._alias = None + self._zaid = None + self._awr = None self._kT = None self._fissionable = False self._scatt_type = 'legendre' @@ -237,6 +239,14 @@ class XSdata(object): def alias(self): return self._alias + @property + def zaid(self): + return self._zaid + + @property + def awr(self): + return self._awr + @property def kT(self): return self._kT @@ -334,6 +344,20 @@ class XSdata(object): else: self._alias = self._name + @zaid.setter + def zaid(self, zaid): + # Check type and value + check_type("zaid", zaid, Integral) + check_greater_than("zaid", zaid, 0, equality=False) + self._zaid = zaid + + @awr.setter + def awr(self, awr): + # Check validity of type and that the awr value is > 0 + check_type("awr", awr, Real) + check_greater_than("awr", awr, 0.0, equality=False) + self._awr = awr + @kT.setter def kT(self, kT): # Check validity of type and that the kT value is >= 0 @@ -1092,6 +1116,18 @@ class XSdata(object): subelement = ET.SubElement(element, 'kT') subelement.text = str(self._kT) + if self._zaid is not None: + subelement = ET.SubElement(element, 'zaid') + subelement.text = str(self._zaid) + + if self._awr is not None: + subelement = ET.SubElement(element, 'awr') + subelement.text = str(self._awr) + + if self._kT is not None: + subelement = ET.SubElement(element, 'kT') + subelement.text = str(self._kT) + if self._fissionable is not None: subelement = ET.SubElement(element, 'fissionable') subelement.text = str(self._fissionable) diff --git a/openmc/summary.py b/openmc/summary.py index 9b1c451f39..f33397d724 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -38,6 +38,7 @@ class Summary(object): self._opencg_geometry = None self._read_metadata() + self._read_nuclides() self._read_geometry() self._read_tallies() @@ -55,8 +56,8 @@ class Summary(object): def _read_metadata(self): # Read OpenMC version self.version = [self._f['version_major'].value, - self._f['version_minor'].value, - self._f['version_release'].value] + self._f['version_minor'].value, + self._f['version_release'].value] # Read date and time self.date_and_time = self._f['date_and_time'][...] @@ -70,6 +71,17 @@ class Summary(object): self.gen_per_batch = self._f['gen_per_batch'].value self.n_procs = self._f['n_procs'].value + def _read_nuclides(self): + self.nuclides = {} + n_nuclides = self._f['nuclides/n_nuclides_total'].value + names = self._f['nuclides/names'].value + awrs = self._f['nuclides/awrs'].value + zaids = self._f['nuclides/zaids'].value + for n in range(n_nuclides): + name = names[n].decode() + name = name[:name.find('.')] + self.nuclides[name] = (zaids[n], awrs[n]) + def _read_geometry(self): # Read in and initialize the Materials and Geometry self._read_materials() diff --git a/src/summary.F90 b/src/summary.F90 index 4502058cad..9defcc92fd 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -68,6 +68,7 @@ contains "description", "Number of generations per batch") end if + call write_nuclides(file_id) call write_geometry(file_id) call write_materials(file_id) if (n_tallies > 0) then @@ -105,6 +106,49 @@ contains end subroutine write_header +!=============================================================================== +! WRITE_NUCLIDES +!=============================================================================== + + subroutine write_nuclides(file_id) + integer(HID_T), intent(in) :: file_id + integer(HID_T) :: nuclide_group + integer :: i + character(12), allocatable :: nucnames(:) + real(8), allocatable :: awrs(:) + integer, allocatable :: zaids(:) + + ! Use H5LT interface to write useful data from nuclide objects + nuclide_group = create_group(file_id, "nuclides") + call write_dataset(nuclide_group, "n_nuclides_total", n_nuclides_total) + + ! Build array of nuclide names, awrs, and zaids + allocate(nucnames(n_nuclides_total)) + allocate(awrs(n_nuclides_total)) + allocate(zaids(n_nuclides_total)) + do i = 1, n_nuclides_total + if (run_CE) then + nucnames(i) = xs_listings(nuclides(i) % listing) % alias + awrs(i) = nuclides(i) % awr + zaids(i) = nuclides(i) % zaid + else + nucnames(i) = xs_listings(nuclides_MG(i) % obj % listing) % alias + awrs(i) = nuclides_MG(i) % obj % awr + zaids(i) = nuclides_MG(i) % obj % zaid + end if + end do + + ! Write nuclide names, awrs and zaids + call write_dataset(nuclide_group, "names", nucnames) + call write_dataset(nuclide_group, "awrs", awrs) + call write_dataset(nuclide_group, "zaids", zaids) + + call close_group(nuclide_group) + + deallocate(nucnames, awrs, zaids) + + end subroutine write_nuclides + !=============================================================================== ! WRITE_GEOMETRY !===============================================================================