mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-28 06:05:58 -04:00
Can now successfully read S(a,b) tables.
This commit is contained in:
parent
3299dddaa1
commit
70519582d8
4 changed files with 75 additions and 46 deletions
|
|
@ -11,7 +11,7 @@
|
|||
<density value="1.0" units="g/cc" />
|
||||
<nuclide name="H-1" xs="03c" ao="2.0" />
|
||||
<nuclide name="O-16" xs="03c" ao="1.0" />
|
||||
<sab name="H-H2O" xs="10t" />
|
||||
<sab name="lwe7" xs="00t" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ contains
|
|||
integer :: i ! index in materials array
|
||||
integer :: j ! index over nuclides in material
|
||||
integer :: index ! index in xsdatas array
|
||||
integer :: n ! length of key
|
||||
integer :: index_nuclides ! index in nuclides
|
||||
integer :: index_sab ! index in sab_tables
|
||||
character(10) :: key ! name of isotope, e.g. 92235.03c
|
||||
|
|
@ -51,34 +50,38 @@ contains
|
|||
index_nuclides = 0
|
||||
index_sab = 0
|
||||
do i = 1, n_materials
|
||||
! Get pointer to material
|
||||
mat => materials(i)
|
||||
|
||||
! First go through all the nuclide and check if they exist on other
|
||||
! materials -- if not, then increment the count for the number of
|
||||
! nuclides and add to dictionary
|
||||
do j = 1, mat % n_nuclides
|
||||
index = mat % xsdata(j)
|
||||
key = xsdatas(index) % id
|
||||
n = len_trim(key)
|
||||
key = mat % names(j)
|
||||
call lower_case(key)
|
||||
select case (key(n:n))
|
||||
case ('c')
|
||||
if (.not. dict_has_key(nuclide_dict, key)) then
|
||||
index_nuclides = index_nuclides + 1
|
||||
call dict_add_key(nuclide_dict, key, index_nuclides)
|
||||
mat % nuclide(j) = index_nuclides
|
||||
else
|
||||
mat % nuclide(j) = dict_get_key(nuclide_dict, key)
|
||||
end if
|
||||
case ('t')
|
||||
if (.not. dict_has_key(sab_dict, key)) then
|
||||
index_sab = index_sab + 1
|
||||
call dict_add_key(sab_dict, key, index_sab)
|
||||
mat % sab_table = index_sab
|
||||
else
|
||||
mat % sab_table = 0
|
||||
end if
|
||||
case default
|
||||
msg = "Unknown cross section table type: " // key
|
||||
call fatal_error(msg)
|
||||
end select
|
||||
if (.not. dict_has_key(nuclide_dict, key)) then
|
||||
index_nuclides = index_nuclides + 1
|
||||
call dict_add_key(nuclide_dict, key, index_nuclides)
|
||||
mat % nuclide(j) = index_nuclides
|
||||
else
|
||||
mat % nuclide(j) = dict_get_key(nuclide_dict, key)
|
||||
end if
|
||||
end do
|
||||
|
||||
! Check if S(a,b) exists on other materials
|
||||
if (mat % has_sab_table) then
|
||||
key = mat % sab_name
|
||||
call lower_case(key)
|
||||
if (.not. dict_has_key(sab_dict, key)) then
|
||||
index_sab = index_sab + 1
|
||||
call dict_add_key(sab_dict, key, index_sab)
|
||||
mat % sab_table = index_sab
|
||||
else
|
||||
mat % sab_table = dict_get_key(sab_dict, key)
|
||||
end if
|
||||
else
|
||||
mat % sab_table = 0
|
||||
end if
|
||||
end do
|
||||
|
||||
n_nuclides_total = index_nuclides
|
||||
|
|
@ -101,25 +104,39 @@ contains
|
|||
do i = 1, n_materials
|
||||
mat => materials(i)
|
||||
do j = 1, mat % n_nuclides
|
||||
! Get index in xsdatas array for this nuclide
|
||||
index = mat % xsdata(j)
|
||||
key = xsdatas(index) % id
|
||||
n = len_trim(key)
|
||||
|
||||
! Get name of nuclide
|
||||
key = mat % names(j)
|
||||
call lower_case(key)
|
||||
select case (key(n:n))
|
||||
case ('c')
|
||||
if (.not. dict_has_key(temp_dict, key)) then
|
||||
index_nuclides = index_nuclides + 1
|
||||
call read_ACE_continuous(index_nuclides, index)
|
||||
call dict_add_key(temp_dict, key, index_nuclides)
|
||||
end if
|
||||
case ('t')
|
||||
if (.not. dict_has_key(temp_dict, key)) then
|
||||
index_sab = index_sab + 1
|
||||
call read_ACE_thermal(index_sab, index)
|
||||
call dict_add_key(temp_dict, key, index_sab)
|
||||
end if
|
||||
end select
|
||||
|
||||
if (.not. dict_has_key(temp_dict, key)) then
|
||||
index_nuclides = index_nuclides + 1
|
||||
call read_ACE_continuous(index_nuclides, index)
|
||||
call dict_add_key(temp_dict, key, index_nuclides)
|
||||
end if
|
||||
end do
|
||||
|
||||
! Read S(a,b) table if this material has one and it hasn't been read
|
||||
! already
|
||||
if (mat % has_sab_table) then
|
||||
! Find index in xsdatas
|
||||
key = mat % sab_name
|
||||
if (dict_has_key(xsdata_dict, key)) then
|
||||
index = dict_get_key(xsdata_dict, key)
|
||||
else
|
||||
msg = "Cannot find cross-section " // trim(key) // " in specified &
|
||||
&xsdata file."
|
||||
call fatal_error(msg)
|
||||
end if
|
||||
|
||||
if (.not. dict_has_key(temp_dict, key)) then
|
||||
index_sab = index_sab + 1
|
||||
call read_ACE_thermal(index_sab, index)
|
||||
call dict_add_key(temp_dict, key, index_sab)
|
||||
end if
|
||||
end if
|
||||
end do
|
||||
|
||||
! delete dictionary
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ module initialize
|
|||
use output, only: title, echo_input, message, print_summary, &
|
||||
print_particle, header, print_plot
|
||||
use source, only: initialize_source
|
||||
use string, only: int_to_str, starts_with, ends_with
|
||||
use string, only: int_to_str, starts_with, ends_with, lower_case
|
||||
use tally, only: create_tally_map, TallyObject
|
||||
use timing, only: timer_start, timer_stop
|
||||
|
||||
|
|
@ -527,6 +527,7 @@ contains
|
|||
integer :: index ! index used for several purposes
|
||||
integer :: i ! index in materials array
|
||||
integer :: j ! index over nuclides in material
|
||||
integer :: n ! length of string
|
||||
real(8) :: sum_percent !
|
||||
real(8) :: awr ! atomic weight ratio
|
||||
real(8) :: x ! atom percent
|
||||
|
|
@ -556,13 +557,23 @@ contains
|
|||
do j = 1, mat % n_nuclides
|
||||
! Set indices for nuclides
|
||||
key = mat % names(j)
|
||||
index = dict_get_key(xsdata_dict, key)
|
||||
if (index == DICT_NULL) then
|
||||
|
||||
! Check to make sure cross-section is continuous energy neutron table
|
||||
n = len_trim(key)
|
||||
if (key(n:n) /= 'c') then
|
||||
msg = "Cross-section table " // trim(key) // " is not a " // &
|
||||
"continuous-energy neutron table."
|
||||
call fatal_error(msg)
|
||||
end if
|
||||
|
||||
if (dict_has_key(xsdata_dict, key)) then
|
||||
index = dict_get_key(xsdata_dict, key)
|
||||
mat % xsdata(j) = index
|
||||
else
|
||||
msg = "Cannot find cross-section " // trim(key) // " in specified &
|
||||
&xsdata file."
|
||||
call fatal_error(msg)
|
||||
end if
|
||||
mat % xsdata(j) = index
|
||||
|
||||
! determine atomic weight ratio
|
||||
awr = xsdatas(index) % awr
|
||||
|
|
|
|||
|
|
@ -487,6 +487,7 @@ contains
|
|||
elseif (nuc % ao /= ZERO .and. nuc % wo /= ZERO) then
|
||||
msg = "Cannot specify both atom and weight percents for a nuclide: " &
|
||||
// trim(name)
|
||||
call fatal_error(msg)
|
||||
end if
|
||||
|
||||
! Copy atom/weight percents
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue