updating tests and setting it so the closest temperature is used

This commit is contained in:
Adam Nelson 2016-08-22 21:25:47 -04:00
parent cd95667292
commit 1d551037ce
14 changed files with 501 additions and 349 deletions

View file

@ -129,6 +129,7 @@ class Material(object):
string = 'Material\n'
string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._temperature)
string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density)
string += ' [{0}]\n'.format(self._density_units)
@ -632,6 +633,10 @@ class Material(object):
if len(self._name) > 0:
element.set("name", str(self._name))
# Create temperature XML subelement
subelement = ET.SubElement(element, "temperature")
subelement.text = self.temperature
# Create density XML subelement
subelement = ET.SubElement(element, "density")
if self._density_units is not 'sum':

View file

@ -1265,9 +1265,9 @@ class ResonanceScattering(object):
subelement = ET.SubElement(scatterer, 'method')
subelement.text = self.method
subelement = ET.SubElement(scatterer, 'xs_label')
subelement.text = '{0.name}.{0.xs}'.format(self.nuclide)
subelement.text = self.nuclide.name
subelement = ET.SubElement(scatterer, 'xs_label_0K')
subelement.text = '{0.name}.{0.xs}'.format(self.nuclide_0K)
subelement.text = self.nuclide_0K.name
if self.E_min is not None:
subelement = ET.SubElement(scatterer, 'E_min')
subelement.text = str(self.E_min)

View file

@ -95,6 +95,8 @@ module hdf5_interface
public :: close_dataset
public :: get_shape
public :: write_attribute_string
public :: get_groups
public :: get_datasets
contains
@ -204,6 +206,82 @@ contains
call h5fclose_f(file_id, hdf5_err)
end subroutine file_close
!===============================================================================
! GET_GROUPS Gets a list of all the groups in a given location.
!===============================================================================
subroutine get_groups(object_id, names)
integer(HID_T), intent(in) :: object_id
character(len=255), allocatable, intent(out) :: names(:)
integer :: n_members, i, group_count, type
integer :: hdf5_err
character(len=255) :: name
! Get number of members in this location
call h5gn_members_f(object_id, './', n_members, hdf5_err)
! Get the number of groups
group_count = 0
do i = 0, n_members - 1
call h5gget_obj_info_idx_f(object_id, "./", i, name, type, hdf5_err)
if (type == H5G_GROUP_F) then
group_count = group_count + 1
end if
end do
! Now we can allocate the storage for the ids
allocate(names(group_count))
group_count = 0
do i = 0, n_members - 1
call h5gget_obj_info_idx_f(object_id, "./", i, name, type, hdf5_err)
if (type == H5G_GROUP_F) then
group_count = group_count + 1
names(group_count) = trim(name)
end if
end do
end subroutine get_groups
!===============================================================================
! GET_DATASETS Gets a list of all the datasets in a given location.
!===============================================================================
subroutine get_datasets(object_id, names)
integer(HID_T), intent(in) :: object_id
character(len=255), allocatable, intent(out) :: names(:)
integer :: n_members, i, dset_count, type
integer :: hdf5_err
character(len=255) :: name
! Get number of members in this location
call h5gn_members_f(object_id, './', n_members, hdf5_err)
! Get the number of datasets
dset_count = 0
do i = 0, n_members - 1
call h5gget_obj_info_idx_f(object_id, "./", i, name, type, hdf5_err)
if (type == H5G_DATASET_F ) then
dset_count = dset_count + 1
end if
end do
! Now we can allocate the storage for the ids
allocate(names(dset_count))
dset_count = 0
do i = 0, n_members - 1
call h5gget_obj_info_idx_f(object_id, "./", i, name, type, hdf5_err)
if (type == H5G_DATASET_F ) then
dset_count = dset_count + 1
names(dset_count) = trim(name)
end if
end do
end subroutine get_datasets
!===============================================================================
! OPEN_GROUP opens an existing HDF5 group
!===============================================================================

File diff suppressed because it is too large Load diff

View file

@ -89,7 +89,7 @@ contains
end do
! ==========================================================================
! READ ALL ACE CROSS SECTION TABLES
! READ ALL MGXS CROSS SECTION TABLES
! Loop over all files
MATERIAL_LOOP: do i = 1, n_materials

View file

@ -13,7 +13,7 @@ module nuclide_header
use endf_header, only: Function1D, Polynomial, Tabulated1D
use error, only: fatal_error, warning
use hdf5_interface, only: read_attribute, open_group, close_group, &
open_dataset, read_dataset, close_dataset, get_shape
open_dataset, read_dataset, close_dataset, get_shape, get_datasets
use list_header, only: ListInt
use math, only: evaluate_legendre
use multipole_header, only: MultipoleArray
@ -205,6 +205,11 @@ module nuclide_header
integer(HSIZE_T) :: j
integer(HSIZE_T) :: dims(1)
character(MAX_WORD_LEN) :: temp
character(MAX_FILE_LEN), allocatable :: temperatures(:)
integer, allocatable :: temperatures_integer(:)
integer :: temperature_delta
character(6) :: my_temperature
integer :: temperature_integer
type(VectorInt) :: MTs
logical :: exists
@ -218,17 +223,42 @@ module nuclide_header
call read_attribute(Z, group_id, 'Z')
call read_attribute(A, group_id, 'A')
call read_attribute(this % metastable, group_id, 'metastable')
this % zaid = 1000*Z + A + 400*this % metastable
this % zaid = 1000 * Z + A + 400 * this % metastable
call read_attribute(this % awr, group_id, 'atomic_weight_ratio')
kT_group = open_group(group_id, 'kTs')
kT_dset = open_dataset(kT_group, temperature)
! Before accessing the temperature data, see if the user-provied temperature
! exists. We can find this out by looking at the datasets within kT_group
temp = adjustr(trim(temperature))
temperature_integer = str_to_int(temp(1:len(temp) - 1))
call get_datasets(kT_group, temperatures)
allocate(temperatures_integer(size(temperatures)))
do i = 1, size(temperatures)
temp = adjustr(trim(temperatures(i)))
temperatures_integer(i) = str_to_int(temp(1:len(temp) - 1))
end do
j = 1
temperature_delta = temperature_integer - temperatures_integer(j)
do i = 2, size(temperatures)
if (abs(temperature_integer - temperatures_integer(i)) < temperature_delta) &
j = i
end do
! Now print a warning if there is no matching temperature and then use the
! closest temperature
my_temperature = temperatures(j)
if (temperature /= my_temperature) then
call warning(trim(this % name) // " does not contain data at a &
&temperature of " // trim(temperature) // "; using the &
&nearest available temperature of " // trim(my_temperature))
end if
kT_dset = open_dataset(kT_group, my_temperature)
call read_dataset(this % kT, kT_dset)
call close_dataset(kT_dset)
call close_group(kT_group)
! Read energy grid
energy_group = open_group(group_id, 'energy')
energy_dset = open_dataset(energy_group, temperature)
energy_dset = open_dataset(energy_group, my_temperature)
call get_shape(energy_dset, dims)
this % n_grid = int(dims(1), 4)
allocate(this % energy(this % n_grid))
@ -252,7 +282,7 @@ module nuclide_header
do i = 1, size(this % reactions)
rx_group = open_group(rxs_group, 'reaction_' // trim(&
zero_padded(MTs % data(i), 3)))
call this % reactions(i) % from_hdf5(rx_group, temperature)
call this % reactions(i) % from_hdf5(rx_group, my_temperature)
call close_group(rx_group)
end do
call close_group(rxs_group)

View file

@ -4,12 +4,13 @@ module sab_header
use constants
use distribution_univariate, only: Tabular
use hdf5, only: HID_T, HSIZE_T
use h5lt, only: h5ltpath_valid_f
use error, only: warning
use hdf5, only: HID_T, HSIZE_T, SIZE_T
use h5lt, only: h5ltpath_valid_f, h5iget_name_f
use hdf5_interface, only: read_attribute, get_shape, open_group, close_group, &
open_dataset, read_dataset, close_dataset
open_dataset, read_dataset, close_dataset, get_datasets
use secondary_correlated, only: CorrelatedAngleEnergy
use string, only: to_str
use string, only: to_str, str_to_int
implicit none
@ -162,6 +163,7 @@ contains
integer :: i, j
integer :: n_energy, n_energy_out, n_mu
integer :: hdf5_err
integer(SIZE_T) :: name_len, name_file_len
integer(HID_T) :: T_group
integer(HID_T) :: elastic_group
integer(HID_T) :: inelastic_group
@ -173,6 +175,19 @@ contains
character(20) :: type
logical :: exists
type(CorrelatedAngleEnergy) :: correlated_dist
character(MAX_FILE_LEN), allocatable :: temperatures(:)
character(MAX_FILE_LEN) :: temp_str
integer, allocatable :: temperatures_integer(:)
integer :: temperature_delta
character(6) :: my_temperature
integer :: temperature_integer
! Get name of table from group
name_len = len(this % name)
call h5iget_name_f(group_id, this % name, name_len, name_file_len, hdf5_err)
! Get rid of leading '/'
this % name = trim(this % name(2:))
call read_attribute(this % awr, group_id, 'atomic_weight_ratio')
call read_attribute(this % zaid, group_id, 'zaids')
@ -187,13 +202,38 @@ contains
end select
this % n_zaid = size(this % zaid)
kT_group = open_group(group_id, 'kTs')
kT_dset = open_dataset(kT_group, temperature)
! Before accessing the temperature data, see if the user-provied temperature
! exists. We can find this out by looking at the datasets within kT_group
temp_str = adjustr(trim(temperature))
temperature_integer = str_to_int(temp_str(1:len(temp_str) - 1))
call get_datasets(kT_group, temperatures)
allocate(temperatures_integer(size(temperatures)))
do i = 1, size(temperatures)
temp_str = adjustr(trim(temperatures(i)))
temperatures_integer(i) = str_to_int(temp_str(1:len(temp_str) - 1))
end do
j = 1
temperature_delta = temperature_integer - temperatures_integer(j)
do i = 2, size(temperatures)
if (abs(temperature_integer - temperatures_integer(i)) < temperature_delta) &
j = i
end do
! Now print a warning if there is no matching temperature and then use the
! closest temperature
my_temperature = temperatures(j)
if (temperature /= my_temperature) then
call warning(trim(this % name) // " does not contain data at a &
&temperature of " // trim(temperature) // "; using the &
&nearest available temperature of " // trim(my_temperature))
end if
kT_dset = open_dataset(kT_group, my_temperature)
call read_dataset(this % kT, kT_dset)
call close_dataset(kT_dset)
call close_group(kT_group)
! Open temperature group
T_group = open_group(group_id, temperature)
! Open my_temperature group
T_group = open_group(group_id, my_temperature)
! Coherent elastic data
call h5ltpath_valid_f(T_group, 'elastic', .true., exists, hdf5_err)

View file

@ -1 +1 @@
6ae54c198e7659503d297e40be746a5bd72b35909fceed4b3ef357876b781946c0ea5021342556ef21f4034fa9e42b2c6014077c0efd3459dc063e6da4b12b59
dd0b1228d264dd3c24ca3082de9839080f727a137c77bed74b7637cc16d1564ce7500e3bb61a88224926f1d837079702f304247efdf9e52dedf779e17cd14550

View file

@ -1 +1 @@
0766f3e0ac9b3d26bf5529eb3c92e0337698994d663b6a68dd8c1340807d6941c7589d777430782bc7b78590adced55f0f55b1de71a7c70d453f78d4ca469d8d
f427510feb8a63ee2246613e65c9e9a488b6b7df11ce5f5ab0c61b23f299e150a27068ee110f77c64b5bb82882b6d0a428e06de681df2bd83facb9ebc46fb54c

View file

@ -18,7 +18,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness):
mat.add_nuclide('H1', 20.0)
mats_file = openmc.Materials([mat])
mats_file.default_xs = '71c'
mats_file.default_temperature = '294K'
mats_file.export_to_xml()
# Geometry
@ -37,7 +37,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness):
geometry.export_to_xml()
# Settings
nuclide = openmc.Nuclide('U238', '71c')
nuclide = openmc.Nuclide('U238')
res_scatt_dbrc = openmc.ResonanceScattering()
res_scatt_dbrc.nuclide = nuclide
res_scatt_dbrc.nuclide_0K = nuclide # This is a bad idea! Just for tests
@ -45,7 +45,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness):
res_scatt_dbrc.E_min = 1e-6
res_scatt_dbrc.E_max = 210e-6
nuclide = openmc.Nuclide('U235', '71c')
nuclide = openmc.Nuclide('U235')
res_scatt_wcm = openmc.ResonanceScattering()
res_scatt_wcm.nuclide = nuclide
res_scatt_wcm.nuclide_0K = nuclide
@ -53,7 +53,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness):
res_scatt_wcm.E_min = 1e-6
res_scatt_wcm.E_max = 210e-6
nuclide = openmc.Nuclide('Pu239', '71c')
nuclide = openmc.Nuclide('Pu239')
res_scatt_ares = openmc.ResonanceScattering()
res_scatt_ares.nuclide = nuclide
res_scatt_ares.nuclide_0K = nuclide

View file

@ -1 +1 @@
27ceb546499a4134eac08ffb22d02ce21d67f12617d43a02991b443e9aca7b7eca818d03e146676c0b352abaef6505423e48edef24cfd7a8fdb148cb3dbcdb1f
29498faa9496b8eeeab79f6cb5a966cb03a54e9c3c7e9178e7cc132df575f1377aa780fa2684201c4becdf199f89c3e7c36a824a495e60359bc6fd30b02cad6f

View file

@ -1 +1 @@
f33e6653b883200457df2ff2ba9cf715d5ddaa1296dd71d277c6f1d9d5b7831cc92aaf1e97509d26e5a93235cd9f775c0cfaa5ebc3dfe8fc71469bac166d362b
c844cc920677037d22e6075780ab3e419f6ded19ea08c6f205df1773caa1a0ee53c605b7794415a24d9f0dbf6bd21d40daa9fcc89497b2abccabb1a6c81a506c

View file

@ -1 +1 @@
102569289552d021b6803f404a0c17a9c17a40578fdba43a6ba08b77a731e0368fffa6a8a7abd48555167cb9997c6dba9ec5044c8593b12056957b7e3ec44ed0
aeacdb4aabfdfba0ee06cb4e5b21e95c48b1db57cb1301a1798f9b2f37eb56032ea7e94d88d8eacd17988809059b2da2500c2496c2859e5b656b641440545722

View file

@ -3,29 +3,29 @@ Volume calculation 0
Domain 1: 31.4693 +/- 0.0721 cm^3
Domain 2: 2.0933 +/- 0.0310 cm^3
Domain 3: 2.0486 +/- 0.0307 cm^3
Cell Nuclide Atoms Uncertainty
0 1 U235.71c 3.481769e+23 7.979991e+20
1 1 Mo99.71c 3.481769e+22 7.979991e+19
2 2 H1.71c 1.399770e+23 2.072914e+21
3 2 O16.71c 6.998852e+22 1.036457e+21
4 2 B10.71c 6.998852e+18 1.036457e+17
5 3 H1.71c 1.369920e+23 2.051689e+21
6 3 O16.71c 6.849599e+22 1.025844e+21
7 3 B10.71c 6.849599e+18 1.025844e+17
Cell Nuclide Atoms Uncertainty
0 1 U235 3.481769e+23 7.979991e+20
1 1 Mo99 3.481769e+22 7.979991e+19
2 2 H1 1.399770e+23 2.072914e+21
3 2 O16 6.998852e+22 1.036457e+21
4 2 B10 6.998852e+18 1.036457e+17
5 3 H1 1.369920e+23 2.051689e+21
6 3 O16 6.849599e+22 1.025844e+21
7 3 B10 6.849599e+18 1.025844e+17
Volume calculation 1
Domain 1: 4.1419 +/- 0.0426 cm^3
Domain 2: 31.4693 +/- 0.0721 cm^3
Material Nuclide Atoms Uncertainty
0 1 H1.71c 2.769690e+23 2.850068e+21
1 1 O16.71c 1.384845e+23 1.425034e+21
2 1 B10.71c 1.384845e+19 1.425034e+17
3 2 U235.71c 3.481769e+23 7.979991e+20
4 2 Mo99.71c 3.481769e+22 7.979991e+19
Material Nuclide Atoms Uncertainty
0 1 H1 2.769690e+23 2.850068e+21
1 1 O16 1.384845e+23 1.425034e+21
2 1 B10 1.384845e+19 1.425034e+17
3 2 U235 3.481769e+23 7.979991e+20
4 2 Mo99 3.481769e+22 7.979991e+19
Volume calculation 2
Domain 0: 35.6112 +/- 0.0664 cm^3
Universe Nuclide Atoms Uncertainty
0 0 H1.71c 2.769690e+23 2.850068e+21
1 0 O16.71c 1.384845e+23 1.425034e+21
2 0 B10.71c 1.384845e+19 1.425034e+17
3 0 U235.71c 3.481769e+23 7.979991e+20
4 0 Mo99.71c 3.481769e+22 7.979991e+19
Universe Nuclide Atoms Uncertainty
0 0 H1 2.769690e+23 2.850068e+21
1 0 O16 1.384845e+23 1.425034e+21
2 0 B10 1.384845e+19 1.425034e+17
3 0 U235 3.481769e+23 7.979991e+20
4 0 Mo99 3.481769e+22 7.979991e+19