Can now successfully read S(a,b) tables.

This commit is contained in:
Paul Romano 2011-10-26 14:18:08 -04:00
parent 3299dddaa1
commit 70519582d8
4 changed files with 75 additions and 46 deletions

View file

@ -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>

View file

@ -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

View file

@ -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

View file

@ -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