mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-29 06:35:48 -04:00
updating tests and setting it so the closest temperature is used
This commit is contained in:
parent
cd95667292
commit
1d551037ce
14 changed files with 501 additions and 349 deletions
|
|
@ -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':
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6ae54c198e7659503d297e40be746a5bd72b35909fceed4b3ef357876b781946c0ea5021342556ef21f4034fa9e42b2c6014077c0efd3459dc063e6da4b12b59
|
||||
dd0b1228d264dd3c24ca3082de9839080f727a137c77bed74b7637cc16d1564ce7500e3bb61a88224926f1d837079702f304247efdf9e52dedf779e17cd14550
|
||||
|
|
@ -1 +1 @@
|
|||
0766f3e0ac9b3d26bf5529eb3c92e0337698994d663b6a68dd8c1340807d6941c7589d777430782bc7b78590adced55f0f55b1de71a7c70d453f78d4ca469d8d
|
||||
f427510feb8a63ee2246613e65c9e9a488b6b7df11ce5f5ab0c61b23f299e150a27068ee110f77c64b5bb82882b6d0a428e06de681df2bd83facb9ebc46fb54c
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
27ceb546499a4134eac08ffb22d02ce21d67f12617d43a02991b443e9aca7b7eca818d03e146676c0b352abaef6505423e48edef24cfd7a8fdb148cb3dbcdb1f
|
||||
29498faa9496b8eeeab79f6cb5a966cb03a54e9c3c7e9178e7cc132df575f1377aa780fa2684201c4becdf199f89c3e7c36a824a495e60359bc6fd30b02cad6f
|
||||
|
|
@ -1 +1 @@
|
|||
f33e6653b883200457df2ff2ba9cf715d5ddaa1296dd71d277c6f1d9d5b7831cc92aaf1e97509d26e5a93235cd9f775c0cfaa5ebc3dfe8fc71469bac166d362b
|
||||
c844cc920677037d22e6075780ab3e419f6ded19ea08c6f205df1773caa1a0ee53c605b7794415a24d9f0dbf6bd21d40daa9fcc89497b2abccabb1a6c81a506c
|
||||
|
|
@ -1 +1 @@
|
|||
102569289552d021b6803f404a0c17a9c17a40578fdba43a6ba08b77a731e0368fffa6a8a7abd48555167cb9997c6dba9ec5044c8593b12056957b7e3ec44ed0
|
||||
aeacdb4aabfdfba0ee06cb4e5b21e95c48b1db57cb1301a1798f9b2f37eb56032ea7e94d88d8eacd17988809059b2da2500c2496c2859e5b656b641440545722
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue