mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-28 06:05:58 -04:00
merged with upstream/develop
This commit is contained in:
commit
120b58a0b5
202 changed files with 13075 additions and 14527 deletions
7
.gitignore
vendored
7
.gitignore
vendored
|
|
@ -60,8 +60,15 @@ src/install_manifest.txt
|
|||
|
||||
# Nuclear data
|
||||
data/nndc
|
||||
data/nndc_hdf5
|
||||
data/wmp
|
||||
data/multipole_lib.tar.gz
|
||||
data/ENDF-B-VII.1-*.tar.gz
|
||||
data/JEFF32-ACE-*.tar.gz
|
||||
data/JEFF32-ACE-*.zip
|
||||
data/TSLs.tar.gz
|
||||
data/jeff-3.2
|
||||
data/jeff-3.2-hdf5
|
||||
|
||||
# Images
|
||||
*.ppm
|
||||
|
|
|
|||
10
.travis.yml
10
.travis.yml
|
|
@ -13,6 +13,7 @@ cache:
|
|||
- $HOME/mpich_install
|
||||
- $HOME/hdf5_install
|
||||
- $HOME/phdf5_install
|
||||
- $HOME/nndc_hdf5
|
||||
|
||||
before_install:
|
||||
# ============== Handle Python third-party packages ==============
|
||||
|
|
@ -40,11 +41,12 @@ before_install:
|
|||
install: true
|
||||
|
||||
before_script:
|
||||
- if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then
|
||||
wget https://anl.box.com/shared/static/6pwyfjnufam0sb96kqwwrve6vdn8m7u4.xz -O - | tar -C $HOME -xvJ;
|
||||
fi
|
||||
- export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml
|
||||
|
||||
- cd data
|
||||
- git clone --branch=master git://github.com/bhermanmit/nndc_xs nndc_xs
|
||||
- cat nndc_xs/nndc.tar.gza* | tar xzvf -
|
||||
- rm -rf nndc_xs
|
||||
- export OPENMC_CROSS_SECTIONS=$PWD/nndc/cross_sections.xml
|
||||
- git clone --branch=master git://github.com/smharper/windowed_multipole_library.git wmp_lib
|
||||
- tar xzvf wmp_lib/multipole_lib.tar.gz
|
||||
- export OPENMC_MULTIPOLE_LIBRARY=$PWD/multipole_lib
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU)
|
|||
list(APPEND ldflags -pg)
|
||||
endif()
|
||||
if(optimize)
|
||||
list(APPEND f90flags -O3 -flto -fuse-linker-plugin)
|
||||
list(APPEND f90flags -O3)
|
||||
list(APPEND cflags -O3)
|
||||
endif()
|
||||
if(openmp)
|
||||
|
|
@ -147,8 +147,7 @@ elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Intel)
|
|||
if(debug)
|
||||
list(APPEND f90flags -g -warn -ftrapuv -fp-stack-check
|
||||
"-check all" -fpe0)
|
||||
list(APPEND cflags -g -warn -ftrapuv -fp-stack-check
|
||||
"-check all" -fpe0)
|
||||
list(APPEND cflags -g -w3 -ftrapuv -fp-stack-check)
|
||||
list(APPEND ldflags -g)
|
||||
endif()
|
||||
if(profile)
|
||||
|
|
@ -161,9 +160,9 @@ elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Intel)
|
|||
list(APPEND cflags -O3)
|
||||
endif()
|
||||
if(openmp)
|
||||
list(APPEND f90flags -openmp)
|
||||
list(APPEND cflags -openmp)
|
||||
list(APPEND ldflags -openmp)
|
||||
list(APPEND f90flags -qopenmp)
|
||||
list(APPEND cflags -qopenmp)
|
||||
list(APPEND ldflags -qopenmp)
|
||||
endif()
|
||||
|
||||
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL PGI)
|
||||
|
|
@ -318,6 +317,7 @@ if(PYTHONINTERP_FOUND)
|
|||
--root=debian/openmc --install-layout=deb
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})")
|
||||
else()
|
||||
install(CODE "set(ENV{PYTHONPATH} \"${CMAKE_INSTALL_PREFIX}/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages\")")
|
||||
install(CODE "execute_process(
|
||||
COMMAND ${PYTHON_EXECUTABLE} setup.py install
|
||||
--prefix=${CMAKE_INSTALL_PREFIX}
|
||||
|
|
|
|||
2
LICENSE
2
LICENSE
|
|
@ -1,4 +1,4 @@
|
|||
Copyright (c) 2011-2015 Massachusetts Institute of Technology
|
||||
Copyright (c) 2011-2016 Massachusetts Institute of Technology
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,870 +0,0 @@
|
|||
<?xml version="1.0" ?>
|
||||
<cross_sections>
|
||||
<filetype>ascii</filetype>
|
||||
<ace_table alias="H-1.71c" awr="0.999167" location="1" name="1001.71c" path="293.6K/H_001_293.6K.ace" temperature="2.53e-08" zaid="1001"/>
|
||||
<ace_table alias="H-2.71c" awr="1.9968" location="1" name="1002.71c" path="293.6K/H_002_293.6K.ace" temperature="2.53e-08" zaid="1002"/>
|
||||
<ace_table alias="H-3.71c" awr="2.989596" location="1" name="1003.71c" path="293.6K/H_003_293.6K.ace" temperature="2.53e-08" zaid="1003"/>
|
||||
<ace_table alias="He-3.71c" awr="2.989032" location="1" name="2003.71c" path="293.6K/He_003_293.6K.ace" temperature="2.53e-08" zaid="2003"/>
|
||||
<ace_table alias="He-4.71c" awr="3.968219" location="1" name="2004.71c" path="293.6K/He_004_293.6K.ace" temperature="2.53e-08" zaid="2004"/>
|
||||
<ace_table alias="Li-6.71c" awr="5.9634" location="1" name="3006.71c" path="293.6K/Li_006_293.6K.ace" temperature="2.53e-08" zaid="3006"/>
|
||||
<ace_table alias="Li-7.71c" awr="6.955732" location="1" name="3007.71c" path="293.6K/Li_007_293.6K.ace" temperature="2.53e-08" zaid="3007"/>
|
||||
<ace_table alias="Be-7.71c" awr="6.9545" location="1" name="4007.71c" path="293.6K/Be_007_293.6K.ace" temperature="2.53e-08" zaid="4007"/>
|
||||
<ace_table alias="Be-9.71c" awr="8.93478" location="1" name="4009.71c" path="293.6K/Be_009_293.6K.ace" temperature="2.53e-08" zaid="4009"/>
|
||||
<ace_table alias="B-10.71c" awr="9.926921" location="1" name="5010.71c" path="293.6K/B_010_293.6K.ace" temperature="2.53e-08" zaid="5010"/>
|
||||
<ace_table alias="B-11.71c" awr="10.9147" location="1" name="5011.71c" path="293.6K/B_011_293.6K.ace" temperature="2.53e-08" zaid="5011"/>
|
||||
<ace_table alias="C-Nat.71c" awr="11.898" location="1" name="6000.71c" path="293.6K/C_000_293.6K.ace" temperature="2.53e-08" zaid="6000"/>
|
||||
<ace_table alias="N-14.71c" awr="13.88278" location="1" name="7014.71c" path="293.6K/N_014_293.6K.ace" temperature="2.53e-08" zaid="7014"/>
|
||||
<ace_table alias="N-15.71c" awr="14.871" location="1" name="7015.71c" path="293.6K/N_015_293.6K.ace" temperature="2.53e-08" zaid="7015"/>
|
||||
<ace_table alias="O-16.71c" awr="15.85751" location="1" name="8016.71c" path="293.6K/O_016_293.6K.ace" temperature="2.53e-08" zaid="8016"/>
|
||||
<ace_table alias="O-17.71c" awr="16.8531" location="1" name="8017.71c" path="293.6K/O_017_293.6K.ace" temperature="2.53e-08" zaid="8017"/>
|
||||
<ace_table alias="F-19.71c" awr="18.835" location="1" name="9019.71c" path="293.6K/F_019_293.6K.ace" temperature="2.53e-08" zaid="9019"/>
|
||||
<ace_table alias="Na-22.71c" awr="21.8055" location="1" name="11022.71c" path="293.6K/Na_022_293.6K.ace" temperature="2.53e-08" zaid="11022"/>
|
||||
<ace_table alias="Na-23.71c" awr="22.792" location="1" name="11023.71c" path="293.6K/Na_023_293.6K.ace" temperature="2.53e-08" zaid="11023"/>
|
||||
<ace_table alias="Mg-24.71c" awr="23.779" location="1" name="12024.71c" path="293.6K/Mg_024_293.6K.ace" temperature="2.53e-08" zaid="12024"/>
|
||||
<ace_table alias="Mg-25.71c" awr="24.7712" location="1" name="12025.71c" path="293.6K/Mg_025_293.6K.ace" temperature="2.53e-08" zaid="12025"/>
|
||||
<ace_table alias="Mg-26.71c" awr="25.7594" location="1" name="12026.71c" path="293.6K/Mg_026_293.6K.ace" temperature="2.53e-08" zaid="12026"/>
|
||||
<ace_table alias="Al-27.71c" awr="26.74975" location="1" name="13027.71c" path="293.6K/Al_027_293.6K.ace" temperature="2.53e-08" zaid="13027"/>
|
||||
<ace_table alias="Si-28.71c" awr="27.737" location="1" name="14028.71c" path="293.6K/Si_028_293.6K.ace" temperature="2.53e-08" zaid="14028"/>
|
||||
<ace_table alias="Si-29.71c" awr="28.728" location="1" name="14029.71c" path="293.6K/Si_029_293.6K.ace" temperature="2.53e-08" zaid="14029"/>
|
||||
<ace_table alias="Si-30.71c" awr="29.716" location="1" name="14030.71c" path="293.6K/Si_030_293.6K.ace" temperature="2.53e-08" zaid="14030"/>
|
||||
<ace_table alias="P-31.71c" awr="30.708" location="1" name="15031.71c" path="293.6K/P_031_293.6K.ace" temperature="2.53e-08" zaid="15031"/>
|
||||
<ace_table alias="S-32.71c" awr="31.6973" location="1" name="16032.71c" path="293.6K/S_032_293.6K.ace" temperature="2.53e-08" zaid="16032"/>
|
||||
<ace_table alias="S-33.71c" awr="32.6878" location="1" name="16033.71c" path="293.6K/S_033_293.6K.ace" temperature="2.53e-08" zaid="16033"/>
|
||||
<ace_table alias="S-34.71c" awr="33.6762" location="1" name="16034.71c" path="293.6K/S_034_293.6K.ace" temperature="2.53e-08" zaid="16034"/>
|
||||
<ace_table alias="S-36.71c" awr="35.658" location="1" name="16036.71c" path="293.6K/S_036_293.6K.ace" temperature="2.53e-08" zaid="16036"/>
|
||||
<ace_table alias="Cl-35.71c" awr="34.66845" location="1" name="17035.71c" path="293.6K/Cl_035_293.6K.ace" temperature="2.53e-08" zaid="17035"/>
|
||||
<ace_table alias="Cl-37.71c" awr="36.6483" location="1" name="17037.71c" path="293.6K/Cl_037_293.6K.ace" temperature="2.53e-08" zaid="17037"/>
|
||||
<ace_table alias="Ar-36.71c" awr="35.6585" location="1" name="18036.71c" path="293.6K/Ar_036_293.6K.ace" temperature="2.53e-08" zaid="18036"/>
|
||||
<ace_table alias="Ar-38.71c" awr="37.6366" location="1" name="18038.71c" path="293.6K/Ar_038_293.6K.ace" temperature="2.53e-08" zaid="18038"/>
|
||||
<ace_table alias="Ar-40.71c" awr="39.6191" location="1" name="18040.71c" path="293.6K/Ar_040_293.6K.ace" temperature="2.53e-08" zaid="18040"/>
|
||||
<ace_table alias="K-39.71c" awr="38.6293" location="1" name="19039.71c" path="293.6K/K_039_293.6K.ace" temperature="2.53e-08" zaid="19039"/>
|
||||
<ace_table alias="K-40.71c" awr="39.6207" location="1" name="19040.71c" path="293.6K/K_040_293.6K.ace" temperature="2.53e-08" zaid="19040"/>
|
||||
<ace_table alias="K-41.71c" awr="40.6101" location="1" name="19041.71c" path="293.6K/K_041_293.6K.ace" temperature="2.53e-08" zaid="19041"/>
|
||||
<ace_table alias="Ca-40.71c" awr="39.6193" location="1" name="20040.71c" path="293.6K/Ca_040_293.6K.ace" temperature="2.53e-08" zaid="20040"/>
|
||||
<ace_table alias="Ca-42.71c" awr="41.59818" location="1" name="20042.71c" path="293.6K/Ca_042_293.6K.ace" temperature="2.53e-08" zaid="20042"/>
|
||||
<ace_table alias="Ca-43.71c" awr="42.58973" location="1" name="20043.71c" path="293.6K/Ca_043_293.6K.ace" temperature="2.53e-08" zaid="20043"/>
|
||||
<ace_table alias="Ca-44.71c" awr="43.57788" location="1" name="20044.71c" path="293.6K/Ca_044_293.6K.ace" temperature="2.53e-08" zaid="20044"/>
|
||||
<ace_table alias="Ca-46.71c" awr="45.55893" location="1" name="20046.71c" path="293.6K/Ca_046_293.6K.ace" temperature="2.53e-08" zaid="20046"/>
|
||||
<ace_table alias="Ca-48.71c" awr="47.5406" location="1" name="20048.71c" path="293.6K/Ca_048_293.6K.ace" temperature="2.53e-08" zaid="20048"/>
|
||||
<ace_table alias="Sc-45.71c" awr="44.5679" location="1" name="21045.71c" path="293.6K/Sc_045_293.6K.ace" temperature="2.53e-08" zaid="21045"/>
|
||||
<ace_table alias="Ti-46.71c" awr="45.5579" location="1" name="22046.71c" path="293.6K/Ti_046_293.6K.ace" temperature="2.53e-08" zaid="22046"/>
|
||||
<ace_table alias="Ti-47.71c" awr="46.5484" location="1" name="22047.71c" path="293.6K/Ti_047_293.6K.ace" temperature="2.53e-08" zaid="22047"/>
|
||||
<ace_table alias="Ti-48.71c" awr="47.5361" location="1" name="22048.71c" path="293.6K/Ti_048_293.6K.ace" temperature="2.53e-08" zaid="22048"/>
|
||||
<ace_table alias="Ti-49.71c" awr="48.5274" location="1" name="22049.71c" path="293.6K/Ti_049_293.6K.ace" temperature="2.53e-08" zaid="22049"/>
|
||||
<ace_table alias="Ti-50.71c" awr="49.5157" location="1" name="22050.71c" path="293.6K/Ti_050_293.6K.ace" temperature="2.53e-08" zaid="22050"/>
|
||||
<ace_table alias="V-50.71c" awr="49.5181" location="1" name="23050.71c" path="293.6K/V_050_293.6K.ace" temperature="2.53e-08" zaid="23050"/>
|
||||
<ace_table alias="V-51.71c" awr="50.5063" location="1" name="23051.71c" path="293.6K/V_051_293.6K.ace" temperature="2.53e-08" zaid="23051"/>
|
||||
<ace_table alias="Cr-50.71c" awr="49.517" location="1" name="24050.71c" path="293.6K/Cr_050_293.6K.ace" temperature="2.53e-08" zaid="24050"/>
|
||||
<ace_table alias="Cr-52.71c" awr="51.494" location="1" name="24052.71c" path="293.6K/Cr_052_293.6K.ace" temperature="2.53e-08" zaid="24052"/>
|
||||
<ace_table alias="Cr-53.71c" awr="52.486" location="1" name="24053.71c" path="293.6K/Cr_053_293.6K.ace" temperature="2.53e-08" zaid="24053"/>
|
||||
<ace_table alias="Cr-54.71c" awr="53.476" location="1" name="24054.71c" path="293.6K/Cr_054_293.6K.ace" temperature="2.53e-08" zaid="24054"/>
|
||||
<ace_table alias="Mn-55.71c" awr="54.4661" location="1" name="25055.71c" path="293.6K/Mn_055_293.6K.ace" temperature="2.53e-08" zaid="25055"/>
|
||||
<ace_table alias="Fe-54.71c" awr="53.476" location="1" name="26054.71c" path="293.6K/Fe_054_293.6K.ace" temperature="2.53e-08" zaid="26054"/>
|
||||
<ace_table alias="Fe-56.71c" awr="55.454" location="1" name="26056.71c" path="293.6K/Fe_056_293.6K.ace" temperature="2.53e-08" zaid="26056"/>
|
||||
<ace_table alias="Fe-57.71c" awr="56.446" location="1" name="26057.71c" path="293.6K/Fe_057_293.6K.ace" temperature="2.53e-08" zaid="26057"/>
|
||||
<ace_table alias="Fe-58.71c" awr="57.436" location="1" name="26058.71c" path="293.6K/Fe_058_293.6K.ace" temperature="2.53e-08" zaid="26058"/>
|
||||
<ace_table alias="Co-58.71c" awr="57.4381" location="1" name="27058.71c" path="293.6K/Co_058_293.6K.ace" temperature="2.53e-08" zaid="27058"/>
|
||||
<ace_table alias="Co-58m.71c" awr="57.4381" location="1" metastable="1" name="27458.71c" path="293.6K/Co_058m1_293.6K.ace" temperature="2.53e-08" zaid="27458"/>
|
||||
<ace_table alias="Co-59.71c" awr="58.4269" location="1" name="27059.71c" path="293.6K/Co_059_293.6K.ace" temperature="2.53e-08" zaid="27059"/>
|
||||
<ace_table alias="Ni-58.71c" awr="57.438" location="1" name="28058.71c" path="293.6K/Ni_058_293.6K.ace" temperature="2.53e-08" zaid="28058"/>
|
||||
<ace_table alias="Ni-59.71c" awr="58.4281" location="1" name="28059.71c" path="293.6K/Ni_059_293.6K.ace" temperature="2.53e-08" zaid="28059"/>
|
||||
<ace_table alias="Ni-60.71c" awr="59.416" location="1" name="28060.71c" path="293.6K/Ni_060_293.6K.ace" temperature="2.53e-08" zaid="28060"/>
|
||||
<ace_table alias="Ni-61.71c" awr="60.408" location="1" name="28061.71c" path="293.6K/Ni_061_293.6K.ace" temperature="2.53e-08" zaid="28061"/>
|
||||
<ace_table alias="Ni-62.71c" awr="61.396" location="1" name="28062.71c" path="293.6K/Ni_062_293.6K.ace" temperature="2.53e-08" zaid="28062"/>
|
||||
<ace_table alias="Ni-64.71c" awr="63.379" location="1" name="28064.71c" path="293.6K/Ni_064_293.6K.ace" temperature="2.53e-08" zaid="28064"/>
|
||||
<ace_table alias="Cu-63.71c" awr="62.389" location="1" name="29063.71c" path="293.6K/Cu_063_293.6K.ace" temperature="2.53e-08" zaid="29063"/>
|
||||
<ace_table alias="Cu-65.71c" awr="64.37" location="1" name="29065.71c" path="293.6K/Cu_065_293.6K.ace" temperature="2.53e-08" zaid="29065"/>
|
||||
<ace_table alias="Zn-64.71c" awr="63.38" location="1" name="30064.71c" path="293.6K/Zn_064_293.6K.ace" temperature="2.53e-08" zaid="30064"/>
|
||||
<ace_table alias="Zn-65.71c" awr="64.3715" location="1" name="30065.71c" path="293.6K/Zn_065_293.6K.ace" temperature="2.53e-08" zaid="30065"/>
|
||||
<ace_table alias="Zn-66.71c" awr="65.3597" location="1" name="30066.71c" path="293.6K/Zn_066_293.6K.ace" temperature="2.53e-08" zaid="30066"/>
|
||||
<ace_table alias="Zn-67.71c" awr="66.3522" location="1" name="30067.71c" path="293.6K/Zn_067_293.6K.ace" temperature="2.53e-08" zaid="30067"/>
|
||||
<ace_table alias="Zn-68.71c" awr="67.3413" location="1" name="30068.71c" path="293.6K/Zn_068_293.6K.ace" temperature="2.53e-08" zaid="30068"/>
|
||||
<ace_table alias="Zn-70.71c" awr="69.3246" location="1" name="30070.71c" path="293.6K/Zn_070_293.6K.ace" temperature="2.53e-08" zaid="30070"/>
|
||||
<ace_table alias="Ga-69.71c" awr="68.3336" location="1" name="31069.71c" path="293.6K/Ga_069_293.6K.ace" temperature="2.53e-08" zaid="31069"/>
|
||||
<ace_table alias="Ga-71.71c" awr="70.315" location="1" name="31071.71c" path="293.6K/Ga_071_293.6K.ace" temperature="2.53e-08" zaid="31071"/>
|
||||
<ace_table alias="Ge-70.71c" awr="69.3236" location="1" name="32070.71c" path="293.6K/Ge_070_293.6K.ace" temperature="2.53e-08" zaid="32070"/>
|
||||
<ace_table alias="Ge-72.71c" awr="71.3042" location="1" name="32072.71c" path="293.6K/Ge_072_293.6K.ace" temperature="2.53e-08" zaid="32072"/>
|
||||
<ace_table alias="Ge-73.71c" awr="72.297" location="1" name="32073.71c" path="293.6K/Ge_073_293.6K.ace" temperature="2.53e-08" zaid="32073"/>
|
||||
<ace_table alias="Ge-74.71c" awr="73.2862" location="1" name="32074.71c" path="293.6K/Ge_074_293.6K.ace" temperature="2.53e-08" zaid="32074"/>
|
||||
<ace_table alias="Ge-76.71c" awr="75.2692" location="1" name="32076.71c" path="293.6K/Ge_076_293.6K.ace" temperature="2.53e-08" zaid="32076"/>
|
||||
<ace_table alias="As-74.71c" awr="73.2889" location="1" name="33074.71c" path="293.6K/As_074_293.6K.ace" temperature="2.53e-08" zaid="33074"/>
|
||||
<ace_table alias="As-75.71c" awr="74.278" location="1" name="33075.71c" path="293.6K/As_075_293.6K.ace" temperature="2.53e-08" zaid="33075"/>
|
||||
<ace_table alias="Se-74.71c" awr="73.2875" location="1" name="34074.71c" path="293.6K/Se_074_293.6K.ace" temperature="2.53e-08" zaid="34074"/>
|
||||
<ace_table alias="Se-76.71c" awr="75.267" location="1" name="34076.71c" path="293.6K/Se_076_293.6K.ace" temperature="2.53e-08" zaid="34076"/>
|
||||
<ace_table alias="Se-77.71c" awr="76.2591" location="1" name="34077.71c" path="293.6K/Se_077_293.6K.ace" temperature="2.53e-08" zaid="34077"/>
|
||||
<ace_table alias="Se-78.71c" awr="77.2479" location="1" name="34078.71c" path="293.6K/Se_078_293.6K.ace" temperature="2.53e-08" zaid="34078"/>
|
||||
<ace_table alias="Se-79.71c" awr="78.2405" location="1" name="34079.71c" path="293.6K/Se_079_293.6K.ace" temperature="2.53e-08" zaid="34079"/>
|
||||
<ace_table alias="Se-80.71c" awr="79.23" location="1" name="34080.71c" path="293.6K/Se_080_293.6K.ace" temperature="2.53e-08" zaid="34080"/>
|
||||
<ace_table alias="Se-82.71c" awr="81.213" location="1" name="34082.71c" path="293.6K/Se_082_293.6K.ace" temperature="2.53e-08" zaid="34082"/>
|
||||
<ace_table alias="Br-79.71c" awr="78.2403" location="1" name="35079.71c" path="293.6K/Br_079_293.6K.ace" temperature="2.53e-08" zaid="35079"/>
|
||||
<ace_table alias="Br-81.71c" awr="80.2212" location="1" name="35081.71c" path="293.6K/Br_081_293.6K.ace" temperature="2.53e-08" zaid="35081"/>
|
||||
<ace_table alias="Kr-78.71c" awr="77.25099" location="1" name="36078.71c" path="293.6K/Kr_078_293.6K.ace" temperature="2.53e-08" zaid="36078"/>
|
||||
<ace_table alias="Kr-80.71c" awr="79.2299" location="1" name="36080.71c" path="293.6K/Kr_080_293.6K.ace" temperature="2.53e-08" zaid="36080"/>
|
||||
<ace_table alias="Kr-82.71c" awr="81.2098" location="1" name="36082.71c" path="293.6K/Kr_082_293.6K.ace" temperature="2.53e-08" zaid="36082"/>
|
||||
<ace_table alias="Kr-83.71c" awr="82.202" location="1" name="36083.71c" path="293.6K/Kr_083_293.6K.ace" temperature="2.53e-08" zaid="36083"/>
|
||||
<ace_table alias="Kr-84.71c" awr="83.1907" location="1" name="36084.71c" path="293.6K/Kr_084_293.6K.ace" temperature="2.53e-08" zaid="36084"/>
|
||||
<ace_table alias="Kr-85.71c" awr="84.1831" location="1" name="36085.71c" path="293.6K/Kr_085_293.6K.ace" temperature="2.53e-08" zaid="36085"/>
|
||||
<ace_table alias="Kr-86.71c" awr="85.1726" location="1" name="36086.71c" path="293.6K/Kr_086_293.6K.ace" temperature="2.53e-08" zaid="36086"/>
|
||||
<ace_table alias="Rb-85.71c" awr="84.1824" location="1" name="37085.71c" path="293.6K/Rb_085_293.6K.ace" temperature="2.53e-08" zaid="37085"/>
|
||||
<ace_table alias="Rb-86.71c" awr="85.1731" location="1" name="37086.71c" path="293.6K/Rb_086_293.6K.ace" temperature="2.53e-08" zaid="37086"/>
|
||||
<ace_table alias="Rb-87.71c" awr="86.1626" location="1" name="37087.71c" path="293.6K/Rb_087_293.6K.ace" temperature="2.53e-08" zaid="37087"/>
|
||||
<ace_table alias="Sr-84.71c" awr="83.1926" location="1" name="38084.71c" path="293.6K/Sr_084_293.6K.ace" temperature="2.53e-08" zaid="38084"/>
|
||||
<ace_table alias="Sr-86.71c" awr="85.1713" location="1" name="38086.71c" path="293.6K/Sr_086_293.6K.ace" temperature="2.53e-08" zaid="38086"/>
|
||||
<ace_table alias="Sr-87.71c" awr="86.1623" location="1" name="38087.71c" path="293.6K/Sr_087_293.6K.ace" temperature="2.53e-08" zaid="38087"/>
|
||||
<ace_table alias="Sr-88.71c" awr="87.15" location="1" name="38088.71c" path="293.6K/Sr_088_293.6K.ace" temperature="2.53e-08" zaid="38088"/>
|
||||
<ace_table alias="Sr-89.71c" awr="88.144" location="1" name="38089.71c" path="293.6K/Sr_089_293.6K.ace" temperature="2.53e-08" zaid="38089"/>
|
||||
<ace_table alias="Sr-90.71c" awr="89.1353" location="1" name="38090.71c" path="293.6K/Sr_090_293.6K.ace" temperature="2.53e-08" zaid="38090"/>
|
||||
<ace_table alias="Y-89.71c" awr="88.1421" location="1" name="39089.71c" path="293.6K/Y_089_293.6K.ace" temperature="2.53e-08" zaid="39089"/>
|
||||
<ace_table alias="Y-90.71c" awr="89.1348" location="1" name="39090.71c" path="293.6K/Y_090_293.6K.ace" temperature="2.53e-08" zaid="39090"/>
|
||||
<ace_table alias="Y-91.71c" awr="90.1264" location="1" name="39091.71c" path="293.6K/Y_091_293.6K.ace" temperature="2.53e-08" zaid="39091"/>
|
||||
<ace_table alias="Zr-90.71c" awr="89.1324" location="1" name="40090.71c" path="293.6K/Zr_090_293.6K.ace" temperature="2.53e-08" zaid="40090"/>
|
||||
<ace_table alias="Zr-91.71c" awr="90.1247" location="1" name="40091.71c" path="293.6K/Zr_091_293.6K.ace" temperature="2.53e-08" zaid="40091"/>
|
||||
<ace_table alias="Zr-92.71c" awr="91.1155" location="1" name="40092.71c" path="293.6K/Zr_092_293.6K.ace" temperature="2.53e-08" zaid="40092"/>
|
||||
<ace_table alias="Zr-93.71c" awr="92.1084" location="1" name="40093.71c" path="293.6K/Zr_093_293.6K.ace" temperature="2.53e-08" zaid="40093"/>
|
||||
<ace_table alias="Zr-94.71c" awr="93.0996" location="1" name="40094.71c" path="293.6K/Zr_094_293.6K.ace" temperature="2.53e-08" zaid="40094"/>
|
||||
<ace_table alias="Zr-95.71c" awr="94.0927" location="1" name="40095.71c" path="293.6K/Zr_095_293.6K.ace" temperature="2.53e-08" zaid="40095"/>
|
||||
<ace_table alias="Zr-96.71c" awr="95.0844" location="1" name="40096.71c" path="293.6K/Zr_096_293.6K.ace" temperature="2.53e-08" zaid="40096"/>
|
||||
<ace_table alias="Nb-93.71c" awr="92.1051" location="1" name="41093.71c" path="293.6K/Nb_093_293.6K.ace" temperature="2.53e-08" zaid="41093"/>
|
||||
<ace_table alias="Nb-94.71c" awr="93.1006" location="1" name="41094.71c" path="293.6K/Nb_094_293.6K.ace" temperature="2.53e-08" zaid="41094"/>
|
||||
<ace_table alias="Nb-95.71c" awr="94.0915" location="1" name="41095.71c" path="293.6K/Nb_095_293.6K.ace" temperature="2.53e-08" zaid="41095"/>
|
||||
<ace_table alias="Mo-92.71c" awr="91.1173" location="1" name="42092.71c" path="293.6K/Mo_092_293.6K.ace" temperature="2.53e-08" zaid="42092"/>
|
||||
<ace_table alias="Mo-94.71c" awr="93.0984" location="1" name="42094.71c" path="293.6K/Mo_094_293.6K.ace" temperature="2.53e-08" zaid="42094"/>
|
||||
<ace_table alias="Mo-95.71c" awr="94.0906" location="1" name="42095.71c" path="293.6K/Mo_095_293.6K.ace" temperature="2.53e-08" zaid="42095"/>
|
||||
<ace_table alias="Mo-96.71c" awr="95.0808" location="1" name="42096.71c" path="293.6K/Mo_096_293.6K.ace" temperature="2.53e-08" zaid="42096"/>
|
||||
<ace_table alias="Mo-97.71c" awr="96.0735" location="1" name="42097.71c" path="293.6K/Mo_097_293.6K.ace" temperature="2.53e-08" zaid="42097"/>
|
||||
<ace_table alias="Mo-98.71c" awr="97.0643" location="1" name="42098.71c" path="293.6K/Mo_098_293.6K.ace" temperature="2.53e-08" zaid="42098"/>
|
||||
<ace_table alias="Mo-99.71c" awr="98.058" location="1" name="42099.71c" path="293.6K/Mo_099_293.6K.ace" temperature="2.53e-08" zaid="42099"/>
|
||||
<ace_table alias="Mo-100.71c" awr="99.049" location="1" name="42100.71c" path="293.6K/Mo_100_293.6K.ace" temperature="2.53e-08" zaid="42100"/>
|
||||
<ace_table alias="Tc-99.71c" awr="98.0566" location="1" name="43099.71c" path="293.6K/Tc_099_293.6K.ace" temperature="2.53e-08" zaid="43099"/>
|
||||
<ace_table alias="Ru-96.71c" awr="95.0837" location="1" name="44096.71c" path="293.6K/Ru_096_293.6K.ace" temperature="2.53e-08" zaid="44096"/>
|
||||
<ace_table alias="Ru-98.71c" awr="97.0642" location="1" name="44098.71c" path="293.6K/Ru_098_293.6K.ace" temperature="2.53e-08" zaid="44098"/>
|
||||
<ace_table alias="Ru-99.71c" awr="98.0562" location="1" name="44099.71c" path="293.6K/Ru_099_293.6K.ace" temperature="2.53e-08" zaid="44099"/>
|
||||
<ace_table alias="Ru-100.71c" awr="99.046" location="1" name="44100.71c" path="293.6K/Ru_100_293.6K.ace" temperature="2.53e-08" zaid="44100"/>
|
||||
<ace_table alias="Ru-101.71c" awr="100.039" location="1" name="44101.71c" path="293.6K/Ru_101_293.6K.ace" temperature="2.53e-08" zaid="44101"/>
|
||||
<ace_table alias="Ru-102.71c" awr="101.03" location="1" name="44102.71c" path="293.6K/Ru_102_293.6K.ace" temperature="2.53e-08" zaid="44102"/>
|
||||
<ace_table alias="Ru-103.71c" awr="102.02" location="1" name="44103.71c" path="293.6K/Ru_103_293.6K.ace" temperature="2.53e-08" zaid="44103"/>
|
||||
<ace_table alias="Ru-104.71c" awr="103.01" location="1" name="44104.71c" path="293.6K/Ru_104_293.6K.ace" temperature="2.53e-08" zaid="44104"/>
|
||||
<ace_table alias="Ru-105.71c" awr="104.01" location="1" name="44105.71c" path="293.6K/Ru_105_293.6K.ace" temperature="2.53e-08" zaid="44105"/>
|
||||
<ace_table alias="Ru-106.71c" awr="104.997" location="1" name="44106.71c" path="293.6K/Ru_106_293.6K.ace" temperature="2.53e-08" zaid="44106"/>
|
||||
<ace_table alias="Rh-103.71c" awr="102.021" location="1" name="45103.71c" path="293.6K/Rh_103_293.6K.ace" temperature="2.53e-08" zaid="45103"/>
|
||||
<ace_table alias="Rh-105.71c" awr="104.0" location="1" name="45105.71c" path="293.6K/Rh_105_293.6K.ace" temperature="2.53e-08" zaid="45105"/>
|
||||
<ace_table alias="Pd-102.71c" awr="101.0302" location="1" name="46102.71c" path="293.6K/Pd_102_293.6K.ace" temperature="2.53e-08" zaid="46102"/>
|
||||
<ace_table alias="Pd-104.71c" awr="103.0114" location="1" name="46104.71c" path="293.6K/Pd_104_293.6K.ace" temperature="2.53e-08" zaid="46104"/>
|
||||
<ace_table alias="Pd-105.71c" awr="104.004" location="1" name="46105.71c" path="293.6K/Pd_105_293.6K.ace" temperature="2.53e-08" zaid="46105"/>
|
||||
<ace_table alias="Pd-106.71c" awr="104.9937" location="1" name="46106.71c" path="293.6K/Pd_106_293.6K.ace" temperature="2.53e-08" zaid="46106"/>
|
||||
<ace_table alias="Pd-107.71c" awr="105.987" location="1" name="46107.71c" path="293.6K/Pd_107_293.6K.ace" temperature="2.53e-08" zaid="46107"/>
|
||||
<ace_table alias="Pd-108.71c" awr="106.9769" location="1" name="46108.71c" path="293.6K/Pd_108_293.6K.ace" temperature="2.53e-08" zaid="46108"/>
|
||||
<ace_table alias="Pd-110.71c" awr="108.961" location="1" name="46110.71c" path="293.6K/Pd_110_293.6K.ace" temperature="2.53e-08" zaid="46110"/>
|
||||
<ace_table alias="Ag-107.71c" awr="105.987" location="1" name="47107.71c" path="293.6K/Ag_107_293.6K.ace" temperature="2.53e-08" zaid="47107"/>
|
||||
<ace_table alias="Ag-109.71c" awr="107.969" location="1" name="47109.71c" path="293.6K/Ag_109_293.6K.ace" temperature="2.53e-08" zaid="47109"/>
|
||||
<ace_table alias="Ag-110m.71c" awr="108.962" location="1" metastable="1" name="47510.71c" path="293.6K/Ag_110m1_293.6K.ace" temperature="2.53e-08" zaid="47510"/>
|
||||
<ace_table alias="Ag-111.71c" awr="109.953" location="1" name="47111.71c" path="293.6K/Ag_111_293.6K.ace" temperature="2.53e-08" zaid="47111"/>
|
||||
<ace_table alias="Cd-106.71c" awr="104.996" location="1" name="48106.71c" path="293.6K/Cd_106_293.6K.ace" temperature="2.53e-08" zaid="48106"/>
|
||||
<ace_table alias="Cd-108.71c" awr="106.977" location="1" name="48108.71c" path="293.6K/Cd_108_293.6K.ace" temperature="2.53e-08" zaid="48108"/>
|
||||
<ace_table alias="Cd-110.71c" awr="108.959" location="1" name="48110.71c" path="293.6K/Cd_110_293.6K.ace" temperature="2.53e-08" zaid="48110"/>
|
||||
<ace_table alias="Cd-111.71c" awr="109.951" location="1" name="48111.71c" path="293.6K/Cd_111_293.6K.ace" temperature="2.53e-08" zaid="48111"/>
|
||||
<ace_table alias="Cd-112.71c" awr="110.942" location="1" name="48112.71c" path="293.6K/Cd_112_293.6K.ace" temperature="2.53e-08" zaid="48112"/>
|
||||
<ace_table alias="Cd-113.71c" awr="111.93" location="1" name="48113.71c" path="293.6K/Cd_113_293.6K.ace" temperature="2.53e-08" zaid="48113"/>
|
||||
<ace_table alias="Cd-114.71c" awr="112.925" location="1" name="48114.71c" path="293.6K/Cd_114_293.6K.ace" temperature="2.53e-08" zaid="48114"/>
|
||||
<ace_table alias="Cd-115m.71c" awr="113.918" location="1" metastable="1" name="48515.71c" path="293.6K/Cd_115m1_293.6K.ace" temperature="2.53e-08" zaid="48515"/>
|
||||
<ace_table alias="Cd-116.71c" awr="114.909" location="1" name="48116.71c" path="293.6K/Cd_116_293.6K.ace" temperature="2.53e-08" zaid="48116"/>
|
||||
<ace_table alias="In-113.71c" awr="111.934" location="1" name="49113.71c" path="293.6K/In_113_293.6K.ace" temperature="2.53e-08" zaid="49113"/>
|
||||
<ace_table alias="In-115.71c" awr="113.917" location="1" name="49115.71c" path="293.6K/In_115_293.6K.ace" temperature="2.53e-08" zaid="49115"/>
|
||||
<ace_table alias="Sn-112.71c" awr="110.944" location="1" name="50112.71c" path="293.6K/Sn_112_293.6K.ace" temperature="2.53e-08" zaid="50112"/>
|
||||
<ace_table alias="Sn-113.71c" awr="111.935" location="1" name="50113.71c" path="293.6K/Sn_113_293.6K.ace" temperature="2.53e-08" zaid="50113"/>
|
||||
<ace_table alias="Sn-114.71c" awr="112.925" location="1" name="50114.71c" path="293.6K/Sn_114_293.6K.ace" temperature="2.53e-08" zaid="50114"/>
|
||||
<ace_table alias="Sn-115.71c" awr="113.916" location="1" name="50115.71c" path="293.6K/Sn_115_293.6K.ace" temperature="2.53e-08" zaid="50115"/>
|
||||
<ace_table alias="Sn-116.71c" awr="114.906" location="1" name="50116.71c" path="293.6K/Sn_116_293.6K.ace" temperature="2.53e-08" zaid="50116"/>
|
||||
<ace_table alias="Sn-117.71c" awr="115.899" location="1" name="50117.71c" path="293.6K/Sn_117_293.6K.ace" temperature="2.53e-08" zaid="50117"/>
|
||||
<ace_table alias="Sn-118.71c" awr="116.889" location="1" name="50118.71c" path="293.6K/Sn_118_293.6K.ace" temperature="2.53e-08" zaid="50118"/>
|
||||
<ace_table alias="Sn-119.71c" awr="117.882" location="1" name="50119.71c" path="293.6K/Sn_119_293.6K.ace" temperature="2.53e-08" zaid="50119"/>
|
||||
<ace_table alias="Sn-120.71c" awr="118.872" location="1" name="50120.71c" path="293.6K/Sn_120_293.6K.ace" temperature="2.53e-08" zaid="50120"/>
|
||||
<ace_table alias="Sn-122.71c" awr="120.856" location="1" name="50122.71c" path="293.6K/Sn_122_293.6K.ace" temperature="2.53e-08" zaid="50122"/>
|
||||
<ace_table alias="Sn-123.71c" awr="121.85" location="1" name="50123.71c" path="293.6K/Sn_123_293.6K.ace" temperature="2.53e-08" zaid="50123"/>
|
||||
<ace_table alias="Sn-124.71c" awr="122.841" location="1" name="50124.71c" path="293.6K/Sn_124_293.6K.ace" temperature="2.53e-08" zaid="50124"/>
|
||||
<ace_table alias="Sn-125.71c" awr="123.835" location="1" name="50125.71c" path="293.6K/Sn_125_293.6K.ace" temperature="2.53e-08" zaid="50125"/>
|
||||
<ace_table alias="Sn-126.71c" awr="124.826" location="1" name="50126.71c" path="293.6K/Sn_126_293.6K.ace" temperature="2.53e-08" zaid="50126"/>
|
||||
<ace_table alias="Sb-121.71c" awr="119.87" location="1" name="51121.71c" path="293.6K/Sb_121_293.6K.ace" temperature="2.53e-08" zaid="51121"/>
|
||||
<ace_table alias="Sb-123.71c" awr="121.85" location="1" name="51123.71c" path="293.6K/Sb_123_293.6K.ace" temperature="2.53e-08" zaid="51123"/>
|
||||
<ace_table alias="Sb-124.71c" awr="122.842" location="1" name="51124.71c" path="293.6K/Sb_124_293.6K.ace" temperature="2.53e-08" zaid="51124"/>
|
||||
<ace_table alias="Sb-125.71c" awr="123.832" location="1" name="51125.71c" path="293.6K/Sb_125_293.6K.ace" temperature="2.53e-08" zaid="51125"/>
|
||||
<ace_table alias="Sb-126.71c" awr="124.826" location="1" name="51126.71c" path="293.6K/Sb_126_293.6K.ace" temperature="2.53e-08" zaid="51126"/>
|
||||
<ace_table alias="Te-120.71c" awr="118.874" location="1" name="52120.71c" path="293.6K/Te_120_293.6K.ace" temperature="2.53e-08" zaid="52120"/>
|
||||
<ace_table alias="Te-122.71c" awr="120.856" location="1" name="52122.71c" path="293.6K/Te_122_293.6K.ace" temperature="2.53e-08" zaid="52122"/>
|
||||
<ace_table alias="Te-123.71c" awr="121.848" location="1" name="52123.71c" path="293.6K/Te_123_293.6K.ace" temperature="2.53e-08" zaid="52123"/>
|
||||
<ace_table alias="Te-124.71c" awr="122.839" location="1" name="52124.71c" path="293.6K/Te_124_293.6K.ace" temperature="2.53e-08" zaid="52124"/>
|
||||
<ace_table alias="Te-125.71c" awr="123.831" location="1" name="52125.71c" path="293.6K/Te_125_293.6K.ace" temperature="2.53e-08" zaid="52125"/>
|
||||
<ace_table alias="Te-126.71c" awr="124.821" location="1" name="52126.71c" path="293.6K/Te_126_293.6K.ace" temperature="2.53e-08" zaid="52126"/>
|
||||
<ace_table alias="Te-127m.71c" awr="125.815" location="1" metastable="1" name="52527.71c" path="293.6K/Te_127m1_293.6K.ace" temperature="2.53e-08" zaid="52527"/>
|
||||
<ace_table alias="Te-128.71c" awr="126.805" location="1" name="52128.71c" path="293.6K/Te_128_293.6K.ace" temperature="2.53e-08" zaid="52128"/>
|
||||
<ace_table alias="Te-129m.71c" awr="127.8" location="1" metastable="1" name="52529.71c" path="293.6K/Te_129m1_293.6K.ace" temperature="2.53e-08" zaid="52529"/>
|
||||
<ace_table alias="Te-130.71c" awr="128.79" location="1" name="52130.71c" path="293.6K/Te_130_293.6K.ace" temperature="2.53e-08" zaid="52130"/>
|
||||
<ace_table alias="Te-132.71c" awr="130.775" location="1" name="52132.71c" path="293.6K/Te_132_293.6K.ace" temperature="2.53e-08" zaid="52132"/>
|
||||
<ace_table alias="I-127.71c" awr="125.8143" location="1" name="53127.71c" path="293.6K/I_127_293.6K.ace" temperature="2.53e-08" zaid="53127"/>
|
||||
<ace_table alias="I-129.71c" awr="127.798" location="1" name="53129.71c" path="293.6K/I_129_293.6K.ace" temperature="2.53e-08" zaid="53129"/>
|
||||
<ace_table alias="I-130.71c" awr="128.791" location="1" name="53130.71c" path="293.6K/I_130_293.6K.ace" temperature="2.53e-08" zaid="53130"/>
|
||||
<ace_table alias="I-131.71c" awr="129.781" location="1" name="53131.71c" path="293.6K/I_131_293.6K.ace" temperature="2.53e-08" zaid="53131"/>
|
||||
<ace_table alias="I-135.71c" awr="133.75" location="1" name="53135.71c" path="293.6K/I_135_293.6K.ace" temperature="2.53e-08" zaid="53135"/>
|
||||
<ace_table alias="Xe-123.71c" awr="121.8526" location="1" name="54123.71c" path="293.6K/Xe_123_293.6K.ace" temperature="2.53e-08" zaid="54123"/>
|
||||
<ace_table alias="Xe-124.71c" awr="122.8415" location="1" name="54124.71c" path="293.6K/Xe_124_293.6K.ace" temperature="2.53e-08" zaid="54124"/>
|
||||
<ace_table alias="Xe-126.71c" awr="124.822" location="1" name="54126.71c" path="293.6K/Xe_126_293.6K.ace" temperature="2.53e-08" zaid="54126"/>
|
||||
<ace_table alias="Xe-128.71c" awr="126.804" location="1" name="54128.71c" path="293.6K/Xe_128_293.6K.ace" temperature="2.53e-08" zaid="54128"/>
|
||||
<ace_table alias="Xe-129.71c" awr="127.798" location="1" name="54129.71c" path="293.6K/Xe_129_293.6K.ace" temperature="2.53e-08" zaid="54129"/>
|
||||
<ace_table alias="Xe-130.71c" awr="128.788" location="1" name="54130.71c" path="293.6K/Xe_130_293.6K.ace" temperature="2.53e-08" zaid="54130"/>
|
||||
<ace_table alias="Xe-131.71c" awr="129.781" location="1" name="54131.71c" path="293.6K/Xe_131_293.6K.ace" temperature="2.53e-08" zaid="54131"/>
|
||||
<ace_table alias="Xe-132.71c" awr="130.77" location="1" name="54132.71c" path="293.6K/Xe_132_293.6K.ace" temperature="2.53e-08" zaid="54132"/>
|
||||
<ace_table alias="Xe-133.71c" awr="131.764" location="1" name="54133.71c" path="293.6K/Xe_133_293.6K.ace" temperature="2.53e-08" zaid="54133"/>
|
||||
<ace_table alias="Xe-134.71c" awr="132.76" location="1" name="54134.71c" path="293.6K/Xe_134_293.6K.ace" temperature="2.53e-08" zaid="54134"/>
|
||||
<ace_table alias="Xe-135.71c" awr="133.748" location="1" name="54135.71c" path="293.6K/Xe_135_293.6K.ace" temperature="2.53e-08" zaid="54135"/>
|
||||
<ace_table alias="Xe-136.71c" awr="134.74" location="1" name="54136.71c" path="293.6K/Xe_136_293.6K.ace" temperature="2.53e-08" zaid="54136"/>
|
||||
<ace_table alias="Cs-133.71c" awr="131.764" location="1" name="55133.71c" path="293.6K/Cs_133_293.6K.ace" temperature="2.53e-08" zaid="55133"/>
|
||||
<ace_table alias="Cs-134.71c" awr="132.757" location="1" name="55134.71c" path="293.6K/Cs_134_293.6K.ace" temperature="2.53e-08" zaid="55134"/>
|
||||
<ace_table alias="Cs-135.71c" awr="133.747" location="1" name="55135.71c" path="293.6K/Cs_135_293.6K.ace" temperature="2.53e-08" zaid="55135"/>
|
||||
<ace_table alias="Cs-136.71c" awr="134.739" location="1" name="55136.71c" path="293.6K/Cs_136_293.6K.ace" temperature="2.53e-08" zaid="55136"/>
|
||||
<ace_table alias="Cs-137.71c" awr="135.731" location="1" name="55137.71c" path="293.6K/Cs_137_293.6K.ace" temperature="2.53e-08" zaid="55137"/>
|
||||
<ace_table alias="Ba-130.71c" awr="128.79" location="1" name="56130.71c" path="293.6K/Ba_130_293.6K.ace" temperature="2.53e-08" zaid="56130"/>
|
||||
<ace_table alias="Ba-132.71c" awr="130.772" location="1" name="56132.71c" path="293.6K/Ba_132_293.6K.ace" temperature="2.53e-08" zaid="56132"/>
|
||||
<ace_table alias="Ba-133.71c" awr="131.764" location="1" name="56133.71c" path="293.6K/Ba_133_293.6K.ace" temperature="2.53e-08" zaid="56133"/>
|
||||
<ace_table alias="Ba-134.71c" awr="132.754" location="1" name="56134.71c" path="293.6K/Ba_134_293.6K.ace" temperature="2.53e-08" zaid="56134"/>
|
||||
<ace_table alias="Ba-135.71c" awr="133.747" location="1" name="56135.71c" path="293.6K/Ba_135_293.6K.ace" temperature="2.53e-08" zaid="56135"/>
|
||||
<ace_table alias="Ba-136.71c" awr="134.737" location="1" name="56136.71c" path="293.6K/Ba_136_293.6K.ace" temperature="2.53e-08" zaid="56136"/>
|
||||
<ace_table alias="Ba-137.71c" awr="135.73" location="1" name="56137.71c" path="293.6K/Ba_137_293.6K.ace" temperature="2.53e-08" zaid="56137"/>
|
||||
<ace_table alias="Ba-138.71c" awr="136.72" location="1" name="56138.71c" path="293.6K/Ba_138_293.6K.ace" temperature="2.53e-08" zaid="56138"/>
|
||||
<ace_table alias="Ba-140.71c" awr="138.708" location="1" name="56140.71c" path="293.6K/Ba_140_293.6K.ace" temperature="2.53e-08" zaid="56140"/>
|
||||
<ace_table alias="La-138.71c" awr="136.722" location="1" name="57138.71c" path="293.6K/La_138_293.6K.ace" temperature="2.53e-08" zaid="57138"/>
|
||||
<ace_table alias="La-139.71c" awr="137.71" location="1" name="57139.71c" path="293.6K/La_139_293.6K.ace" temperature="2.53e-08" zaid="57139"/>
|
||||
<ace_table alias="La-140.71c" awr="138.708" location="1" name="57140.71c" path="293.6K/La_140_293.6K.ace" temperature="2.53e-08" zaid="57140"/>
|
||||
<ace_table alias="Ce-136.71c" awr="134.74" location="1" name="58136.71c" path="293.6K/Ce_136_293.6K.ace" temperature="2.53e-08" zaid="58136"/>
|
||||
<ace_table alias="Ce-138.71c" awr="136.721" location="1" name="58138.71c" path="293.6K/Ce_138_293.6K.ace" temperature="2.53e-08" zaid="58138"/>
|
||||
<ace_table alias="Ce-139.71c" awr="137.713" location="1" name="58139.71c" path="293.6K/Ce_139_293.6K.ace" temperature="2.53e-08" zaid="58139"/>
|
||||
<ace_table alias="Ce-140.71c" awr="138.704" location="1" name="58140.71c" path="293.6K/Ce_140_293.6K.ace" temperature="2.53e-08" zaid="58140"/>
|
||||
<ace_table alias="Ce-141.71c" awr="139.7" location="1" name="58141.71c" path="293.6K/Ce_141_293.6K.ace" temperature="2.53e-08" zaid="58141"/>
|
||||
<ace_table alias="Ce-142.71c" awr="140.69" location="1" name="58142.71c" path="293.6K/Ce_142_293.6K.ace" temperature="2.53e-08" zaid="58142"/>
|
||||
<ace_table alias="Ce-143.71c" awr="141.685" location="1" name="58143.71c" path="293.6K/Ce_143_293.6K.ace" temperature="2.53e-08" zaid="58143"/>
|
||||
<ace_table alias="Ce-144.71c" awr="142.678" location="1" name="58144.71c" path="293.6K/Ce_144_293.6K.ace" temperature="2.53e-08" zaid="58144"/>
|
||||
<ace_table alias="Pr-141.71c" awr="139.697" location="1" name="59141.71c" path="293.6K/Pr_141_293.6K.ace" temperature="2.53e-08" zaid="59141"/>
|
||||
<ace_table alias="Pr-142.71c" awr="140.691" location="1" name="59142.71c" path="293.6K/Pr_142_293.6K.ace" temperature="2.53e-08" zaid="59142"/>
|
||||
<ace_table alias="Pr-143.71c" awr="141.683" location="1" name="59143.71c" path="293.6K/Pr_143_293.6K.ace" temperature="2.53e-08" zaid="59143"/>
|
||||
<ace_table alias="Nd-142.71c" awr="140.689" location="1" name="60142.71c" path="293.6K/Nd_142_293.6K.ace" temperature="2.53e-08" zaid="60142"/>
|
||||
<ace_table alias="Nd-143.71c" awr="141.682" location="1" name="60143.71c" path="293.6K/Nd_143_293.6K.ace" temperature="2.53e-08" zaid="60143"/>
|
||||
<ace_table alias="Nd-144.71c" awr="142.674" location="1" name="60144.71c" path="293.6K/Nd_144_293.6K.ace" temperature="2.53e-08" zaid="60144"/>
|
||||
<ace_table alias="Nd-145.71c" awr="143.668" location="1" name="60145.71c" path="293.6K/Nd_145_293.6K.ace" temperature="2.53e-08" zaid="60145"/>
|
||||
<ace_table alias="Nd-146.71c" awr="144.66" location="1" name="60146.71c" path="293.6K/Nd_146_293.6K.ace" temperature="2.53e-08" zaid="60146"/>
|
||||
<ace_table alias="Nd-147.71c" awr="145.654" location="1" name="60147.71c" path="293.6K/Nd_147_293.6K.ace" temperature="2.53e-08" zaid="60147"/>
|
||||
<ace_table alias="Nd-148.71c" awr="146.646" location="1" name="60148.71c" path="293.6K/Nd_148_293.6K.ace" temperature="2.53e-08" zaid="60148"/>
|
||||
<ace_table alias="Nd-150.71c" awr="148.633" location="1" name="60150.71c" path="293.6K/Nd_150_293.6K.ace" temperature="2.53e-08" zaid="60150"/>
|
||||
<ace_table alias="Pm-147.71c" awr="145.653" location="1" name="61147.71c" path="293.6K/Pm_147_293.6K.ace" temperature="2.53e-08" zaid="61147"/>
|
||||
<ace_table alias="Pm-148.71c" awr="146.646" location="1" name="61148.71c" path="293.6K/Pm_148_293.6K.ace" temperature="2.53e-08" zaid="61148"/>
|
||||
<ace_table alias="Pm-148m.71c" awr="146.65" location="1" metastable="1" name="61548.71c" path="293.6K/Pm_148m1_293.6K.ace" temperature="2.53e-08" zaid="61548"/>
|
||||
<ace_table alias="Pm-149.71c" awr="147.639" location="1" name="61149.71c" path="293.6K/Pm_149_293.6K.ace" temperature="2.53e-08" zaid="61149"/>
|
||||
<ace_table alias="Pm-151.71c" awr="149.625" location="1" name="61151.71c" path="293.6K/Pm_151_293.6K.ace" temperature="2.53e-08" zaid="61151"/>
|
||||
<ace_table alias="Sm-144.71c" awr="142.676" location="1" name="62144.71c" path="293.6K/Sm_144_293.6K.ace" temperature="2.53e-08" zaid="62144"/>
|
||||
<ace_table alias="Sm-147.71c" awr="145.653" location="1" name="62147.71c" path="293.6K/Sm_147_293.6K.ace" temperature="2.53e-08" zaid="62147"/>
|
||||
<ace_table alias="Sm-148.71c" awr="146.644" location="1" name="62148.71c" path="293.6K/Sm_148_293.6K.ace" temperature="2.53e-08" zaid="62148"/>
|
||||
<ace_table alias="Sm-149.71c" awr="147.638" location="1" name="62149.71c" path="293.6K/Sm_149_293.6K.ace" temperature="2.53e-08" zaid="62149"/>
|
||||
<ace_table alias="Sm-150.71c" awr="148.629" location="1" name="62150.71c" path="293.6K/Sm_150_293.6K.ace" temperature="2.53e-08" zaid="62150"/>
|
||||
<ace_table alias="Sm-151.71c" awr="149.623" location="1" name="62151.71c" path="293.6K/Sm_151_293.6K.ace" temperature="2.53e-08" zaid="62151"/>
|
||||
<ace_table alias="Sm-152.71c" awr="150.615" location="1" name="62152.71c" path="293.6K/Sm_152_293.6K.ace" temperature="2.53e-08" zaid="62152"/>
|
||||
<ace_table alias="Sm-153.71c" awr="151.608" location="1" name="62153.71c" path="293.6K/Sm_153_293.6K.ace" temperature="2.53e-08" zaid="62153"/>
|
||||
<ace_table alias="Sm-154.71c" awr="152.6" location="1" name="62154.71c" path="293.6K/Sm_154_293.6K.ace" temperature="2.53e-08" zaid="62154"/>
|
||||
<ace_table alias="Eu-151.71c" awr="149.62" location="1" name="63151.71c" path="293.6K/Eu_151_293.6K.ace" temperature="2.53e-08" zaid="63151"/>
|
||||
<ace_table alias="Eu-152.71c" awr="150.617" location="1" name="63152.71c" path="293.6K/Eu_152_293.6K.ace" temperature="2.53e-08" zaid="63152"/>
|
||||
<ace_table alias="Eu-153.71c" awr="151.608" location="1" name="63153.71c" path="293.6K/Eu_153_293.6K.ace" temperature="2.53e-08" zaid="63153"/>
|
||||
<ace_table alias="Eu-154.71c" awr="152.6" location="1" name="63154.71c" path="293.6K/Eu_154_293.6K.ace" temperature="2.53e-08" zaid="63154"/>
|
||||
<ace_table alias="Eu-155.71c" awr="153.59" location="1" name="63155.71c" path="293.6K/Eu_155_293.6K.ace" temperature="2.53e-08" zaid="63155"/>
|
||||
<ace_table alias="Eu-156.71c" awr="154.586" location="1" name="63156.71c" path="293.6K/Eu_156_293.6K.ace" temperature="2.53e-08" zaid="63156"/>
|
||||
<ace_table alias="Eu-157.71c" awr="155.577" location="1" name="63157.71c" path="293.6K/Eu_157_293.6K.ace" temperature="2.53e-08" zaid="63157"/>
|
||||
<ace_table alias="Gd-152.71c" awr="150.615" location="1" name="64152.71c" path="293.6K/Gd_152_293.6K.ace" temperature="2.53e-08" zaid="64152"/>
|
||||
<ace_table alias="Gd-153.71c" awr="151.608" location="1" name="64153.71c" path="293.6K/Gd_153_293.6K.ace" temperature="2.53e-08" zaid="64153"/>
|
||||
<ace_table alias="Gd-154.71c" awr="152.599" location="1" name="64154.71c" path="293.6K/Gd_154_293.6K.ace" temperature="2.53e-08" zaid="64154"/>
|
||||
<ace_table alias="Gd-155.71c" awr="153.592" location="1" name="64155.71c" path="293.6K/Gd_155_293.6K.ace" temperature="2.53e-08" zaid="64155"/>
|
||||
<ace_table alias="Gd-156.71c" awr="154.583" location="1" name="64156.71c" path="293.6K/Gd_156_293.6K.ace" temperature="2.53e-08" zaid="64156"/>
|
||||
<ace_table alias="Gd-157.71c" awr="155.576" location="1" name="64157.71c" path="293.6K/Gd_157_293.6K.ace" temperature="2.53e-08" zaid="64157"/>
|
||||
<ace_table alias="Gd-158.71c" awr="156.567" location="1" name="64158.71c" path="293.6K/Gd_158_293.6K.ace" temperature="2.53e-08" zaid="64158"/>
|
||||
<ace_table alias="Gd-160.71c" awr="158.553" location="1" name="64160.71c" path="293.6K/Gd_160_293.6K.ace" temperature="2.53e-08" zaid="64160"/>
|
||||
<ace_table alias="Tb-159.71c" awr="157.56" location="1" name="65159.71c" path="293.6K/Tb_159_293.6K.ace" temperature="2.53e-08" zaid="65159"/>
|
||||
<ace_table alias="Tb-160.71c" awr="158.553" location="1" name="65160.71c" path="293.6K/Tb_160_293.6K.ace" temperature="2.53e-08" zaid="65160"/>
|
||||
<ace_table alias="Dy-156.71c" awr="154.585" location="1" name="66156.71c" path="293.6K/Dy_156_293.6K.ace" temperature="2.53e-08" zaid="66156"/>
|
||||
<ace_table alias="Dy-158.71c" awr="156.568" location="1" name="66158.71c" path="293.6K/Dy_158_293.6K.ace" temperature="2.53e-08" zaid="66158"/>
|
||||
<ace_table alias="Dy-160.71c" awr="158.551" location="1" name="66160.71c" path="293.6K/Dy_160_293.6K.ace" temperature="2.53e-08" zaid="66160"/>
|
||||
<ace_table alias="Dy-161.71c" awr="159.544" location="1" name="66161.71c" path="293.6K/Dy_161_293.6K.ace" temperature="2.53e-08" zaid="66161"/>
|
||||
<ace_table alias="Dy-162.71c" awr="160.536" location="1" name="66162.71c" path="293.6K/Dy_162_293.6K.ace" temperature="2.53e-08" zaid="66162"/>
|
||||
<ace_table alias="Dy-163.71c" awr="161.529" location="1" name="66163.71c" path="293.6K/Dy_163_293.6K.ace" temperature="2.53e-08" zaid="66163"/>
|
||||
<ace_table alias="Dy-164.71c" awr="162.521" location="1" name="66164.71c" path="293.6K/Dy_164_293.6K.ace" temperature="2.53e-08" zaid="66164"/>
|
||||
<ace_table alias="Ho-165.71c" awr="163.513" location="1" name="67165.71c" path="293.6K/Ho_165_293.6K.ace" temperature="2.53e-08" zaid="67165"/>
|
||||
<ace_table alias="Ho-166m.71c" awr="164.507" location="1" metastable="1" name="67566.71c" path="293.6K/Ho_166m1_293.6K.ace" temperature="2.53e-08" zaid="67566"/>
|
||||
<ace_table alias="Er-162.71c" awr="160.538" location="1" name="68162.71c" path="293.6K/Er_162_293.6K.ace" temperature="2.53e-08" zaid="68162"/>
|
||||
<ace_table alias="Er-164.71c" awr="162.521" location="1" name="68164.71c" path="293.6K/Er_164_293.6K.ace" temperature="2.53e-08" zaid="68164"/>
|
||||
<ace_table alias="Er-166.71c" awr="164.505" location="1" name="68166.71c" path="293.6K/Er_166_293.6K.ace" temperature="2.53e-08" zaid="68166"/>
|
||||
<ace_table alias="Er-167.71c" awr="165.498" location="1" name="68167.71c" path="293.6K/Er_167_293.6K.ace" temperature="2.53e-08" zaid="68167"/>
|
||||
<ace_table alias="Er-168.71c" awr="166.487" location="1" name="68168.71c" path="293.6K/Er_168_293.6K.ace" temperature="2.53e-08" zaid="68168"/>
|
||||
<ace_table alias="Er-170.71c" awr="168.476" location="1" name="68170.71c" path="293.6K/Er_170_293.6K.ace" temperature="2.53e-08" zaid="68170"/>
|
||||
<ace_table alias="Tm-168.71c" awr="166.492" location="1" name="69168.71c" path="293.6K/Tm_168_293.6K.ace" temperature="2.53e-08" zaid="69168"/>
|
||||
<ace_table alias="Tm-169.71c" awr="167.483" location="1" name="69169.71c" path="293.6K/Tm_169_293.6K.ace" temperature="2.53e-08" zaid="69169"/>
|
||||
<ace_table alias="Tm-170.71c" awr="168.476" location="1" name="69170.71c" path="293.6K/Tm_170_293.6K.ace" temperature="2.53e-08" zaid="69170"/>
|
||||
<ace_table alias="Lu-175.71c" awr="173.438" location="1" name="71175.71c" path="293.6K/Lu_175_293.6K.ace" temperature="2.53e-08" zaid="71175"/>
|
||||
<ace_table alias="Lu-176.71c" awr="174.43" location="1" name="71176.71c" path="293.6K/Lu_176_293.6K.ace" temperature="2.53e-08" zaid="71176"/>
|
||||
<ace_table alias="Hf-174.71c" awr="172.446" location="1" name="72174.71c" path="293.6K/Hf_174_293.6K.ace" temperature="2.53e-08" zaid="72174"/>
|
||||
<ace_table alias="Hf-176.71c" awr="174.429" location="1" name="72176.71c" path="293.6K/Hf_176_293.6K.ace" temperature="2.53e-08" zaid="72176"/>
|
||||
<ace_table alias="Hf-177.71c" awr="175.42" location="1" name="72177.71c" path="293.6K/Hf_177_293.6K.ace" temperature="2.53e-08" zaid="72177"/>
|
||||
<ace_table alias="Hf-178.71c" awr="176.411" location="1" name="72178.71c" path="293.6K/Hf_178_293.6K.ace" temperature="2.53e-08" zaid="72178"/>
|
||||
<ace_table alias="Hf-179.71c" awr="177.413" location="1" name="72179.71c" path="293.6K/Hf_179_293.6K.ace" temperature="2.53e-08" zaid="72179"/>
|
||||
<ace_table alias="Hf-180.71c" awr="178.404" location="1" name="72180.71c" path="293.6K/Hf_180_293.6K.ace" temperature="2.53e-08" zaid="72180"/>
|
||||
<ace_table alias="Ta-180.71c" awr="178.4016" location="1" name="73180.71c" path="293.6K/Ta_180_293.6K.ace" temperature="2.53e-08" zaid="73180"/>
|
||||
<ace_table alias="Ta-181.71c" awr="179.3936" location="1" name="73181.71c" path="293.6K/Ta_181_293.6K.ace" temperature="2.53e-08" zaid="73181"/>
|
||||
<ace_table alias="Ta-182.71c" awr="180.387" location="1" name="73182.71c" path="293.6K/Ta_182_293.6K.ace" temperature="2.53e-08" zaid="73182"/>
|
||||
<ace_table alias="W-180.71c" awr="178.401" location="1" name="74180.71c" path="293.6K/W_180_293.6K.ace" temperature="2.53e-08" zaid="74180"/>
|
||||
<ace_table alias="W-182.71c" awr="180.385" location="1" name="74182.71c" path="293.6K/W_182_293.6K.ace" temperature="2.53e-08" zaid="74182"/>
|
||||
<ace_table alias="W-183.71c" awr="181.379" location="1" name="74183.71c" path="293.6K/W_183_293.6K.ace" temperature="2.53e-08" zaid="74183"/>
|
||||
<ace_table alias="W-184.71c" awr="182.371" location="1" name="74184.71c" path="293.6K/W_184_293.6K.ace" temperature="2.53e-08" zaid="74184"/>
|
||||
<ace_table alias="W-186.71c" awr="184.357" location="1" name="74186.71c" path="293.6K/W_186_293.6K.ace" temperature="2.53e-08" zaid="74186"/>
|
||||
<ace_table alias="Re-185.71c" awr="183.3641" location="1" name="75185.71c" path="293.6K/Re_185_293.6K.ace" temperature="2.53e-08" zaid="75185"/>
|
||||
<ace_table alias="Re-187.71c" awr="185.3497" location="1" name="75187.71c" path="293.6K/Re_187_293.6K.ace" temperature="2.53e-08" zaid="75187"/>
|
||||
<ace_table alias="Ir-191.71c" awr="189.32" location="1" name="77191.71c" path="293.6K/Ir_191_293.6K.ace" temperature="2.53e-08" zaid="77191"/>
|
||||
<ace_table alias="Ir-193.71c" awr="191.305" location="1" name="77193.71c" path="293.6K/Ir_193_293.6K.ace" temperature="2.53e-08" zaid="77193"/>
|
||||
<ace_table alias="Au-197.71c" awr="195.274" location="1" name="79197.71c" path="293.6K/Au_197_293.6K.ace" temperature="2.53e-08" zaid="79197"/>
|
||||
<ace_table alias="Hg-196.71c" awr="194.282" location="1" name="80196.71c" path="293.6K/Hg_196_293.6K.ace" temperature="2.53e-08" zaid="80196"/>
|
||||
<ace_table alias="Hg-198.71c" awr="196.266" location="1" name="80198.71c" path="293.6K/Hg_198_293.6K.ace" temperature="2.53e-08" zaid="80198"/>
|
||||
<ace_table alias="Hg-199.71c" awr="197.259" location="1" name="80199.71c" path="293.6K/Hg_199_293.6K.ace" temperature="2.53e-08" zaid="80199"/>
|
||||
<ace_table alias="Hg-200.71c" awr="198.25" location="1" name="80200.71c" path="293.6K/Hg_200_293.6K.ace" temperature="2.53e-08" zaid="80200"/>
|
||||
<ace_table alias="Hg-201.71c" awr="199.244" location="1" name="80201.71c" path="293.6K/Hg_201_293.6K.ace" temperature="2.53e-08" zaid="80201"/>
|
||||
<ace_table alias="Hg-202.71c" awr="200.236" location="1" name="80202.71c" path="293.6K/Hg_202_293.6K.ace" temperature="2.53e-08" zaid="80202"/>
|
||||
<ace_table alias="Hg-204.71c" awr="202.221" location="1" name="80204.71c" path="293.6K/Hg_204_293.6K.ace" temperature="2.53e-08" zaid="80204"/>
|
||||
<ace_table alias="Tl-203.71c" awr="201.229" location="1" name="81203.71c" path="293.6K/Tl_203_293.6K.ace" temperature="2.53e-08" zaid="81203"/>
|
||||
<ace_table alias="Tl-205.71c" awr="203.214" location="1" name="81205.71c" path="293.6K/Tl_205_293.6K.ace" temperature="2.53e-08" zaid="81205"/>
|
||||
<ace_table alias="Pb-204.71c" awr="202.2208" location="1" name="82204.71c" path="293.6K/Pb_204_293.6K.ace" temperature="2.53e-08" zaid="82204"/>
|
||||
<ace_table alias="Pb-206.71c" awr="204.205" location="1" name="82206.71c" path="293.6K/Pb_206_293.6K.ace" temperature="2.53e-08" zaid="82206"/>
|
||||
<ace_table alias="Pb-207.71c" awr="205.1979" location="1" name="82207.71c" path="293.6K/Pb_207_293.6K.ace" temperature="2.53e-08" zaid="82207"/>
|
||||
<ace_table alias="Pb-208.71c" awr="206.19" location="1" name="82208.71c" path="293.6K/Pb_208_293.6K.ace" temperature="2.53e-08" zaid="82208"/>
|
||||
<ace_table alias="Bi-209.71c" awr="207.185" location="1" name="83209.71c" path="293.6K/Bi_209_293.6K.ace" temperature="2.53e-08" zaid="83209"/>
|
||||
<ace_table alias="Ra-223.71c" awr="221.103" location="1" name="88223.71c" path="293.6K/Ra_223_293.6K.ace" temperature="2.53e-08" zaid="88223"/>
|
||||
<ace_table alias="Ra-224.71c" awr="222.096" location="1" name="88224.71c" path="293.6K/Ra_224_293.6K.ace" temperature="2.53e-08" zaid="88224"/>
|
||||
<ace_table alias="Ra-225.71c" awr="223.091" location="1" name="88225.71c" path="293.6K/Ra_225_293.6K.ace" temperature="2.53e-08" zaid="88225"/>
|
||||
<ace_table alias="Ra-226.71c" awr="224.084" location="1" name="88226.71c" path="293.6K/Ra_226_293.6K.ace" temperature="2.53e-08" zaid="88226"/>
|
||||
<ace_table alias="Ac-225.71c" awr="223.09" location="1" name="89225.71c" path="293.6K/Ac_225_293.6K.ace" temperature="2.53e-08" zaid="89225"/>
|
||||
<ace_table alias="Ac-226.71c" awr="224.084" location="1" name="89226.71c" path="293.6K/Ac_226_293.6K.ace" temperature="2.53e-08" zaid="89226"/>
|
||||
<ace_table alias="Ac-227.71c" awr="225.077" location="1" name="89227.71c" path="293.6K/Ac_227_293.6K.ace" temperature="2.53e-08" zaid="89227"/>
|
||||
<ace_table alias="Th-227.71c" awr="225.077" location="1" name="90227.71c" path="293.6K/Th_227_293.6K.ace" temperature="2.53e-08" zaid="90227"/>
|
||||
<ace_table alias="Th-228.71c" awr="226.07" location="1" name="90228.71c" path="293.6K/Th_228_293.6K.ace" temperature="2.53e-08" zaid="90228"/>
|
||||
<ace_table alias="Th-229.71c" awr="227.064" location="1" name="90229.71c" path="293.6K/Th_229_293.6K.ace" temperature="2.53e-08" zaid="90229"/>
|
||||
<ace_table alias="Th-230.71c" awr="228.057" location="1" name="90230.71c" path="293.6K/Th_230_293.6K.ace" temperature="2.53e-08" zaid="90230"/>
|
||||
<ace_table alias="Th-231.71c" awr="229.052" location="1" name="90231.71c" path="293.6K/Th_231_293.6K.ace" temperature="2.53e-08" zaid="90231"/>
|
||||
<ace_table alias="Th-232.71c" awr="230.045" location="1" name="90232.71c" path="293.6K/Th_232_293.6K.ace" temperature="2.53e-08" zaid="90232"/>
|
||||
<ace_table alias="Th-233.71c" awr="231.04" location="1" name="90233.71c" path="293.6K/Th_233_293.6K.ace" temperature="2.53e-08" zaid="90233"/>
|
||||
<ace_table alias="Th-234.71c" awr="232.033" location="1" name="90234.71c" path="293.6K/Th_234_293.6K.ace" temperature="2.53e-08" zaid="90234"/>
|
||||
<ace_table alias="Pa-229.71c" awr="227.065" location="1" name="91229.71c" path="293.6K/Pa_229_293.6K.ace" temperature="2.53e-08" zaid="91229"/>
|
||||
<ace_table alias="Pa-230.71c" awr="228.058" location="1" name="91230.71c" path="293.6K/Pa_230_293.6K.ace" temperature="2.53e-08" zaid="91230"/>
|
||||
<ace_table alias="Pa-231.71c" awr="229.051" location="1" name="91231.71c" path="293.6K/Pa_231_293.6K.ace" temperature="2.53e-08" zaid="91231"/>
|
||||
<ace_table alias="Pa-232.71c" awr="230.045" location="1" name="91232.71c" path="293.6K/Pa_232_293.6K.ace" temperature="2.53e-08" zaid="91232"/>
|
||||
<ace_table alias="Pa-233.71c" awr="231.038" location="1" name="91233.71c" path="293.6K/Pa_233_293.6K.ace" temperature="2.53e-08" zaid="91233"/>
|
||||
<ace_table alias="U-230.71c" awr="228.058" location="1" name="92230.71c" path="293.6K/U_230_293.6K.ace" temperature="2.53e-08" zaid="92230"/>
|
||||
<ace_table alias="U-231.71c" awr="229.052" location="1" name="92231.71c" path="293.6K/U_231_293.6K.ace" temperature="2.53e-08" zaid="92231"/>
|
||||
<ace_table alias="U-232.71c" awr="230.044" location="1" name="92232.71c" path="293.6K/U_232_293.6K.ace" temperature="2.53e-08" zaid="92232"/>
|
||||
<ace_table alias="U-233.71c" awr="231.0377" location="1" name="92233.71c" path="293.6K/U_233_293.6K.ace" temperature="2.53e-08" zaid="92233"/>
|
||||
<ace_table alias="U-234.71c" awr="232.0304" location="1" name="92234.71c" path="293.6K/U_234_293.6K.ace" temperature="2.53e-08" zaid="92234"/>
|
||||
<ace_table alias="U-235.71c" awr="233.0248" location="1" name="92235.71c" path="293.6K/U_235_293.6K.ace" temperature="2.53e-08" zaid="92235"/>
|
||||
<ace_table alias="U-236.71c" awr="234.0178" location="1" name="92236.71c" path="293.6K/U_236_293.6K.ace" temperature="2.53e-08" zaid="92236"/>
|
||||
<ace_table alias="U-237.71c" awr="235.0124" location="1" name="92237.71c" path="293.6K/U_237_293.6K.ace" temperature="2.53e-08" zaid="92237"/>
|
||||
<ace_table alias="U-238.71c" awr="236.0058" location="1" name="92238.71c" path="293.6K/U_238_293.6K.ace" temperature="2.53e-08" zaid="92238"/>
|
||||
<ace_table alias="U-239.71c" awr="237.0007" location="1" name="92239.71c" path="293.6K/U_239_293.6K.ace" temperature="2.53e-08" zaid="92239"/>
|
||||
<ace_table alias="U-240.71c" awr="237.9944" location="1" name="92240.71c" path="293.6K/U_240_293.6K.ace" temperature="2.53e-08" zaid="92240"/>
|
||||
<ace_table alias="U-241.71c" awr="238.9895" location="1" name="92241.71c" path="293.6K/U_241_293.6K.ace" temperature="2.53e-08" zaid="92241"/>
|
||||
<ace_table alias="Np-234.71c" awr="232.032" location="1" name="93234.71c" path="293.6K/Np_234_293.6K.ace" temperature="2.53e-08" zaid="93234"/>
|
||||
<ace_table alias="Np-235.71c" awr="233.025" location="1" name="93235.71c" path="293.6K/Np_235_293.6K.ace" temperature="2.53e-08" zaid="93235"/>
|
||||
<ace_table alias="Np-236.71c" awr="234.019" location="1" name="93236.71c" path="293.6K/Np_236_293.6K.ace" temperature="2.53e-08" zaid="93236"/>
|
||||
<ace_table alias="Np-237.71c" awr="235.0118" location="1" name="93237.71c" path="293.6K/Np_237_293.6K.ace" temperature="2.53e-08" zaid="93237"/>
|
||||
<ace_table alias="Np-238.71c" awr="236.006" location="1" name="93238.71c" path="293.6K/Np_238_293.6K.ace" temperature="2.53e-08" zaid="93238"/>
|
||||
<ace_table alias="Np-239.71c" awr="236.999" location="1" name="93239.71c" path="293.6K/Np_239_293.6K.ace" temperature="2.53e-08" zaid="93239"/>
|
||||
<ace_table alias="Pu-236.71c" awr="234.018" location="1" name="94236.71c" path="293.6K/Pu_236_293.6K.ace" temperature="2.53e-08" zaid="94236"/>
|
||||
<ace_table alias="Pu-237.71c" awr="235.012" location="1" name="94237.71c" path="293.6K/Pu_237_293.6K.ace" temperature="2.53e-08" zaid="94237"/>
|
||||
<ace_table alias="Pu-238.71c" awr="236.0046" location="1" name="94238.71c" path="293.6K/Pu_238_293.6K.ace" temperature="2.53e-08" zaid="94238"/>
|
||||
<ace_table alias="Pu-239.71c" awr="236.9986" location="1" name="94239.71c" path="293.6K/Pu_239_293.6K.ace" temperature="2.53e-08" zaid="94239"/>
|
||||
<ace_table alias="Pu-240.71c" awr="237.9916" location="1" name="94240.71c" path="293.6K/Pu_240_293.6K.ace" temperature="2.53e-08" zaid="94240"/>
|
||||
<ace_table alias="Pu-241.71c" awr="238.978" location="1" name="94241.71c" path="293.6K/Pu_241_293.6K.ace" temperature="2.53e-08" zaid="94241"/>
|
||||
<ace_table alias="Pu-242.71c" awr="239.979" location="1" name="94242.71c" path="293.6K/Pu_242_293.6K.ace" temperature="2.53e-08" zaid="94242"/>
|
||||
<ace_table alias="Pu-243.71c" awr="240.974" location="1" name="94243.71c" path="293.6K/Pu_243_293.6K.ace" temperature="2.53e-08" zaid="94243"/>
|
||||
<ace_table alias="Pu-244.71c" awr="241.967" location="1" name="94244.71c" path="293.6K/Pu_244_293.6K.ace" temperature="2.53e-08" zaid="94244"/>
|
||||
<ace_table alias="Pu-246.71c" awr="243.956" location="1" name="94246.71c" path="293.6K/Pu_246_293.6K.ace" temperature="2.53e-08" zaid="94246"/>
|
||||
<ace_table alias="Am-240.71c" awr="237.993" location="1" name="95240.71c" path="293.6K/Am_240_293.6K.ace" temperature="2.53e-08" zaid="95240"/>
|
||||
<ace_table alias="Am-241.71c" awr="238.986" location="1" name="95241.71c" path="293.6K/Am_241_293.6K.ace" temperature="2.53e-08" zaid="95241"/>
|
||||
<ace_table alias="Am-242.71c" awr="239.9801" location="1" name="95242.71c" path="293.6K/Am_242_293.6K.ace" temperature="2.53e-08" zaid="95242"/>
|
||||
<ace_table alias="Am-242m.71c" awr="239.9801" location="1" metastable="1" name="95642.71c" path="293.6K/Am_242m1_293.6K.ace" temperature="2.53e-08" zaid="95642"/>
|
||||
<ace_table alias="Am-243.71c" awr="240.9734" location="1" name="95243.71c" path="293.6K/Am_243_293.6K.ace" temperature="2.53e-08" zaid="95243"/>
|
||||
<ace_table alias="Am-244.71c" awr="241.968" location="1" name="95244.71c" path="293.6K/Am_244_293.6K.ace" temperature="2.53e-08" zaid="95244"/>
|
||||
<ace_table alias="Am-244m.71c" awr="241.968" location="1" metastable="1" name="95644.71c" path="293.6K/Am_244m1_293.6K.ace" temperature="2.53e-08" zaid="95644"/>
|
||||
<ace_table alias="Cm-240.71c" awr="237.993" location="1" name="96240.71c" path="293.6K/Cm_240_293.6K.ace" temperature="2.53e-08" zaid="96240"/>
|
||||
<ace_table alias="Cm-241.71c" awr="238.987" location="1" name="96241.71c" path="293.6K/Cm_241_293.6K.ace" temperature="2.53e-08" zaid="96241"/>
|
||||
<ace_table alias="Cm-242.71c" awr="239.979" location="1" name="96242.71c" path="293.6K/Cm_242_293.6K.ace" temperature="2.53e-08" zaid="96242"/>
|
||||
<ace_table alias="Cm-243.71c" awr="240.973" location="1" name="96243.71c" path="293.6K/Cm_243_293.6K.ace" temperature="2.53e-08" zaid="96243"/>
|
||||
<ace_table alias="Cm-244.71c" awr="241.966" location="1" name="96244.71c" path="293.6K/Cm_244_293.6K.ace" temperature="2.53e-08" zaid="96244"/>
|
||||
<ace_table alias="Cm-245.71c" awr="242.96" location="1" name="96245.71c" path="293.6K/Cm_245_293.6K.ace" temperature="2.53e-08" zaid="96245"/>
|
||||
<ace_table alias="Cm-246.71c" awr="243.953" location="1" name="96246.71c" path="293.6K/Cm_246_293.6K.ace" temperature="2.53e-08" zaid="96246"/>
|
||||
<ace_table alias="Cm-247.71c" awr="244.948" location="1" name="96247.71c" path="293.6K/Cm_247_293.6K.ace" temperature="2.53e-08" zaid="96247"/>
|
||||
<ace_table alias="Cm-248.71c" awr="245.941" location="1" name="96248.71c" path="293.6K/Cm_248_293.6K.ace" temperature="2.53e-08" zaid="96248"/>
|
||||
<ace_table alias="Cm-249.71c" awr="246.936" location="1" name="96249.71c" path="293.6K/Cm_249_293.6K.ace" temperature="2.53e-08" zaid="96249"/>
|
||||
<ace_table alias="Cm-250.71c" awr="247.93" location="1" name="96250.71c" path="293.6K/Cm_250_293.6K.ace" temperature="2.53e-08" zaid="96250"/>
|
||||
<ace_table alias="Bk-245.71c" awr="242.961" location="1" name="97245.71c" path="293.6K/Bk_245_293.6K.ace" temperature="2.53e-08" zaid="97245"/>
|
||||
<ace_table alias="Bk-246.71c" awr="243.955" location="1" name="97246.71c" path="293.6K/Bk_246_293.6K.ace" temperature="2.53e-08" zaid="97246"/>
|
||||
<ace_table alias="Bk-247.71c" awr="244.948" location="1" name="97247.71c" path="293.6K/Bk_247_293.6K.ace" temperature="2.53e-08" zaid="97247"/>
|
||||
<ace_table alias="Bk-248.71c" awr="245.942" location="1" name="97248.71c" path="293.6K/Bk_248_293.6K.ace" temperature="2.53e-08" zaid="97248"/>
|
||||
<ace_table alias="Bk-249.71c" awr="246.935" location="1" name="97249.71c" path="293.6K/Bk_249_293.6K.ace" temperature="2.53e-08" zaid="97249"/>
|
||||
<ace_table alias="Bk-250.71c" awr="247.93" location="1" name="97250.71c" path="293.6K/Bk_250_293.6K.ace" temperature="2.53e-08" zaid="97250"/>
|
||||
<ace_table alias="Cf-246.71c" awr="243.955" location="1" name="98246.71c" path="293.6K/Cf_246_293.6K.ace" temperature="2.53e-08" zaid="98246"/>
|
||||
<ace_table alias="Cf-248.71c" awr="245.941" location="1" name="98248.71c" path="293.6K/Cf_248_293.6K.ace" temperature="2.53e-08" zaid="98248"/>
|
||||
<ace_table alias="Cf-249.71c" awr="246.935" location="1" name="98249.71c" path="293.6K/Cf_249_293.6K.ace" temperature="2.53e-08" zaid="98249"/>
|
||||
<ace_table alias="Cf-250.71c" awr="247.928" location="1" name="98250.71c" path="293.6K/Cf_250_293.6K.ace" temperature="2.53e-08" zaid="98250"/>
|
||||
<ace_table alias="Cf-251.71c" awr="248.923" location="1" name="98251.71c" path="293.6K/Cf_251_293.6K.ace" temperature="2.53e-08" zaid="98251"/>
|
||||
<ace_table alias="Cf-252.71c" awr="249.916" location="1" name="98252.71c" path="293.6K/Cf_252_293.6K.ace" temperature="2.53e-08" zaid="98252"/>
|
||||
<ace_table alias="Cf-253.71c" awr="250.911" location="1" name="98253.71c" path="293.6K/Cf_253_293.6K.ace" temperature="2.53e-08" zaid="98253"/>
|
||||
<ace_table alias="Cf-254.71c" awr="251.905" location="1" name="98254.71c" path="293.6K/Cf_254_293.6K.ace" temperature="2.53e-08" zaid="98254"/>
|
||||
<ace_table alias="Es-251.71c" awr="248.923" location="1" name="99251.71c" path="293.6K/Es_251_293.6K.ace" temperature="2.53e-08" zaid="99251"/>
|
||||
<ace_table alias="Es-252.71c" awr="249.917" location="1" name="99252.71c" path="293.6K/Es_252_293.6K.ace" temperature="2.53e-08" zaid="99252"/>
|
||||
<ace_table alias="Es-253.71c" awr="250.911" location="1" name="99253.71c" path="293.6K/Es_253_293.6K.ace" temperature="2.53e-08" zaid="99253"/>
|
||||
<ace_table alias="Es-254.71c" awr="251.905" location="1" name="99254.71c" path="293.6K/Es_254_293.6K.ace" temperature="2.53e-08" zaid="99254"/>
|
||||
<ace_table alias="Es-254m.71c" awr="251.905" location="1" metastable="1" name="99654.71c" path="293.6K/Es_254m1_293.6K.ace" temperature="2.53e-08" zaid="99654"/>
|
||||
<ace_table alias="Es-255.71c" awr="252.899" location="1" name="99255.71c" path="293.6K/Es_255_293.6K.ace" temperature="2.53e-08" zaid="99255"/>
|
||||
<ace_table alias="Fm-255.71c" awr="252.899" location="1" name="100255.71c" path="293.6K/Fm_255_293.6K.ace" temperature="2.53e-08" zaid="100255"/>
|
||||
<ace_table alias="H-1.72c" awr="0.999167" location="1" name="1001.72c" path="300K/H_001_300K.ace" temperature="2.585e-08" zaid="1001"/>
|
||||
<ace_table alias="H-2.72c" awr="1.9968" location="1" name="1002.72c" path="300K/H_002_300K.ace" temperature="2.585e-08" zaid="1002"/>
|
||||
<ace_table alias="H-3.72c" awr="2.989596" location="1" name="1003.72c" path="300K/H_003_300K.ace" temperature="2.585e-08" zaid="1003"/>
|
||||
<ace_table alias="He-3.72c" awr="2.989032" location="1" name="2003.72c" path="300K/He_003_300K.ace" temperature="2.585e-08" zaid="2003"/>
|
||||
<ace_table alias="He-4.72c" awr="3.968219" location="1" name="2004.72c" path="300K/He_004_300K.ace" temperature="2.585e-08" zaid="2004"/>
|
||||
<ace_table alias="Li-6.72c" awr="5.9634" location="1" name="3006.72c" path="300K/Li_006_300K.ace" temperature="2.585e-08" zaid="3006"/>
|
||||
<ace_table alias="Li-7.72c" awr="6.955732" location="1" name="3007.72c" path="300K/Li_007_300K.ace" temperature="2.585e-08" zaid="3007"/>
|
||||
<ace_table alias="Be-7.72c" awr="6.9545" location="1" name="4007.72c" path="300K/Be_007_300K.ace" temperature="2.585e-08" zaid="4007"/>
|
||||
<ace_table alias="Be-9.72c" awr="8.93478" location="1" name="4009.72c" path="300K/Be_009_300K.ace" temperature="2.585e-08" zaid="4009"/>
|
||||
<ace_table alias="B-10.72c" awr="9.926921" location="1" name="5010.72c" path="300K/B_010_300K.ace" temperature="2.585e-08" zaid="5010"/>
|
||||
<ace_table alias="B-11.72c" awr="10.9147" location="1" name="5011.72c" path="300K/B_011_300K.ace" temperature="2.585e-08" zaid="5011"/>
|
||||
<ace_table alias="C-Nat.72c" awr="11.898" location="1" name="6000.72c" path="300K/C_000_300K.ace" temperature="2.585e-08" zaid="6000"/>
|
||||
<ace_table alias="N-14.72c" awr="13.88278" location="1" name="7014.72c" path="300K/N_014_300K.ace" temperature="2.585e-08" zaid="7014"/>
|
||||
<ace_table alias="N-15.72c" awr="14.871" location="1" name="7015.72c" path="300K/N_015_300K.ace" temperature="2.585e-08" zaid="7015"/>
|
||||
<ace_table alias="O-16.72c" awr="15.85751" location="1" name="8016.72c" path="300K/O_016_300K.ace" temperature="2.585e-08" zaid="8016"/>
|
||||
<ace_table alias="O-17.72c" awr="16.8531" location="1" name="8017.72c" path="300K/O_017_300K.ace" temperature="2.585e-08" zaid="8017"/>
|
||||
<ace_table alias="F-19.72c" awr="18.835" location="1" name="9019.72c" path="300K/F_019_300K.ace" temperature="2.585e-08" zaid="9019"/>
|
||||
<ace_table alias="Na-22.72c" awr="21.8055" location="1" name="11022.72c" path="300K/Na_022_300K.ace" temperature="2.585e-08" zaid="11022"/>
|
||||
<ace_table alias="Na-23.72c" awr="22.792" location="1" name="11023.72c" path="300K/Na_023_300K.ace" temperature="2.585e-08" zaid="11023"/>
|
||||
<ace_table alias="Mg-24.72c" awr="23.779" location="1" name="12024.72c" path="300K/Mg_024_300K.ace" temperature="2.585e-08" zaid="12024"/>
|
||||
<ace_table alias="Mg-25.72c" awr="24.7712" location="1" name="12025.72c" path="300K/Mg_025_300K.ace" temperature="2.585e-08" zaid="12025"/>
|
||||
<ace_table alias="Mg-26.72c" awr="25.7594" location="1" name="12026.72c" path="300K/Mg_026_300K.ace" temperature="2.585e-08" zaid="12026"/>
|
||||
<ace_table alias="Al-27.72c" awr="26.74975" location="1" name="13027.72c" path="300K/Al_027_300K.ace" temperature="2.585e-08" zaid="13027"/>
|
||||
<ace_table alias="Si-28.72c" awr="27.737" location="1" name="14028.72c" path="300K/Si_028_300K.ace" temperature="2.585e-08" zaid="14028"/>
|
||||
<ace_table alias="Si-29.72c" awr="28.728" location="1" name="14029.72c" path="300K/Si_029_300K.ace" temperature="2.585e-08" zaid="14029"/>
|
||||
<ace_table alias="Si-30.72c" awr="29.716" location="1" name="14030.72c" path="300K/Si_030_300K.ace" temperature="2.585e-08" zaid="14030"/>
|
||||
<ace_table alias="P-31.72c" awr="30.708" location="1" name="15031.72c" path="300K/P_031_300K.ace" temperature="2.585e-08" zaid="15031"/>
|
||||
<ace_table alias="S-32.72c" awr="31.6973" location="1" name="16032.72c" path="300K/S_032_300K.ace" temperature="2.585e-08" zaid="16032"/>
|
||||
<ace_table alias="S-33.72c" awr="32.6878" location="1" name="16033.72c" path="300K/S_033_300K.ace" temperature="2.585e-08" zaid="16033"/>
|
||||
<ace_table alias="S-34.72c" awr="33.6762" location="1" name="16034.72c" path="300K/S_034_300K.ace" temperature="2.585e-08" zaid="16034"/>
|
||||
<ace_table alias="S-36.72c" awr="35.658" location="1" name="16036.72c" path="300K/S_036_300K.ace" temperature="2.585e-08" zaid="16036"/>
|
||||
<ace_table alias="Cl-35.72c" awr="34.66845" location="1" name="17035.72c" path="300K/Cl_035_300K.ace" temperature="2.585e-08" zaid="17035"/>
|
||||
<ace_table alias="Cl-37.72c" awr="36.6483" location="1" name="17037.72c" path="300K/Cl_037_300K.ace" temperature="2.585e-08" zaid="17037"/>
|
||||
<ace_table alias="Ar-36.72c" awr="35.6585" location="1" name="18036.72c" path="300K/Ar_036_300K.ace" temperature="2.585e-08" zaid="18036"/>
|
||||
<ace_table alias="Ar-38.72c" awr="37.6366" location="1" name="18038.72c" path="300K/Ar_038_300K.ace" temperature="2.585e-08" zaid="18038"/>
|
||||
<ace_table alias="Ar-40.72c" awr="39.6191" location="1" name="18040.72c" path="300K/Ar_040_300K.ace" temperature="2.585e-08" zaid="18040"/>
|
||||
<ace_table alias="K-39.72c" awr="38.6293" location="1" name="19039.72c" path="300K/K_039_300K.ace" temperature="2.585e-08" zaid="19039"/>
|
||||
<ace_table alias="K-40.72c" awr="39.6207" location="1" name="19040.72c" path="300K/K_040_300K.ace" temperature="2.585e-08" zaid="19040"/>
|
||||
<ace_table alias="K-41.72c" awr="40.6101" location="1" name="19041.72c" path="300K/K_041_300K.ace" temperature="2.585e-08" zaid="19041"/>
|
||||
<ace_table alias="Ca-40.72c" awr="39.6193" location="1" name="20040.72c" path="300K/Ca_040_300K.ace" temperature="2.585e-08" zaid="20040"/>
|
||||
<ace_table alias="Ca-42.72c" awr="41.59818" location="1" name="20042.72c" path="300K/Ca_042_300K.ace" temperature="2.585e-08" zaid="20042"/>
|
||||
<ace_table alias="Ca-43.72c" awr="42.58973" location="1" name="20043.72c" path="300K/Ca_043_300K.ace" temperature="2.585e-08" zaid="20043"/>
|
||||
<ace_table alias="Ca-44.72c" awr="43.57788" location="1" name="20044.72c" path="300K/Ca_044_300K.ace" temperature="2.585e-08" zaid="20044"/>
|
||||
<ace_table alias="Ca-46.72c" awr="45.55893" location="1" name="20046.72c" path="300K/Ca_046_300K.ace" temperature="2.585e-08" zaid="20046"/>
|
||||
<ace_table alias="Ca-48.72c" awr="47.5406" location="1" name="20048.72c" path="300K/Ca_048_300K.ace" temperature="2.585e-08" zaid="20048"/>
|
||||
<ace_table alias="Sc-45.72c" awr="44.5679" location="1" name="21045.72c" path="300K/Sc_045_300K.ace" temperature="2.585e-08" zaid="21045"/>
|
||||
<ace_table alias="Ti-46.72c" awr="45.5579" location="1" name="22046.72c" path="300K/Ti_046_300K.ace" temperature="2.585e-08" zaid="22046"/>
|
||||
<ace_table alias="Ti-47.72c" awr="46.5484" location="1" name="22047.72c" path="300K/Ti_047_300K.ace" temperature="2.585e-08" zaid="22047"/>
|
||||
<ace_table alias="Ti-48.72c" awr="47.5361" location="1" name="22048.72c" path="300K/Ti_048_300K.ace" temperature="2.585e-08" zaid="22048"/>
|
||||
<ace_table alias="Ti-49.72c" awr="48.5274" location="1" name="22049.72c" path="300K/Ti_049_300K.ace" temperature="2.585e-08" zaid="22049"/>
|
||||
<ace_table alias="Ti-50.72c" awr="49.5157" location="1" name="22050.72c" path="300K/Ti_050_300K.ace" temperature="2.585e-08" zaid="22050"/>
|
||||
<ace_table alias="V-50.72c" awr="49.5181" location="1" name="23050.72c" path="300K/V_050_300K.ace" temperature="2.585e-08" zaid="23050"/>
|
||||
<ace_table alias="V-51.72c" awr="50.5063" location="1" name="23051.72c" path="300K/V_051_300K.ace" temperature="2.585e-08" zaid="23051"/>
|
||||
<ace_table alias="Cr-50.72c" awr="49.517" location="1" name="24050.72c" path="300K/Cr_050_300K.ace" temperature="2.585e-08" zaid="24050"/>
|
||||
<ace_table alias="Cr-52.72c" awr="51.494" location="1" name="24052.72c" path="300K/Cr_052_300K.ace" temperature="2.585e-08" zaid="24052"/>
|
||||
<ace_table alias="Cr-53.72c" awr="52.486" location="1" name="24053.72c" path="300K/Cr_053_300K.ace" temperature="2.585e-08" zaid="24053"/>
|
||||
<ace_table alias="Cr-54.72c" awr="53.476" location="1" name="24054.72c" path="300K/Cr_054_300K.ace" temperature="2.585e-08" zaid="24054"/>
|
||||
<ace_table alias="Mn-55.72c" awr="54.4661" location="1" name="25055.72c" path="300K/Mn_055_300K.ace" temperature="2.585e-08" zaid="25055"/>
|
||||
<ace_table alias="Fe-54.72c" awr="53.476" location="1" name="26054.72c" path="300K/Fe_054_300K.ace" temperature="2.585e-08" zaid="26054"/>
|
||||
<ace_table alias="Fe-56.72c" awr="55.454" location="1" name="26056.72c" path="300K/Fe_056_300K.ace" temperature="2.585e-08" zaid="26056"/>
|
||||
<ace_table alias="Fe-57.72c" awr="56.446" location="1" name="26057.72c" path="300K/Fe_057_300K.ace" temperature="2.585e-08" zaid="26057"/>
|
||||
<ace_table alias="Fe-58.72c" awr="57.436" location="1" name="26058.72c" path="300K/Fe_058_300K.ace" temperature="2.585e-08" zaid="26058"/>
|
||||
<ace_table alias="Co-58.72c" awr="57.4381" location="1" name="27058.72c" path="300K/Co_058_300K.ace" temperature="2.585e-08" zaid="27058"/>
|
||||
<ace_table alias="Co-58m.72c" awr="57.4381" location="1" metastable="1" name="27458.72c" path="300K/Co_058m1_300K.ace" temperature="2.585e-08" zaid="27458"/>
|
||||
<ace_table alias="Co-59.72c" awr="58.4269" location="1" name="27059.72c" path="300K/Co_059_300K.ace" temperature="2.585e-08" zaid="27059"/>
|
||||
<ace_table alias="Ni-58.72c" awr="57.438" location="1" name="28058.72c" path="300K/Ni_058_300K.ace" temperature="2.585e-08" zaid="28058"/>
|
||||
<ace_table alias="Ni-59.72c" awr="58.4281" location="1" name="28059.72c" path="300K/Ni_059_300K.ace" temperature="2.585e-08" zaid="28059"/>
|
||||
<ace_table alias="Ni-60.72c" awr="59.416" location="1" name="28060.72c" path="300K/Ni_060_300K.ace" temperature="2.585e-08" zaid="28060"/>
|
||||
<ace_table alias="Ni-61.72c" awr="60.408" location="1" name="28061.72c" path="300K/Ni_061_300K.ace" temperature="2.585e-08" zaid="28061"/>
|
||||
<ace_table alias="Ni-62.72c" awr="61.396" location="1" name="28062.72c" path="300K/Ni_062_300K.ace" temperature="2.585e-08" zaid="28062"/>
|
||||
<ace_table alias="Ni-64.72c" awr="63.379" location="1" name="28064.72c" path="300K/Ni_064_300K.ace" temperature="2.585e-08" zaid="28064"/>
|
||||
<ace_table alias="Cu-63.72c" awr="62.389" location="1" name="29063.72c" path="300K/Cu_063_300K.ace" temperature="2.585e-08" zaid="29063"/>
|
||||
<ace_table alias="Cu-65.72c" awr="64.37" location="1" name="29065.72c" path="300K/Cu_065_300K.ace" temperature="2.585e-08" zaid="29065"/>
|
||||
<ace_table alias="Zn-64.72c" awr="63.38" location="1" name="30064.72c" path="300K/Zn_064_300K.ace" temperature="2.585e-08" zaid="30064"/>
|
||||
<ace_table alias="Zn-65.72c" awr="64.3715" location="1" name="30065.72c" path="300K/Zn_065_300K.ace" temperature="2.585e-08" zaid="30065"/>
|
||||
<ace_table alias="Zn-66.72c" awr="65.3597" location="1" name="30066.72c" path="300K/Zn_066_300K.ace" temperature="2.585e-08" zaid="30066"/>
|
||||
<ace_table alias="Zn-67.72c" awr="66.3522" location="1" name="30067.72c" path="300K/Zn_067_300K.ace" temperature="2.585e-08" zaid="30067"/>
|
||||
<ace_table alias="Zn-68.72c" awr="67.3413" location="1" name="30068.72c" path="300K/Zn_068_300K.ace" temperature="2.585e-08" zaid="30068"/>
|
||||
<ace_table alias="Zn-70.72c" awr="69.3246" location="1" name="30070.72c" path="300K/Zn_070_300K.ace" temperature="2.585e-08" zaid="30070"/>
|
||||
<ace_table alias="Ga-69.72c" awr="68.3336" location="1" name="31069.72c" path="300K/Ga_069_300K.ace" temperature="2.585e-08" zaid="31069"/>
|
||||
<ace_table alias="Ga-71.72c" awr="70.315" location="1" name="31071.72c" path="300K/Ga_071_300K.ace" temperature="2.585e-08" zaid="31071"/>
|
||||
<ace_table alias="Ge-70.72c" awr="69.3236" location="1" name="32070.72c" path="300K/Ge_070_300K.ace" temperature="2.585e-08" zaid="32070"/>
|
||||
<ace_table alias="Ge-72.72c" awr="71.3042" location="1" name="32072.72c" path="300K/Ge_072_300K.ace" temperature="2.585e-08" zaid="32072"/>
|
||||
<ace_table alias="Ge-73.72c" awr="72.297" location="1" name="32073.72c" path="300K/Ge_073_300K.ace" temperature="2.585e-08" zaid="32073"/>
|
||||
<ace_table alias="Ge-74.72c" awr="73.2862" location="1" name="32074.72c" path="300K/Ge_074_300K.ace" temperature="2.585e-08" zaid="32074"/>
|
||||
<ace_table alias="Ge-76.72c" awr="75.2692" location="1" name="32076.72c" path="300K/Ge_076_300K.ace" temperature="2.585e-08" zaid="32076"/>
|
||||
<ace_table alias="As-74.72c" awr="73.2889" location="1" name="33074.72c" path="300K/As_074_300K.ace" temperature="2.585e-08" zaid="33074"/>
|
||||
<ace_table alias="As-75.72c" awr="74.278" location="1" name="33075.72c" path="300K/As_075_300K.ace" temperature="2.585e-08" zaid="33075"/>
|
||||
<ace_table alias="Se-74.72c" awr="73.2875" location="1" name="34074.72c" path="300K/Se_074_300K.ace" temperature="2.585e-08" zaid="34074"/>
|
||||
<ace_table alias="Se-76.72c" awr="75.267" location="1" name="34076.72c" path="300K/Se_076_300K.ace" temperature="2.585e-08" zaid="34076"/>
|
||||
<ace_table alias="Se-77.72c" awr="76.2591" location="1" name="34077.72c" path="300K/Se_077_300K.ace" temperature="2.585e-08" zaid="34077"/>
|
||||
<ace_table alias="Se-78.72c" awr="77.2479" location="1" name="34078.72c" path="300K/Se_078_300K.ace" temperature="2.585e-08" zaid="34078"/>
|
||||
<ace_table alias="Se-79.72c" awr="78.2405" location="1" name="34079.72c" path="300K/Se_079_300K.ace" temperature="2.585e-08" zaid="34079"/>
|
||||
<ace_table alias="Se-80.72c" awr="79.23" location="1" name="34080.72c" path="300K/Se_080_300K.ace" temperature="2.585e-08" zaid="34080"/>
|
||||
<ace_table alias="Se-82.72c" awr="81.213" location="1" name="34082.72c" path="300K/Se_082_300K.ace" temperature="2.585e-08" zaid="34082"/>
|
||||
<ace_table alias="Br-79.72c" awr="78.2403" location="1" name="35079.72c" path="300K/Br_079_300K.ace" temperature="2.585e-08" zaid="35079"/>
|
||||
<ace_table alias="Br-81.72c" awr="80.2212" location="1" name="35081.72c" path="300K/Br_081_300K.ace" temperature="2.585e-08" zaid="35081"/>
|
||||
<ace_table alias="Kr-78.72c" awr="77.25099" location="1" name="36078.72c" path="300K/Kr_078_300K.ace" temperature="2.585e-08" zaid="36078"/>
|
||||
<ace_table alias="Kr-80.72c" awr="79.2299" location="1" name="36080.72c" path="300K/Kr_080_300K.ace" temperature="2.585e-08" zaid="36080"/>
|
||||
<ace_table alias="Kr-82.72c" awr="81.2098" location="1" name="36082.72c" path="300K/Kr_082_300K.ace" temperature="2.585e-08" zaid="36082"/>
|
||||
<ace_table alias="Kr-83.72c" awr="82.202" location="1" name="36083.72c" path="300K/Kr_083_300K.ace" temperature="2.585e-08" zaid="36083"/>
|
||||
<ace_table alias="Kr-84.72c" awr="83.1907" location="1" name="36084.72c" path="300K/Kr_084_300K.ace" temperature="2.585e-08" zaid="36084"/>
|
||||
<ace_table alias="Kr-85.72c" awr="84.1831" location="1" name="36085.72c" path="300K/Kr_085_300K.ace" temperature="2.585e-08" zaid="36085"/>
|
||||
<ace_table alias="Kr-86.72c" awr="85.1726" location="1" name="36086.72c" path="300K/Kr_086_300K.ace" temperature="2.585e-08" zaid="36086"/>
|
||||
<ace_table alias="Rb-85.72c" awr="84.1824" location="1" name="37085.72c" path="300K/Rb_085_300K.ace" temperature="2.585e-08" zaid="37085"/>
|
||||
<ace_table alias="Rb-86.72c" awr="85.1731" location="1" name="37086.72c" path="300K/Rb_086_300K.ace" temperature="2.585e-08" zaid="37086"/>
|
||||
<ace_table alias="Rb-87.72c" awr="86.1626" location="1" name="37087.72c" path="300K/Rb_087_300K.ace" temperature="2.585e-08" zaid="37087"/>
|
||||
<ace_table alias="Sr-84.72c" awr="83.1926" location="1" name="38084.72c" path="300K/Sr_084_300K.ace" temperature="2.585e-08" zaid="38084"/>
|
||||
<ace_table alias="Sr-86.72c" awr="85.1713" location="1" name="38086.72c" path="300K/Sr_086_300K.ace" temperature="2.585e-08" zaid="38086"/>
|
||||
<ace_table alias="Sr-87.72c" awr="86.1623" location="1" name="38087.72c" path="300K/Sr_087_300K.ace" temperature="2.585e-08" zaid="38087"/>
|
||||
<ace_table alias="Sr-88.72c" awr="87.15" location="1" name="38088.72c" path="300K/Sr_088_300K.ace" temperature="2.585e-08" zaid="38088"/>
|
||||
<ace_table alias="Sr-89.72c" awr="88.144" location="1" name="38089.72c" path="300K/Sr_089_300K.ace" temperature="2.585e-08" zaid="38089"/>
|
||||
<ace_table alias="Sr-90.72c" awr="89.1353" location="1" name="38090.72c" path="300K/Sr_090_300K.ace" temperature="2.585e-08" zaid="38090"/>
|
||||
<ace_table alias="Y-89.72c" awr="88.1421" location="1" name="39089.72c" path="300K/Y_089_300K.ace" temperature="2.585e-08" zaid="39089"/>
|
||||
<ace_table alias="Y-90.72c" awr="89.1348" location="1" name="39090.72c" path="300K/Y_090_300K.ace" temperature="2.585e-08" zaid="39090"/>
|
||||
<ace_table alias="Y-91.72c" awr="90.1264" location="1" name="39091.72c" path="300K/Y_091_300K.ace" temperature="2.585e-08" zaid="39091"/>
|
||||
<ace_table alias="Zr-90.72c" awr="89.1324" location="1" name="40090.72c" path="300K/Zr_090_300K.ace" temperature="2.585e-08" zaid="40090"/>
|
||||
<ace_table alias="Zr-91.72c" awr="90.1247" location="1" name="40091.72c" path="300K/Zr_091_300K.ace" temperature="2.585e-08" zaid="40091"/>
|
||||
<ace_table alias="Zr-92.72c" awr="91.1155" location="1" name="40092.72c" path="300K/Zr_092_300K.ace" temperature="2.585e-08" zaid="40092"/>
|
||||
<ace_table alias="Zr-93.72c" awr="92.1084" location="1" name="40093.72c" path="300K/Zr_093_300K.ace" temperature="2.585e-08" zaid="40093"/>
|
||||
<ace_table alias="Zr-94.72c" awr="93.0996" location="1" name="40094.72c" path="300K/Zr_094_300K.ace" temperature="2.585e-08" zaid="40094"/>
|
||||
<ace_table alias="Zr-95.72c" awr="94.0927" location="1" name="40095.72c" path="300K/Zr_095_300K.ace" temperature="2.585e-08" zaid="40095"/>
|
||||
<ace_table alias="Zr-96.72c" awr="95.0844" location="1" name="40096.72c" path="300K/Zr_096_300K.ace" temperature="2.585e-08" zaid="40096"/>
|
||||
<ace_table alias="Nb-93.72c" awr="92.1051" location="1" name="41093.72c" path="300K/Nb_093_300K.ace" temperature="2.585e-08" zaid="41093"/>
|
||||
<ace_table alias="Nb-94.72c" awr="93.1006" location="1" name="41094.72c" path="300K/Nb_094_300K.ace" temperature="2.585e-08" zaid="41094"/>
|
||||
<ace_table alias="Nb-95.72c" awr="94.0915" location="1" name="41095.72c" path="300K/Nb_095_300K.ace" temperature="2.585e-08" zaid="41095"/>
|
||||
<ace_table alias="Mo-92.72c" awr="91.1173" location="1" name="42092.72c" path="300K/Mo_092_300K.ace" temperature="2.585e-08" zaid="42092"/>
|
||||
<ace_table alias="Mo-94.72c" awr="93.0984" location="1" name="42094.72c" path="300K/Mo_094_300K.ace" temperature="2.585e-08" zaid="42094"/>
|
||||
<ace_table alias="Mo-95.72c" awr="94.0906" location="1" name="42095.72c" path="300K/Mo_095_300K.ace" temperature="2.585e-08" zaid="42095"/>
|
||||
<ace_table alias="Mo-96.72c" awr="95.0808" location="1" name="42096.72c" path="300K/Mo_096_300K.ace" temperature="2.585e-08" zaid="42096"/>
|
||||
<ace_table alias="Mo-97.72c" awr="96.0735" location="1" name="42097.72c" path="300K/Mo_097_300K.ace" temperature="2.585e-08" zaid="42097"/>
|
||||
<ace_table alias="Mo-98.72c" awr="97.0643" location="1" name="42098.72c" path="300K/Mo_098_300K.ace" temperature="2.585e-08" zaid="42098"/>
|
||||
<ace_table alias="Mo-99.72c" awr="98.058" location="1" name="42099.72c" path="300K/Mo_099_300K.ace" temperature="2.585e-08" zaid="42099"/>
|
||||
<ace_table alias="Mo-100.72c" awr="99.049" location="1" name="42100.72c" path="300K/Mo_100_300K.ace" temperature="2.585e-08" zaid="42100"/>
|
||||
<ace_table alias="Tc-99.72c" awr="98.0566" location="1" name="43099.72c" path="300K/Tc_099_300K.ace" temperature="2.585e-08" zaid="43099"/>
|
||||
<ace_table alias="Ru-96.72c" awr="95.0837" location="1" name="44096.72c" path="300K/Ru_096_300K.ace" temperature="2.585e-08" zaid="44096"/>
|
||||
<ace_table alias="Ru-98.72c" awr="97.0642" location="1" name="44098.72c" path="300K/Ru_098_300K.ace" temperature="2.585e-08" zaid="44098"/>
|
||||
<ace_table alias="Ru-99.72c" awr="98.0562" location="1" name="44099.72c" path="300K/Ru_099_300K.ace" temperature="2.585e-08" zaid="44099"/>
|
||||
<ace_table alias="Ru-100.72c" awr="99.046" location="1" name="44100.72c" path="300K/Ru_100_300K.ace" temperature="2.585e-08" zaid="44100"/>
|
||||
<ace_table alias="Ru-101.72c" awr="100.039" location="1" name="44101.72c" path="300K/Ru_101_300K.ace" temperature="2.585e-08" zaid="44101"/>
|
||||
<ace_table alias="Ru-102.72c" awr="101.03" location="1" name="44102.72c" path="300K/Ru_102_300K.ace" temperature="2.585e-08" zaid="44102"/>
|
||||
<ace_table alias="Ru-103.72c" awr="102.02" location="1" name="44103.72c" path="300K/Ru_103_300K.ace" temperature="2.585e-08" zaid="44103"/>
|
||||
<ace_table alias="Ru-104.72c" awr="103.01" location="1" name="44104.72c" path="300K/Ru_104_300K.ace" temperature="2.585e-08" zaid="44104"/>
|
||||
<ace_table alias="Ru-105.72c" awr="104.01" location="1" name="44105.72c" path="300K/Ru_105_300K.ace" temperature="2.585e-08" zaid="44105"/>
|
||||
<ace_table alias="Ru-106.72c" awr="104.997" location="1" name="44106.72c" path="300K/Ru_106_300K.ace" temperature="2.585e-08" zaid="44106"/>
|
||||
<ace_table alias="Rh-103.72c" awr="102.021" location="1" name="45103.72c" path="300K/Rh_103_300K.ace" temperature="2.585e-08" zaid="45103"/>
|
||||
<ace_table alias="Rh-105.72c" awr="104.0" location="1" name="45105.72c" path="300K/Rh_105_300K.ace" temperature="2.585e-08" zaid="45105"/>
|
||||
<ace_table alias="Pd-102.72c" awr="101.0302" location="1" name="46102.72c" path="300K/Pd_102_300K.ace" temperature="2.585e-08" zaid="46102"/>
|
||||
<ace_table alias="Pd-104.72c" awr="103.0114" location="1" name="46104.72c" path="300K/Pd_104_300K.ace" temperature="2.585e-08" zaid="46104"/>
|
||||
<ace_table alias="Pd-105.72c" awr="104.004" location="1" name="46105.72c" path="300K/Pd_105_300K.ace" temperature="2.585e-08" zaid="46105"/>
|
||||
<ace_table alias="Pd-106.72c" awr="104.9937" location="1" name="46106.72c" path="300K/Pd_106_300K.ace" temperature="2.585e-08" zaid="46106"/>
|
||||
<ace_table alias="Pd-107.72c" awr="105.987" location="1" name="46107.72c" path="300K/Pd_107_300K.ace" temperature="2.585e-08" zaid="46107"/>
|
||||
<ace_table alias="Pd-108.72c" awr="106.9769" location="1" name="46108.72c" path="300K/Pd_108_300K.ace" temperature="2.585e-08" zaid="46108"/>
|
||||
<ace_table alias="Pd-110.72c" awr="108.961" location="1" name="46110.72c" path="300K/Pd_110_300K.ace" temperature="2.585e-08" zaid="46110"/>
|
||||
<ace_table alias="Ag-107.72c" awr="105.987" location="1" name="47107.72c" path="300K/Ag_107_300K.ace" temperature="2.585e-08" zaid="47107"/>
|
||||
<ace_table alias="Ag-109.72c" awr="107.969" location="1" name="47109.72c" path="300K/Ag_109_300K.ace" temperature="2.585e-08" zaid="47109"/>
|
||||
<ace_table alias="Ag-110m.72c" awr="108.962" location="1" metastable="1" name="47510.72c" path="300K/Ag_110m1_300K.ace" temperature="2.585e-08" zaid="47510"/>
|
||||
<ace_table alias="Ag-111.72c" awr="109.953" location="1" name="47111.72c" path="300K/Ag_111_300K.ace" temperature="2.585e-08" zaid="47111"/>
|
||||
<ace_table alias="Cd-106.72c" awr="104.996" location="1" name="48106.72c" path="300K/Cd_106_300K.ace" temperature="2.585e-08" zaid="48106"/>
|
||||
<ace_table alias="Cd-108.72c" awr="106.977" location="1" name="48108.72c" path="300K/Cd_108_300K.ace" temperature="2.585e-08" zaid="48108"/>
|
||||
<ace_table alias="Cd-110.72c" awr="108.959" location="1" name="48110.72c" path="300K/Cd_110_300K.ace" temperature="2.585e-08" zaid="48110"/>
|
||||
<ace_table alias="Cd-111.72c" awr="109.951" location="1" name="48111.72c" path="300K/Cd_111_300K.ace" temperature="2.585e-08" zaid="48111"/>
|
||||
<ace_table alias="Cd-112.72c" awr="110.942" location="1" name="48112.72c" path="300K/Cd_112_300K.ace" temperature="2.585e-08" zaid="48112"/>
|
||||
<ace_table alias="Cd-113.72c" awr="111.93" location="1" name="48113.72c" path="300K/Cd_113_300K.ace" temperature="2.585e-08" zaid="48113"/>
|
||||
<ace_table alias="Cd-114.72c" awr="112.925" location="1" name="48114.72c" path="300K/Cd_114_300K.ace" temperature="2.585e-08" zaid="48114"/>
|
||||
<ace_table alias="Cd-115m.72c" awr="113.918" location="1" metastable="1" name="48515.72c" path="300K/Cd_115m1_300K.ace" temperature="2.585e-08" zaid="48515"/>
|
||||
<ace_table alias="Cd-116.72c" awr="114.909" location="1" name="48116.72c" path="300K/Cd_116_300K.ace" temperature="2.585e-08" zaid="48116"/>
|
||||
<ace_table alias="In-113.72c" awr="111.934" location="1" name="49113.72c" path="300K/In_113_300K.ace" temperature="2.585e-08" zaid="49113"/>
|
||||
<ace_table alias="In-115.72c" awr="113.917" location="1" name="49115.72c" path="300K/In_115_300K.ace" temperature="2.585e-08" zaid="49115"/>
|
||||
<ace_table alias="Sn-112.72c" awr="110.944" location="1" name="50112.72c" path="300K/Sn_112_300K.ace" temperature="2.585e-08" zaid="50112"/>
|
||||
<ace_table alias="Sn-113.72c" awr="111.935" location="1" name="50113.72c" path="300K/Sn_113_300K.ace" temperature="2.585e-08" zaid="50113"/>
|
||||
<ace_table alias="Sn-114.72c" awr="112.925" location="1" name="50114.72c" path="300K/Sn_114_300K.ace" temperature="2.585e-08" zaid="50114"/>
|
||||
<ace_table alias="Sn-115.72c" awr="113.916" location="1" name="50115.72c" path="300K/Sn_115_300K.ace" temperature="2.585e-08" zaid="50115"/>
|
||||
<ace_table alias="Sn-116.72c" awr="114.906" location="1" name="50116.72c" path="300K/Sn_116_300K.ace" temperature="2.585e-08" zaid="50116"/>
|
||||
<ace_table alias="Sn-117.72c" awr="115.899" location="1" name="50117.72c" path="300K/Sn_117_300K.ace" temperature="2.585e-08" zaid="50117"/>
|
||||
<ace_table alias="Sn-118.72c" awr="116.889" location="1" name="50118.72c" path="300K/Sn_118_300K.ace" temperature="2.585e-08" zaid="50118"/>
|
||||
<ace_table alias="Sn-119.72c" awr="117.882" location="1" name="50119.72c" path="300K/Sn_119_300K.ace" temperature="2.585e-08" zaid="50119"/>
|
||||
<ace_table alias="Sn-120.72c" awr="118.872" location="1" name="50120.72c" path="300K/Sn_120_300K.ace" temperature="2.585e-08" zaid="50120"/>
|
||||
<ace_table alias="Sn-122.72c" awr="120.856" location="1" name="50122.72c" path="300K/Sn_122_300K.ace" temperature="2.585e-08" zaid="50122"/>
|
||||
<ace_table alias="Sn-123.72c" awr="121.85" location="1" name="50123.72c" path="300K/Sn_123_300K.ace" temperature="2.585e-08" zaid="50123"/>
|
||||
<ace_table alias="Sn-124.72c" awr="122.841" location="1" name="50124.72c" path="300K/Sn_124_300K.ace" temperature="2.585e-08" zaid="50124"/>
|
||||
<ace_table alias="Sn-125.72c" awr="123.835" location="1" name="50125.72c" path="300K/Sn_125_300K.ace" temperature="2.585e-08" zaid="50125"/>
|
||||
<ace_table alias="Sn-126.72c" awr="124.826" location="1" name="50126.72c" path="300K/Sn_126_300K.ace" temperature="2.585e-08" zaid="50126"/>
|
||||
<ace_table alias="Sb-121.72c" awr="119.87" location="1" name="51121.72c" path="300K/Sb_121_300K.ace" temperature="2.585e-08" zaid="51121"/>
|
||||
<ace_table alias="Sb-123.72c" awr="121.85" location="1" name="51123.72c" path="300K/Sb_123_300K.ace" temperature="2.585e-08" zaid="51123"/>
|
||||
<ace_table alias="Sb-124.72c" awr="122.842" location="1" name="51124.72c" path="300K/Sb_124_300K.ace" temperature="2.585e-08" zaid="51124"/>
|
||||
<ace_table alias="Sb-125.72c" awr="123.832" location="1" name="51125.72c" path="300K/Sb_125_300K.ace" temperature="2.585e-08" zaid="51125"/>
|
||||
<ace_table alias="Sb-126.72c" awr="124.826" location="1" name="51126.72c" path="300K/Sb_126_300K.ace" temperature="2.585e-08" zaid="51126"/>
|
||||
<ace_table alias="Te-120.72c" awr="118.874" location="1" name="52120.72c" path="300K/Te_120_300K.ace" temperature="2.585e-08" zaid="52120"/>
|
||||
<ace_table alias="Te-122.72c" awr="120.856" location="1" name="52122.72c" path="300K/Te_122_300K.ace" temperature="2.585e-08" zaid="52122"/>
|
||||
<ace_table alias="Te-123.72c" awr="121.848" location="1" name="52123.72c" path="300K/Te_123_300K.ace" temperature="2.585e-08" zaid="52123"/>
|
||||
<ace_table alias="Te-124.72c" awr="122.839" location="1" name="52124.72c" path="300K/Te_124_300K.ace" temperature="2.585e-08" zaid="52124"/>
|
||||
<ace_table alias="Te-125.72c" awr="123.831" location="1" name="52125.72c" path="300K/Te_125_300K.ace" temperature="2.585e-08" zaid="52125"/>
|
||||
<ace_table alias="Te-126.72c" awr="124.821" location="1" name="52126.72c" path="300K/Te_126_300K.ace" temperature="2.585e-08" zaid="52126"/>
|
||||
<ace_table alias="Te-127m.72c" awr="125.815" location="1" metastable="1" name="52527.72c" path="300K/Te_127m1_300K.ace" temperature="2.585e-08" zaid="52526"/>
|
||||
<ace_table alias="Te-128.72c" awr="126.805" location="1" name="52128.72c" path="300K/Te_128_300K.ace" temperature="2.585e-08" zaid="52128"/>
|
||||
<ace_table alias="Te-129m.72c" awr="127.8" location="1" metastable="1" name="52529.72c" path="300K/Te_129m1_300K.ace" temperature="2.585e-08" zaid="52529"/>
|
||||
<ace_table alias="Te-130.72c" awr="128.79" location="1" name="52130.72c" path="300K/Te_130_300K.ace" temperature="2.585e-08" zaid="52130"/>
|
||||
<ace_table alias="Te-132.72c" awr="130.775" location="1" name="52132.72c" path="300K/Te_132_300K.ace" temperature="2.585e-08" zaid="52132"/>
|
||||
<ace_table alias="I-127.72c" awr="125.8143" location="1" name="53127.72c" path="300K/I_127_300K.ace" temperature="2.585e-08" zaid="53127"/>
|
||||
<ace_table alias="I-129.72c" awr="127.798" location="1" name="53129.72c" path="300K/I_129_300K.ace" temperature="2.585e-08" zaid="53129"/>
|
||||
<ace_table alias="I-130.72c" awr="128.791" location="1" name="53130.72c" path="300K/I_130_300K.ace" temperature="2.585e-08" zaid="53130"/>
|
||||
<ace_table alias="I-131.72c" awr="129.781" location="1" name="53131.72c" path="300K/I_131_300K.ace" temperature="2.585e-08" zaid="53131"/>
|
||||
<ace_table alias="I-135.72c" awr="133.75" location="1" name="53135.72c" path="300K/I_135_300K.ace" temperature="2.585e-08" zaid="53135"/>
|
||||
<ace_table alias="Xe-123.72c" awr="121.8526" location="1" name="54123.72c" path="300K/Xe_123_300K.ace" temperature="2.585e-08" zaid="54123"/>
|
||||
<ace_table alias="Xe-124.72c" awr="122.8415" location="1" name="54124.72c" path="300K/Xe_124_300K.ace" temperature="2.585e-08" zaid="54124"/>
|
||||
<ace_table alias="Xe-126.72c" awr="124.822" location="1" name="54126.72c" path="300K/Xe_126_300K.ace" temperature="2.585e-08" zaid="54126"/>
|
||||
<ace_table alias="Xe-128.72c" awr="126.804" location="1" name="54128.72c" path="300K/Xe_128_300K.ace" temperature="2.585e-08" zaid="54128"/>
|
||||
<ace_table alias="Xe-129.72c" awr="127.798" location="1" name="54129.72c" path="300K/Xe_129_300K.ace" temperature="2.585e-08" zaid="54129"/>
|
||||
<ace_table alias="Xe-130.72c" awr="128.788" location="1" name="54130.72c" path="300K/Xe_130_300K.ace" temperature="2.585e-08" zaid="54130"/>
|
||||
<ace_table alias="Xe-131.72c" awr="129.781" location="1" name="54131.72c" path="300K/Xe_131_300K.ace" temperature="2.585e-08" zaid="54131"/>
|
||||
<ace_table alias="Xe-132.72c" awr="130.77" location="1" name="54132.72c" path="300K/Xe_132_300K.ace" temperature="2.585e-08" zaid="54132"/>
|
||||
<ace_table alias="Xe-133.72c" awr="131.764" location="1" name="54133.72c" path="300K/Xe_133_300K.ace" temperature="2.585e-08" zaid="54133"/>
|
||||
<ace_table alias="Xe-134.72c" awr="132.76" location="1" name="54134.72c" path="300K/Xe_134_300K.ace" temperature="2.585e-08" zaid="54134"/>
|
||||
<ace_table alias="Xe-135.72c" awr="133.748" location="1" name="54135.72c" path="300K/Xe_135_300K.ace" temperature="2.585e-08" zaid="54135"/>
|
||||
<ace_table alias="Xe-136.72c" awr="134.74" location="1" name="54136.72c" path="300K/Xe_136_300K.ace" temperature="2.585e-08" zaid="54136"/>
|
||||
<ace_table alias="Cs-133.72c" awr="131.764" location="1" name="55133.72c" path="300K/Cs_133_300K.ace" temperature="2.585e-08" zaid="55133"/>
|
||||
<ace_table alias="Cs-134.72c" awr="132.757" location="1" name="55134.72c" path="300K/Cs_134_300K.ace" temperature="2.585e-08" zaid="55134"/>
|
||||
<ace_table alias="Cs-135.72c" awr="133.747" location="1" name="55135.72c" path="300K/Cs_135_300K.ace" temperature="2.585e-08" zaid="55135"/>
|
||||
<ace_table alias="Cs-136.72c" awr="134.739" location="1" name="55136.72c" path="300K/Cs_136_300K.ace" temperature="2.585e-08" zaid="55136"/>
|
||||
<ace_table alias="Cs-137.72c" awr="135.731" location="1" name="55137.72c" path="300K/Cs_137_300K.ace" temperature="2.585e-08" zaid="55137"/>
|
||||
<ace_table alias="Ba-130.72c" awr="128.79" location="1" name="56130.72c" path="300K/Ba_130_300K.ace" temperature="2.585e-08" zaid="56130"/>
|
||||
<ace_table alias="Ba-132.72c" awr="130.772" location="1" name="56132.72c" path="300K/Ba_132_300K.ace" temperature="2.585e-08" zaid="56132"/>
|
||||
<ace_table alias="Ba-133.72c" awr="131.764" location="1" name="56133.72c" path="300K/Ba_133_300K.ace" temperature="2.585e-08" zaid="56133"/>
|
||||
<ace_table alias="Ba-134.72c" awr="132.754" location="1" name="56134.72c" path="300K/Ba_134_300K.ace" temperature="2.585e-08" zaid="56134"/>
|
||||
<ace_table alias="Ba-135.72c" awr="133.747" location="1" name="56135.72c" path="300K/Ba_135_300K.ace" temperature="2.585e-08" zaid="56135"/>
|
||||
<ace_table alias="Ba-136.72c" awr="134.737" location="1" name="56136.72c" path="300K/Ba_136_300K.ace" temperature="2.585e-08" zaid="56136"/>
|
||||
<ace_table alias="Ba-137.72c" awr="135.73" location="1" name="56137.72c" path="300K/Ba_137_300K.ace" temperature="2.585e-08" zaid="56137"/>
|
||||
<ace_table alias="Ba-138.72c" awr="136.72" location="1" name="56138.72c" path="300K/Ba_138_300K.ace" temperature="2.585e-08" zaid="56138"/>
|
||||
<ace_table alias="Ba-140.72c" awr="138.708" location="1" name="56140.72c" path="300K/Ba_140_300K.ace" temperature="2.585e-08" zaid="56140"/>
|
||||
<ace_table alias="La-138.72c" awr="136.722" location="1" name="57138.72c" path="300K/La_138_300K.ace" temperature="2.585e-08" zaid="57138"/>
|
||||
<ace_table alias="La-139.72c" awr="137.71" location="1" name="57139.72c" path="300K/La_139_300K.ace" temperature="2.585e-08" zaid="57139"/>
|
||||
<ace_table alias="La-140.72c" awr="138.708" location="1" name="57140.72c" path="300K/La_140_300K.ace" temperature="2.585e-08" zaid="57140"/>
|
||||
<ace_table alias="Ce-136.72c" awr="134.74" location="1" name="58136.72c" path="300K/Ce_136_300K.ace" temperature="2.585e-08" zaid="58136"/>
|
||||
<ace_table alias="Ce-138.72c" awr="136.721" location="1" name="58138.72c" path="300K/Ce_138_300K.ace" temperature="2.585e-08" zaid="58138"/>
|
||||
<ace_table alias="Ce-139.72c" awr="137.713" location="1" name="58139.72c" path="300K/Ce_139_300K.ace" temperature="2.585e-08" zaid="58139"/>
|
||||
<ace_table alias="Ce-140.72c" awr="138.704" location="1" name="58140.72c" path="300K/Ce_140_300K.ace" temperature="2.585e-08" zaid="58140"/>
|
||||
<ace_table alias="Ce-141.72c" awr="139.7" location="1" name="58141.72c" path="300K/Ce_141_300K.ace" temperature="2.585e-08" zaid="58141"/>
|
||||
<ace_table alias="Ce-142.72c" awr="140.69" location="1" name="58142.72c" path="300K/Ce_142_300K.ace" temperature="2.585e-08" zaid="58142"/>
|
||||
<ace_table alias="Ce-143.72c" awr="141.685" location="1" name="58143.72c" path="300K/Ce_143_300K.ace" temperature="2.585e-08" zaid="58143"/>
|
||||
<ace_table alias="Ce-144.72c" awr="142.678" location="1" name="58144.72c" path="300K/Ce_144_300K.ace" temperature="2.585e-08" zaid="58144"/>
|
||||
<ace_table alias="Pr-141.72c" awr="139.697" location="1" name="59141.72c" path="300K/Pr_141_300K.ace" temperature="2.585e-08" zaid="59141"/>
|
||||
<ace_table alias="Pr-142.72c" awr="140.691" location="1" name="59142.72c" path="300K/Pr_142_300K.ace" temperature="2.585e-08" zaid="59142"/>
|
||||
<ace_table alias="Pr-143.72c" awr="141.683" location="1" name="59143.72c" path="300K/Pr_143_300K.ace" temperature="2.585e-08" zaid="59143"/>
|
||||
<ace_table alias="Nd-142.72c" awr="140.689" location="1" name="60142.72c" path="300K/Nd_142_300K.ace" temperature="2.585e-08" zaid="60142"/>
|
||||
<ace_table alias="Nd-143.72c" awr="141.682" location="1" name="60143.72c" path="300K/Nd_143_300K.ace" temperature="2.585e-08" zaid="60143"/>
|
||||
<ace_table alias="Nd-144.72c" awr="142.674" location="1" name="60144.72c" path="300K/Nd_144_300K.ace" temperature="2.585e-08" zaid="60144"/>
|
||||
<ace_table alias="Nd-145.72c" awr="143.668" location="1" name="60145.72c" path="300K/Nd_145_300K.ace" temperature="2.585e-08" zaid="60145"/>
|
||||
<ace_table alias="Nd-146.72c" awr="144.66" location="1" name="60146.72c" path="300K/Nd_146_300K.ace" temperature="2.585e-08" zaid="60146"/>
|
||||
<ace_table alias="Nd-147.72c" awr="145.654" location="1" name="60147.72c" path="300K/Nd_147_300K.ace" temperature="2.585e-08" zaid="60147"/>
|
||||
<ace_table alias="Nd-148.72c" awr="146.646" location="1" name="60148.72c" path="300K/Nd_148_300K.ace" temperature="2.585e-08" zaid="60148"/>
|
||||
<ace_table alias="Nd-150.72c" awr="148.633" location="1" name="60150.72c" path="300K/Nd_150_300K.ace" temperature="2.585e-08" zaid="60150"/>
|
||||
<ace_table alias="Pm-147.72c" awr="145.653" location="1" name="61147.72c" path="300K/Pm_147_300K.ace" temperature="2.585e-08" zaid="61147"/>
|
||||
<ace_table alias="Pm-148.72c" awr="146.646" location="1" name="61148.72c" path="300K/Pm_148_300K.ace" temperature="2.585e-08" zaid="61148"/>
|
||||
<ace_table alias="Pm-148m.72c" awr="146.65" location="1" metastable="1" name="61548.72c" path="300K/Pm_148m1_300K.ace" temperature="2.585e-08" zaid="61548"/>
|
||||
<ace_table alias="Pm-149.72c" awr="147.639" location="1" name="61149.72c" path="300K/Pm_149_300K.ace" temperature="2.585e-08" zaid="61149"/>
|
||||
<ace_table alias="Pm-151.72c" awr="149.625" location="1" name="61151.72c" path="300K/Pm_151_300K.ace" temperature="2.585e-08" zaid="61151"/>
|
||||
<ace_table alias="Sm-144.72c" awr="142.676" location="1" name="62144.72c" path="300K/Sm_144_300K.ace" temperature="2.585e-08" zaid="62144"/>
|
||||
<ace_table alias="Sm-147.72c" awr="145.653" location="1" name="62147.72c" path="300K/Sm_147_300K.ace" temperature="2.585e-08" zaid="62147"/>
|
||||
<ace_table alias="Sm-148.72c" awr="146.644" location="1" name="62148.72c" path="300K/Sm_148_300K.ace" temperature="2.585e-08" zaid="62148"/>
|
||||
<ace_table alias="Sm-149.72c" awr="147.638" location="1" name="62149.72c" path="300K/Sm_149_300K.ace" temperature="2.585e-08" zaid="62149"/>
|
||||
<ace_table alias="Sm-150.72c" awr="148.629" location="1" name="62150.72c" path="300K/Sm_150_300K.ace" temperature="2.585e-08" zaid="62150"/>
|
||||
<ace_table alias="Sm-151.72c" awr="149.623" location="1" name="62151.72c" path="300K/Sm_151_300K.ace" temperature="2.585e-08" zaid="62151"/>
|
||||
<ace_table alias="Sm-152.72c" awr="150.615" location="1" name="62152.72c" path="300K/Sm_152_300K.ace" temperature="2.585e-08" zaid="62152"/>
|
||||
<ace_table alias="Sm-153.72c" awr="151.608" location="1" name="62153.72c" path="300K/Sm_153_300K.ace" temperature="2.585e-08" zaid="62153"/>
|
||||
<ace_table alias="Sm-154.72c" awr="152.6" location="1" name="62154.72c" path="300K/Sm_154_300K.ace" temperature="2.585e-08" zaid="62154"/>
|
||||
<ace_table alias="Eu-151.72c" awr="149.62" location="1" name="63151.72c" path="300K/Eu_151_300K.ace" temperature="2.585e-08" zaid="63151"/>
|
||||
<ace_table alias="Eu-152.72c" awr="150.617" location="1" name="63152.72c" path="300K/Eu_152_300K.ace" temperature="2.585e-08" zaid="63152"/>
|
||||
<ace_table alias="Eu-153.72c" awr="151.608" location="1" name="63153.72c" path="300K/Eu_153_300K.ace" temperature="2.585e-08" zaid="63153"/>
|
||||
<ace_table alias="Eu-154.72c" awr="152.6" location="1" name="63154.72c" path="300K/Eu_154_300K.ace" temperature="2.585e-08" zaid="63154"/>
|
||||
<ace_table alias="Eu-155.72c" awr="153.59" location="1" name="63155.72c" path="300K/Eu_155_300K.ace" temperature="2.585e-08" zaid="63155"/>
|
||||
<ace_table alias="Eu-156.72c" awr="154.586" location="1" name="63156.72c" path="300K/Eu_156_300K.ace" temperature="2.585e-08" zaid="63156"/>
|
||||
<ace_table alias="Eu-157.72c" awr="155.577" location="1" name="63157.72c" path="300K/Eu_157_300K.ace" temperature="2.585e-08" zaid="63157"/>
|
||||
<ace_table alias="Gd-152.72c" awr="150.615" location="1" name="64152.72c" path="300K/Gd_152_300K.ace" temperature="2.585e-08" zaid="64152"/>
|
||||
<ace_table alias="Gd-153.72c" awr="151.608" location="1" name="64153.72c" path="300K/Gd_153_300K.ace" temperature="2.585e-08" zaid="64153"/>
|
||||
<ace_table alias="Gd-154.72c" awr="152.599" location="1" name="64154.72c" path="300K/Gd_154_300K.ace" temperature="2.585e-08" zaid="64154"/>
|
||||
<ace_table alias="Gd-155.72c" awr="153.592" location="1" name="64155.72c" path="300K/Gd_155_300K.ace" temperature="2.585e-08" zaid="64155"/>
|
||||
<ace_table alias="Gd-156.72c" awr="154.583" location="1" name="64156.72c" path="300K/Gd_156_300K.ace" temperature="2.585e-08" zaid="64156"/>
|
||||
<ace_table alias="Gd-157.72c" awr="155.576" location="1" name="64157.72c" path="300K/Gd_157_300K.ace" temperature="2.585e-08" zaid="64157"/>
|
||||
<ace_table alias="Gd-158.72c" awr="156.567" location="1" name="64158.72c" path="300K/Gd_158_300K.ace" temperature="2.585e-08" zaid="64158"/>
|
||||
<ace_table alias="Gd-160.72c" awr="158.553" location="1" name="64160.72c" path="300K/Gd_160_300K.ace" temperature="2.585e-08" zaid="64160"/>
|
||||
<ace_table alias="Tb-159.72c" awr="157.56" location="1" name="65159.72c" path="300K/Tb_159_300K.ace" temperature="2.585e-08" zaid="65159"/>
|
||||
<ace_table alias="Tb-160.72c" awr="158.553" location="1" name="65160.72c" path="300K/Tb_160_300K.ace" temperature="2.585e-08" zaid="65160"/>
|
||||
<ace_table alias="Dy-156.72c" awr="154.585" location="1" name="66156.72c" path="300K/Dy_156_300K.ace" temperature="2.585e-08" zaid="66156"/>
|
||||
<ace_table alias="Dy-158.72c" awr="156.568" location="1" name="66158.72c" path="300K/Dy_158_300K.ace" temperature="2.585e-08" zaid="66158"/>
|
||||
<ace_table alias="Dy-160.72c" awr="158.551" location="1" name="66160.72c" path="300K/Dy_160_300K.ace" temperature="2.585e-08" zaid="66160"/>
|
||||
<ace_table alias="Dy-161.72c" awr="159.544" location="1" name="66161.72c" path="300K/Dy_161_300K.ace" temperature="2.585e-08" zaid="66161"/>
|
||||
<ace_table alias="Dy-162.72c" awr="160.536" location="1" name="66162.72c" path="300K/Dy_162_300K.ace" temperature="2.585e-08" zaid="66162"/>
|
||||
<ace_table alias="Dy-163.72c" awr="161.529" location="1" name="66163.72c" path="300K/Dy_163_300K.ace" temperature="2.585e-08" zaid="66163"/>
|
||||
<ace_table alias="Dy-164.72c" awr="162.521" location="1" name="66164.72c" path="300K/Dy_164_300K.ace" temperature="2.585e-08" zaid="66164"/>
|
||||
<ace_table alias="Ho-165.72c" awr="163.513" location="1" name="67165.72c" path="300K/Ho_165_300K.ace" temperature="2.585e-08" zaid="67165"/>
|
||||
<ace_table alias="Ho-166m.72c" awr="164.507" location="1" metastable="1" name="67566.72c" path="300K/Ho_166m1_300K.ace" temperature="2.585e-08" zaid="67566"/>
|
||||
<ace_table alias="Er-162.72c" awr="160.538" location="1" name="68162.72c" path="300K/Er_162_300K.ace" temperature="2.585e-08" zaid="68162"/>
|
||||
<ace_table alias="Er-164.72c" awr="162.521" location="1" name="68164.72c" path="300K/Er_164_300K.ace" temperature="2.585e-08" zaid="68164"/>
|
||||
<ace_table alias="Er-166.72c" awr="164.505" location="1" name="68166.72c" path="300K/Er_166_300K.ace" temperature="2.585e-08" zaid="68166"/>
|
||||
<ace_table alias="Er-167.72c" awr="165.498" location="1" name="68167.72c" path="300K/Er_167_300K.ace" temperature="2.585e-08" zaid="68167"/>
|
||||
<ace_table alias="Er-168.72c" awr="166.487" location="1" name="68168.72c" path="300K/Er_168_300K.ace" temperature="2.585e-08" zaid="68168"/>
|
||||
<ace_table alias="Er-170.72c" awr="168.476" location="1" name="68170.72c" path="300K/Er_170_300K.ace" temperature="2.585e-08" zaid="68170"/>
|
||||
<ace_table alias="Tm-168.72c" awr="166.492" location="1" name="69168.72c" path="300K/Tm_168_300K.ace" temperature="2.585e-08" zaid="69168"/>
|
||||
<ace_table alias="Tm-169.72c" awr="167.483" location="1" name="69169.72c" path="300K/Tm_169_300K.ace" temperature="2.585e-08" zaid="69169"/>
|
||||
<ace_table alias="Tm-170.72c" awr="168.476" location="1" name="69170.72c" path="300K/Tm_170_300K.ace" temperature="2.585e-08" zaid="69170"/>
|
||||
<ace_table alias="Lu-175.72c" awr="173.438" location="1" name="71175.72c" path="300K/Lu_175_300K.ace" temperature="2.585e-08" zaid="71175"/>
|
||||
<ace_table alias="Lu-176.72c" awr="174.43" location="1" name="71176.72c" path="300K/Lu_176_300K.ace" temperature="2.585e-08" zaid="71176"/>
|
||||
<ace_table alias="Hf-174.72c" awr="172.446" location="1" name="72174.72c" path="300K/Hf_174_300K.ace" temperature="2.585e-08" zaid="72174"/>
|
||||
<ace_table alias="Hf-176.72c" awr="174.429" location="1" name="72176.72c" path="300K/Hf_176_300K.ace" temperature="2.585e-08" zaid="72176"/>
|
||||
<ace_table alias="Hf-177.72c" awr="175.42" location="1" name="72177.72c" path="300K/Hf_177_300K.ace" temperature="2.585e-08" zaid="72177"/>
|
||||
<ace_table alias="Hf-178.72c" awr="176.411" location="1" name="72178.72c" path="300K/Hf_178_300K.ace" temperature="2.585e-08" zaid="72178"/>
|
||||
<ace_table alias="Hf-179.72c" awr="177.413" location="1" name="72179.72c" path="300K/Hf_179_300K.ace" temperature="2.585e-08" zaid="72179"/>
|
||||
<ace_table alias="Hf-180.72c" awr="178.404" location="1" name="72180.72c" path="300K/Hf_180_300K.ace" temperature="2.585e-08" zaid="72180"/>
|
||||
<ace_table alias="Ta-180.72c" awr="178.4016" location="1" name="73180.72c" path="300K/Ta_180_300K.ace" temperature="2.585e-08" zaid="73180"/>
|
||||
<ace_table alias="Ta-181.72c" awr="179.3936" location="1" name="73181.72c" path="300K/Ta_181_300K.ace" temperature="2.585e-08" zaid="73181"/>
|
||||
<ace_table alias="Ta-182.72c" awr="180.387" location="1" name="73182.72c" path="300K/Ta_182_300K.ace" temperature="2.585e-08" zaid="73182"/>
|
||||
<ace_table alias="W-180.72c" awr="178.401" location="1" name="74180.72c" path="300K/W_180_300K.ace" temperature="2.585e-08" zaid="74180"/>
|
||||
<ace_table alias="W-182.72c" awr="180.385" location="1" name="74182.72c" path="300K/W_182_300K.ace" temperature="2.585e-08" zaid="74182"/>
|
||||
<ace_table alias="W-183.72c" awr="181.379" location="1" name="74183.72c" path="300K/W_183_300K.ace" temperature="2.585e-08" zaid="74183"/>
|
||||
<ace_table alias="W-184.72c" awr="182.371" location="1" name="74184.72c" path="300K/W_184_300K.ace" temperature="2.585e-08" zaid="74184"/>
|
||||
<ace_table alias="W-186.72c" awr="184.357" location="1" name="74186.72c" path="300K/W_186_300K.ace" temperature="2.585e-08" zaid="74186"/>
|
||||
<ace_table alias="Re-185.72c" awr="183.3641" location="1" name="75185.72c" path="300K/Re_185_300K.ace" temperature="2.585e-08" zaid="75185"/>
|
||||
<ace_table alias="Re-187.72c" awr="185.3497" location="1" name="75187.72c" path="300K/Re_187_300K.ace" temperature="2.585e-08" zaid="75187"/>
|
||||
<ace_table alias="Ir-191.72c" awr="189.32" location="1" name="77191.72c" path="300K/Ir_191_300K.ace" temperature="2.585e-08" zaid="77191"/>
|
||||
<ace_table alias="Ir-193.72c" awr="191.305" location="1" name="77193.72c" path="300K/Ir_193_300K.ace" temperature="2.585e-08" zaid="77193"/>
|
||||
<ace_table alias="Au-197.72c" awr="195.274" location="1" name="79197.72c" path="300K/Au_197_300K.ace" temperature="2.585e-08" zaid="79197"/>
|
||||
<ace_table alias="Hg-196.72c" awr="194.282" location="1" name="80196.72c" path="300K/Hg_196_300K.ace" temperature="2.585e-08" zaid="80196"/>
|
||||
<ace_table alias="Hg-198.72c" awr="196.266" location="1" name="80198.72c" path="300K/Hg_198_300K.ace" temperature="2.585e-08" zaid="80198"/>
|
||||
<ace_table alias="Hg-199.72c" awr="197.259" location="1" name="80199.72c" path="300K/Hg_199_300K.ace" temperature="2.585e-08" zaid="80199"/>
|
||||
<ace_table alias="Hg-200.72c" awr="198.25" location="1" name="80200.72c" path="300K/Hg_200_300K.ace" temperature="2.585e-08" zaid="80200"/>
|
||||
<ace_table alias="Hg-201.72c" awr="199.244" location="1" name="80201.72c" path="300K/Hg_201_300K.ace" temperature="2.585e-08" zaid="80201"/>
|
||||
<ace_table alias="Hg-202.72c" awr="200.236" location="1" name="80202.72c" path="300K/Hg_202_300K.ace" temperature="2.585e-08" zaid="80202"/>
|
||||
<ace_table alias="Hg-204.72c" awr="202.221" location="1" name="80204.72c" path="300K/Hg_204_300K.ace" temperature="2.585e-08" zaid="80204"/>
|
||||
<ace_table alias="Tl-203.72c" awr="201.229" location="1" name="81203.72c" path="300K/Tl_203_300K.ace" temperature="2.585e-08" zaid="81203"/>
|
||||
<ace_table alias="Tl-205.72c" awr="203.214" location="1" name="81205.72c" path="300K/Tl_205_300K.ace" temperature="2.585e-08" zaid="81205"/>
|
||||
<ace_table alias="Pb-204.72c" awr="202.2208" location="1" name="82204.72c" path="300K/Pb_204_300K.ace" temperature="2.585e-08" zaid="82204"/>
|
||||
<ace_table alias="Pb-206.72c" awr="204.205" location="1" name="82206.72c" path="300K/Pb_206_300K.ace" temperature="2.585e-08" zaid="82206"/>
|
||||
<ace_table alias="Pb-207.72c" awr="205.1979" location="1" name="82207.72c" path="300K/Pb_207_300K.ace" temperature="2.585e-08" zaid="82207"/>
|
||||
<ace_table alias="Pb-208.72c" awr="206.19" location="1" name="82208.72c" path="300K/Pb_208_300K.ace" temperature="2.585e-08" zaid="82208"/>
|
||||
<ace_table alias="Bi-209.72c" awr="207.185" location="1" name="83209.72c" path="300K/Bi_209_300K.ace" temperature="2.585e-08" zaid="83209"/>
|
||||
<ace_table alias="Ra-223.72c" awr="221.103" location="1" name="88223.72c" path="300K/Ra_223_300K.ace" temperature="2.585e-08" zaid="88223"/>
|
||||
<ace_table alias="Ra-224.72c" awr="222.096" location="1" name="88224.72c" path="300K/Ra_224_300K.ace" temperature="2.585e-08" zaid="88224"/>
|
||||
<ace_table alias="Ra-225.72c" awr="223.091" location="1" name="88225.72c" path="300K/Ra_225_300K.ace" temperature="2.585e-08" zaid="88225"/>
|
||||
<ace_table alias="Ra-226.72c" awr="224.084" location="1" name="88226.72c" path="300K/Ra_226_300K.ace" temperature="2.585e-08" zaid="88226"/>
|
||||
<ace_table alias="Ac-225.72c" awr="223.09" location="1" name="89225.72c" path="300K/Ac_225_300K.ace" temperature="2.585e-08" zaid="89225"/>
|
||||
<ace_table alias="Ac-226.72c" awr="224.084" location="1" name="89226.72c" path="300K/Ac_226_300K.ace" temperature="2.585e-08" zaid="89226"/>
|
||||
<ace_table alias="Ac-227.72c" awr="225.077" location="1" name="89227.72c" path="300K/Ac_227_300K.ace" temperature="2.585e-08" zaid="89227"/>
|
||||
<ace_table alias="Th-227.72c" awr="225.077" location="1" name="90227.72c" path="300K/Th_227_300K.ace" temperature="2.585e-08" zaid="90227"/>
|
||||
<ace_table alias="Th-228.72c" awr="226.07" location="1" name="90228.72c" path="300K/Th_228_300K.ace" temperature="2.585e-08" zaid="90228"/>
|
||||
<ace_table alias="Th-229.72c" awr="227.064" location="1" name="90229.72c" path="300K/Th_229_300K.ace" temperature="2.585e-08" zaid="90229"/>
|
||||
<ace_table alias="Th-230.72c" awr="228.057" location="1" name="90230.72c" path="300K/Th_230_300K.ace" temperature="2.585e-08" zaid="90230"/>
|
||||
<ace_table alias="Th-231.72c" awr="229.052" location="1" name="90231.72c" path="300K/Th_231_300K.ace" temperature="2.585e-08" zaid="90231"/>
|
||||
<ace_table alias="Th-232.72c" awr="230.045" location="1" name="90232.72c" path="300K/Th_232_300K.ace" temperature="2.585e-08" zaid="90232"/>
|
||||
<ace_table alias="Th-233.72c" awr="231.04" location="1" name="90233.72c" path="300K/Th_233_300K.ace" temperature="2.585e-08" zaid="90233"/>
|
||||
<ace_table alias="Th-234.72c" awr="232.033" location="1" name="90234.72c" path="300K/Th_234_300K.ace" temperature="2.585e-08" zaid="90234"/>
|
||||
<ace_table alias="Pa-229.72c" awr="227.065" location="1" name="91229.72c" path="300K/Pa_229_300K.ace" temperature="2.585e-08" zaid="91229"/>
|
||||
<ace_table alias="Pa-230.72c" awr="228.058" location="1" name="91230.72c" path="300K/Pa_230_300K.ace" temperature="2.585e-08" zaid="91230"/>
|
||||
<ace_table alias="Pa-231.72c" awr="229.051" location="1" name="91231.72c" path="300K/Pa_231_300K.ace" temperature="2.585e-08" zaid="91231"/>
|
||||
<ace_table alias="Pa-232.72c" awr="230.045" location="1" name="91232.72c" path="300K/Pa_232_300K.ace" temperature="2.585e-08" zaid="91232"/>
|
||||
<ace_table alias="Pa-233.72c" awr="231.038" location="1" name="91233.72c" path="300K/Pa_233_300K.ace" temperature="2.585e-08" zaid="91233"/>
|
||||
<ace_table alias="U-230.72c" awr="228.058" location="1" name="92230.72c" path="300K/U_230_300K.ace" temperature="2.585e-08" zaid="92230"/>
|
||||
<ace_table alias="U-231.72c" awr="229.052" location="1" name="92231.72c" path="300K/U_231_300K.ace" temperature="2.585e-08" zaid="92231"/>
|
||||
<ace_table alias="U-232.72c" awr="230.044" location="1" name="92232.72c" path="300K/U_232_300K.ace" temperature="2.585e-08" zaid="92232"/>
|
||||
<ace_table alias="U-233.72c" awr="231.0377" location="1" name="92233.72c" path="300K/U_233_300K.ace" temperature="2.585e-08" zaid="92233"/>
|
||||
<ace_table alias="U-234.72c" awr="232.0304" location="1" name="92234.72c" path="300K/U_234_300K.ace" temperature="2.585e-08" zaid="92234"/>
|
||||
<ace_table alias="U-235.72c" awr="233.0248" location="1" name="92235.72c" path="300K/U_235_300K.ace" temperature="2.585e-08" zaid="92235"/>
|
||||
<ace_table alias="U-236.72c" awr="234.0178" location="1" name="92236.72c" path="300K/U_236_300K.ace" temperature="2.585e-08" zaid="92236"/>
|
||||
<ace_table alias="U-237.72c" awr="235.0124" location="1" name="92237.72c" path="300K/U_237_300K.ace" temperature="2.585e-08" zaid="92237"/>
|
||||
<ace_table alias="U-238.72c" awr="236.0058" location="1" name="92238.72c" path="300K/U_238_300K.ace" temperature="2.585e-08" zaid="92238"/>
|
||||
<ace_table alias="U-239.72c" awr="237.0007" location="1" name="92239.72c" path="300K/U_239_300K.ace" temperature="2.585e-08" zaid="92239"/>
|
||||
<ace_table alias="U-240.72c" awr="237.9944" location="1" name="92240.72c" path="300K/U_240_300K.ace" temperature="2.585e-08" zaid="92240"/>
|
||||
<ace_table alias="U-241.72c" awr="238.9895" location="1" name="92241.72c" path="300K/U_241_300K.ace" temperature="2.585e-08" zaid="92241"/>
|
||||
<ace_table alias="Np-234.72c" awr="232.032" location="1" name="93234.72c" path="300K/Np_234_300K.ace" temperature="2.585e-08" zaid="93234"/>
|
||||
<ace_table alias="Np-235.72c" awr="233.025" location="1" name="93235.72c" path="300K/Np_235_300K.ace" temperature="2.585e-08" zaid="93235"/>
|
||||
<ace_table alias="Np-236.72c" awr="234.019" location="1" name="93236.72c" path="300K/Np_236_300K.ace" temperature="2.585e-08" zaid="93236"/>
|
||||
<ace_table alias="Np-237.72c" awr="235.0118" location="1" name="93237.72c" path="300K/Np_237_300K.ace" temperature="2.585e-08" zaid="93237"/>
|
||||
<ace_table alias="Np-238.72c" awr="236.006" location="1" name="93238.72c" path="300K/Np_238_300K.ace" temperature="2.585e-08" zaid="93238"/>
|
||||
<ace_table alias="Np-239.72c" awr="236.999" location="1" name="93239.72c" path="300K/Np_239_300K.ace" temperature="2.585e-08" zaid="93239"/>
|
||||
<ace_table alias="Pu-236.72c" awr="234.018" location="1" name="94236.72c" path="300K/Pu_236_300K.ace" temperature="2.585e-08" zaid="94236"/>
|
||||
<ace_table alias="Pu-237.72c" awr="235.012" location="1" name="94237.72c" path="300K/Pu_237_300K.ace" temperature="2.585e-08" zaid="94237"/>
|
||||
<ace_table alias="Pu-238.72c" awr="236.0046" location="1" name="94238.72c" path="300K/Pu_238_300K.ace" temperature="2.585e-08" zaid="94238"/>
|
||||
<ace_table alias="Pu-239.72c" awr="236.9986" location="1" name="94239.72c" path="300K/Pu_239_300K.ace" temperature="2.585e-08" zaid="94239"/>
|
||||
<ace_table alias="Pu-240.72c" awr="237.9916" location="1" name="94240.72c" path="300K/Pu_240_300K.ace" temperature="2.585e-08" zaid="94240"/>
|
||||
<ace_table alias="Pu-241.72c" awr="238.978" location="1" name="94241.72c" path="300K/Pu_241_300K.ace" temperature="2.585e-08" zaid="94241"/>
|
||||
<ace_table alias="Pu-242.72c" awr="239.979" location="1" name="94242.72c" path="300K/Pu_242_300K.ace" temperature="2.585e-08" zaid="94242"/>
|
||||
<ace_table alias="Pu-243.72c" awr="240.974" location="1" name="94243.72c" path="300K/Pu_243_300K.ace" temperature="2.585e-08" zaid="94243"/>
|
||||
<ace_table alias="Pu-244.72c" awr="241.967" location="1" name="94244.72c" path="300K/Pu_244_300K.ace" temperature="2.585e-08" zaid="94244"/>
|
||||
<ace_table alias="Pu-246.72c" awr="243.956" location="1" name="94246.72c" path="300K/Pu_246_300K.ace" temperature="2.585e-08" zaid="94246"/>
|
||||
<ace_table alias="Am-240.72c" awr="237.993" location="1" name="95240.72c" path="300K/Am_240_300K.ace" temperature="2.585e-08" zaid="95240"/>
|
||||
<ace_table alias="Am-241.72c" awr="238.986" location="1" name="95241.72c" path="300K/Am_241_300K.ace" temperature="2.585e-08" zaid="95241"/>
|
||||
<ace_table alias="Am-242.72c" awr="239.9801" location="1" name="95242.72c" path="300K/Am_242_300K.ace" temperature="2.585e-08" zaid="95242"/>
|
||||
<ace_table alias="Am-242m.72c" awr="239.9801" location="1" metastable="1" name="95642.72c" path="300K/Am_242m1_300K.ace" temperature="2.585e-08" zaid="95642"/>
|
||||
<ace_table alias="Am-243.72c" awr="240.9734" location="1" name="95243.72c" path="300K/Am_243_300K.ace" temperature="2.585e-08" zaid="95243"/>
|
||||
<ace_table alias="Am-244.72c" awr="241.968" location="1" name="95244.72c" path="300K/Am_244_300K.ace" temperature="2.585e-08" zaid="95244"/>
|
||||
<ace_table alias="Am-244m.72c" awr="241.968" location="1" metastable="1" name="95644.72c" path="300K/Am_244m1_300K.ace" temperature="2.585e-08" zaid="95644"/>
|
||||
<ace_table alias="Cm-240.72c" awr="237.993" location="1" name="96240.72c" path="300K/Cm_240_300K.ace" temperature="2.585e-08" zaid="96240"/>
|
||||
<ace_table alias="Cm-241.72c" awr="238.987" location="1" name="96241.72c" path="300K/Cm_241_300K.ace" temperature="2.585e-08" zaid="96241"/>
|
||||
<ace_table alias="Cm-242.72c" awr="239.979" location="1" name="96242.72c" path="300K/Cm_242_300K.ace" temperature="2.585e-08" zaid="96242"/>
|
||||
<ace_table alias="Cm-243.72c" awr="240.973" location="1" name="96243.72c" path="300K/Cm_243_300K.ace" temperature="2.585e-08" zaid="96243"/>
|
||||
<ace_table alias="Cm-244.72c" awr="241.966" location="1" name="96244.72c" path="300K/Cm_244_300K.ace" temperature="2.585e-08" zaid="96244"/>
|
||||
<ace_table alias="Cm-245.72c" awr="242.96" location="1" name="96245.72c" path="300K/Cm_245_300K.ace" temperature="2.585e-08" zaid="96245"/>
|
||||
<ace_table alias="Cm-246.72c" awr="243.953" location="1" name="96246.72c" path="300K/Cm_246_300K.ace" temperature="2.585e-08" zaid="96246"/>
|
||||
<ace_table alias="Cm-247.72c" awr="244.948" location="1" name="96247.72c" path="300K/Cm_247_300K.ace" temperature="2.585e-08" zaid="96247"/>
|
||||
<ace_table alias="Cm-248.72c" awr="245.941" location="1" name="96248.72c" path="300K/Cm_248_300K.ace" temperature="2.585e-08" zaid="96248"/>
|
||||
<ace_table alias="Cm-249.72c" awr="246.936" location="1" name="96249.72c" path="300K/Cm_249_300K.ace" temperature="2.585e-08" zaid="96249"/>
|
||||
<ace_table alias="Cm-250.72c" awr="247.93" location="1" name="96250.72c" path="300K/Cm_250_300K.ace" temperature="2.585e-08" zaid="96250"/>
|
||||
<ace_table alias="Bk-245.72c" awr="242.961" location="1" name="97245.72c" path="300K/Bk_245_300K.ace" temperature="2.585e-08" zaid="97245"/>
|
||||
<ace_table alias="Bk-246.72c" awr="243.955" location="1" name="97246.72c" path="300K/Bk_246_300K.ace" temperature="2.585e-08" zaid="97246"/>
|
||||
<ace_table alias="Bk-247.72c" awr="244.948" location="1" name="97247.72c" path="300K/Bk_247_300K.ace" temperature="2.585e-08" zaid="97247"/>
|
||||
<ace_table alias="Bk-248.72c" awr="245.942" location="1" name="97248.72c" path="300K/Bk_248_300K.ace" temperature="2.585e-08" zaid="97248"/>
|
||||
<ace_table alias="Bk-249.72c" awr="246.935" location="1" name="97249.72c" path="300K/Bk_249_300K.ace" temperature="2.585e-08" zaid="97249"/>
|
||||
<ace_table alias="Bk-250.72c" awr="247.93" location="1" name="97250.72c" path="300K/Bk_250_300K.ace" temperature="2.585e-08" zaid="97250"/>
|
||||
<ace_table alias="Cf-246.72c" awr="243.955" location="1" name="98246.72c" path="300K/Cf_246_300K.ace" temperature="2.585e-08" zaid="98246"/>
|
||||
<ace_table alias="Cf-248.72c" awr="245.941" location="1" name="98248.72c" path="300K/Cf_248_300K.ace" temperature="2.585e-08" zaid="98248"/>
|
||||
<ace_table alias="Cf-249.72c" awr="246.935" location="1" name="98249.72c" path="300K/Cf_249_300K.ace" temperature="2.585e-08" zaid="98249"/>
|
||||
<ace_table alias="Cf-250.72c" awr="247.928" location="1" name="98250.72c" path="300K/Cf_250_300K.ace" temperature="2.585e-08" zaid="98250"/>
|
||||
<ace_table alias="Cf-251.72c" awr="248.923" location="1" name="98251.72c" path="300K/Cf_251_300K.ace" temperature="2.585e-08" zaid="98251"/>
|
||||
<ace_table alias="Cf-252.72c" awr="249.916" location="1" name="98252.72c" path="300K/Cf_252_300K.ace" temperature="2.585e-08" zaid="98252"/>
|
||||
<ace_table alias="Cf-253.72c" awr="250.911" location="1" name="98253.72c" path="300K/Cf_253_300K.ace" temperature="2.585e-08" zaid="98253"/>
|
||||
<ace_table alias="Cf-254.72c" awr="251.905" location="1" name="98254.72c" path="300K/Cf_254_300K.ace" temperature="2.585e-08" zaid="98254"/>
|
||||
<ace_table alias="Es-251.72c" awr="248.923" location="1" name="99251.72c" path="300K/Es_251_300K.ace" temperature="2.585e-08" zaid="99251"/>
|
||||
<ace_table alias="Es-252.72c" awr="249.917" location="1" name="99252.72c" path="300K/Es_252_300K.ace" temperature="2.585e-08" zaid="99252"/>
|
||||
<ace_table alias="Es-253.72c" awr="250.911" location="1" name="99253.72c" path="300K/Es_253_300K.ace" temperature="2.585e-08" zaid="99253"/>
|
||||
<ace_table alias="Es-254.72c" awr="251.905" location="1" name="99254.72c" path="300K/Es_254_300K.ace" temperature="2.585e-08" zaid="99254"/>
|
||||
<ace_table alias="Es-254m.72c" awr="251.905" location="1" metastable="1" name="99654.72c" path="300K/Es_254m1_300K.ace" temperature="2.585e-08" zaid="99654"/>
|
||||
<ace_table alias="Es-255.72c" awr="252.899" location="1" name="99255.72c" path="300K/Es_255_300K.ace" temperature="2.585e-08" zaid="99255"/>
|
||||
<ace_table alias="Fm-255.72c" awr="252.899" location="1" name="100255.72c" path="300K/Fm_255_300K.ace" temperature="2.585e-08" zaid="100255"/>
|
||||
<ace_table awr="26.74975" location="1" name="Al.71t" path="tsl/al.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="8.93478" location="1" name="BeBeO.71t" path="tsl/bebeo.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="8.93478" location="1" name="Be.71t" path="tsl/be.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="Benz.71t" path="tsl/benzine.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="1.9968" location="1" name="DD2O.71t" path="tsl/dd2o.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="55.454" location="1" name="Fe.71t" path="tsl/fe.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="11.898" location="1" name="Graph.71t" path="tsl/graphite.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="HCH2.71t" path="tsl/hch2.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="HH2O.71t" path="tsl/hh2o.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="HZrH.71t" path="tsl/hzrh.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="lCH4.71t" path="tsl/lch4.acer" temperature="8.617e-09" zaid="0"/>
|
||||
<ace_table awr="15.85751" location="1" name="OBeO.71t" path="tsl/obeo.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="1.9968" location="1" name="orthoD.71t" path="tsl/orthod.acer" temperature="1.637e-09" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="orthoH.71t" path="tsl/orthoh.acer" temperature="1.723e-09" zaid="0"/>
|
||||
<ace_table awr="15.85751" location="1" name="OUO2.71t" path="tsl/ouo2.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="1.9968" location="1" name="paraD.71t" path="tsl/parad.acer" temperature="1.637e-09" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="paraH.71t" path="tsl/parah.acer" temperature="1.723e-09" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="sCH4.71t" path="tsl/sch4.acer" temperature="1.896e-09" zaid="0"/>
|
||||
<ace_table awr="236.0058" location="1" name="UUO2.71t" path="tsl/uuo2.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="89.1324" location="1" name="ZrZrH.71t" path="tsl/zrzrh.acer" temperature="2.551e-08" zaid="0"/>
|
||||
</cross_sections>
|
||||
File diff suppressed because it is too large
Load diff
207
data/get_jeff_data.py
Executable file
207
data/get_jeff_data.py
Executable file
|
|
@ -0,0 +1,207 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tarfile
|
||||
import zipfile
|
||||
import glob
|
||||
import hashlib
|
||||
import argparse
|
||||
|
||||
import openmc.data
|
||||
|
||||
try:
|
||||
from urllib.request import urlopen
|
||||
except ImportError:
|
||||
from urllib2 import urlopen
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
askuser = raw_input
|
||||
else:
|
||||
askuser = input
|
||||
|
||||
|
||||
download_warning = """
|
||||
WARNING: This script will download approximately 9 GB of data. Extracting and
|
||||
processing the data may require as much as 30 GB of additional free disk
|
||||
space. Note that if you don't need all 11 temperatures, you can modify the
|
||||
'files' list in the script to download only the data you want.
|
||||
|
||||
Are you sure you want to continue? ([y]/n)
|
||||
"""
|
||||
|
||||
thermal_suffix = {20: '01t', 100: '02t', 293: '03t', 296: '03t', 323: '04t',
|
||||
350: '05t', 373: '06t', 400: '07t', 423: '08t', 473: '09t',
|
||||
500: '10t', 523: '11t', 573: '12t', 600: '13t', 623: '14t',
|
||||
643: '15t', 647: '15t', 700: '16t', 773: '17t', 800: '18t',
|
||||
1000: '19t', 1200: '20t', 1600: '21t', 2000: '22t',
|
||||
3000: '23t'}
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('-b', '--batch', action='store_true',
|
||||
help='supresses standard in')
|
||||
args = parser.parse_args()
|
||||
|
||||
response = askuser(download_warning) if not args.batch else 'y'
|
||||
if response.lower().startswith('n'):
|
||||
sys.exit()
|
||||
|
||||
base_url = 'https://www.oecd-nea.org/dbforms/data/eva/evatapes/jeff_32/Processed/'
|
||||
files = ['JEFF32-ACE-293K.tar.gz',
|
||||
'JEFF32-ACE-400K.tar.gz',
|
||||
'JEFF32-ACE-500K.tar.gz',
|
||||
'JEFF32-ACE-600K.tar.gz',
|
||||
'JEFF32-ACE-700K.tar.gz',
|
||||
'JEFF32-ACE-800K.zip',
|
||||
'JEFF32-ACE-900K.tar.gz',
|
||||
'JEFF32-ACE-1000K.tar.gz',
|
||||
'JEFF32-ACE-1200K.tar.gz',
|
||||
'JEFF32-ACE-1500K.tar.gz',
|
||||
'JEFF32-ACE-1800K.tar.gz',
|
||||
'TSLs.tar.gz']
|
||||
|
||||
block_size = 16384
|
||||
|
||||
# ==============================================================================
|
||||
# DOWNLOAD FILES FROM OECD SITE
|
||||
|
||||
files_complete = []
|
||||
for f in files:
|
||||
# Establish connection to URL
|
||||
url = base_url + f
|
||||
req = urlopen(url)
|
||||
|
||||
# Get file size from header
|
||||
if sys.version_info[0] < 3:
|
||||
file_size = int(req.info().getheaders('Content-Length')[0])
|
||||
else:
|
||||
file_size = req.length
|
||||
downloaded = 0
|
||||
|
||||
# Check if file already downloaded
|
||||
if os.path.exists(f):
|
||||
if os.path.getsize(f) == file_size:
|
||||
print('Skipping {}, already downloaded'.format(f))
|
||||
files_complete.append(f)
|
||||
continue
|
||||
else:
|
||||
overwrite = askuser('Overwrite {}? ([y]/n) '.format(f))
|
||||
if overwrite.lower().startswith('n'):
|
||||
continue
|
||||
|
||||
# Copy file to disk
|
||||
print('Downloading {}... '.format(f), end='')
|
||||
with open(f, 'wb') as fh:
|
||||
while True:
|
||||
chunk = req.read(block_size)
|
||||
if not chunk: break
|
||||
fh.write(chunk)
|
||||
downloaded += len(chunk)
|
||||
status = '{:10} [{:3.2f}%]'.format(downloaded, downloaded * 100. / file_size)
|
||||
print(status + chr(8)*len(status), end='')
|
||||
print('')
|
||||
files_complete.append(f)
|
||||
|
||||
# ==============================================================================
|
||||
# EXTRACT FILES FROM TGZ
|
||||
|
||||
for f in files:
|
||||
if f not in files_complete:
|
||||
continue
|
||||
|
||||
# Extract files
|
||||
if f.endswith('.zip'):
|
||||
with zipfile.ZipFile(f, 'r') as zipf:
|
||||
print('Extracting {}...'.format(f))
|
||||
zipf.extractall('jeff-3.2')
|
||||
|
||||
else:
|
||||
suffix = 'ACEs_293K' if '293' in f else ''
|
||||
with tarfile.open(f, 'r') as tgz:
|
||||
print('Extracting {}...'.format(f))
|
||||
tgz.extractall(os.path.join('jeff-3.2', suffix))
|
||||
|
||||
# Remove thermal scattering tables from 293K data since they are
|
||||
# redundant
|
||||
if '293' in f:
|
||||
for path in glob.glob(os.path.join('jeff-3.2', 'ACEs_293K', '*-293.ACE')):
|
||||
os.remove(path)
|
||||
|
||||
# ==============================================================================
|
||||
# FIX ERRORS
|
||||
|
||||
# A few nuclides at 400K has 03c instead of 04c
|
||||
print('Assigning new cross section identifiers...')
|
||||
wrong_nuclides = ['Mn55', 'Mo95', 'Nb93', 'Pd105', 'Pu239', 'Pu240', 'U235',
|
||||
'U238', 'Y89']
|
||||
for nuc in wrong_nuclides:
|
||||
path = os.path.join('jeff-3.2', 'ACEs_400K', nuc + '.ACE')
|
||||
print(' Fixing {} (03c --> 04c)...'.format(path))
|
||||
if os.path.isfile(path):
|
||||
text = open(path, 'r').read()
|
||||
text = text[:7] + '04c' + text[10:]
|
||||
open(path, 'w').write(text)
|
||||
|
||||
# ==============================================================================
|
||||
# CHANGE ZAID FOR METASTABLES
|
||||
|
||||
metastables = glob.glob(os.path.join('jeff-3.2', '**', '*M.ACE'))
|
||||
for path in metastables:
|
||||
print(' Fixing {} (ensure metastable)...'.format(path))
|
||||
text = open(path, 'r').read()
|
||||
mass_first_digit = int(text[3])
|
||||
if mass_first_digit <= 2:
|
||||
text = text[:3] + str(mass_first_digit + 4) + text[4:]
|
||||
open(path, 'w').write(text)
|
||||
|
||||
# ==============================================================================
|
||||
# CHANGE IDENTIFIER FOR S(A,B) TABLES
|
||||
|
||||
thermals = glob.glob(os.path.join('jeff-3.2', 'ANNEX_6_3_STLs', '**', '*.ace'))
|
||||
for path in thermals:
|
||||
print(' Fixing {} (unique suffix)...'.format(path))
|
||||
basename = os.path.basename(path)
|
||||
temperature = int(basename.split('-')[1][:-4])
|
||||
text = open(path, 'r').read()
|
||||
text = text[:7] + thermal_suffix[temperature] + text[10:]
|
||||
open(path, 'w').write(text)
|
||||
|
||||
# ==============================================================================
|
||||
# CONVERT TO BINARY TO SAVE DISK SPACE
|
||||
|
||||
# get a list of all ACE files
|
||||
ace_files = (glob.glob(os.path.join('jeff-3.2', '**', '*.ACE')) +
|
||||
glob.glob(os.path.join('jeff-3.2', 'ANNEX_6_3_STLs', '**', '*.ace')))
|
||||
|
||||
# Ask user to convert
|
||||
if not args.batch:
|
||||
response = askuser('Convert ACE files to binary? ([y]/n) ')
|
||||
else:
|
||||
response = 'y'
|
||||
|
||||
# Convert files if requested
|
||||
if not response or response.lower().startswith('y'):
|
||||
for f in ace_files:
|
||||
print(' Converting {}...'.format(f))
|
||||
openmc.data.ace.ascii_to_binary(f, f)
|
||||
|
||||
# ==============================================================================
|
||||
# PROMPT USER TO GENERATE HDF5 LIBRARY
|
||||
|
||||
# Ask user to convert
|
||||
if not args.batch:
|
||||
response = askuser('Generate HDF5 library? ([y]/n) ')
|
||||
else:
|
||||
response = 'y'
|
||||
|
||||
# Convert files if requested
|
||||
if not response or response.lower().startswith('y'):
|
||||
# Ensure 'import openmc.data' works in the openmc-ace-to-xml script
|
||||
env = os.environ.copy()
|
||||
env['PYTHONPATH'] = os.path.join(os.getcwd(), os.pardir)
|
||||
|
||||
subprocess.call(['../scripts/openmc-ace-to-hdf5', '-d', 'jeff-3.2-hdf5']
|
||||
+ sorted(ace_files), env=env)
|
||||
|
|
@ -20,10 +20,6 @@ try:
|
|||
except ImportError:
|
||||
from urllib2 import urlopen
|
||||
|
||||
cwd = os.getcwd()
|
||||
sys.path.insert(0, os.path.join(cwd, '..'))
|
||||
from openmc.ace import ascii_to_binary
|
||||
|
||||
baseUrl = 'http://www.nndc.bnl.gov/endf/b7.1/aceFiles/'
|
||||
files = ['ENDF-B-VII.1-neutron-293.6K.tar.gz',
|
||||
'ENDF-B-VII.1-tsl.tar.gz']
|
||||
|
|
@ -114,12 +110,6 @@ text = text.replace('6012', '6000', 1)
|
|||
with open(graphite, 'w') as fh:
|
||||
fh.write(text)
|
||||
|
||||
# ==============================================================================
|
||||
# COPY CROSS_SECTIONS.XML
|
||||
|
||||
print('Copying cross_sections_nndc.xml...')
|
||||
shutil.copyfile('cross_sections_nndc.xml', 'nndc/cross_sections.xml')
|
||||
|
||||
# ==============================================================================
|
||||
# PROMPT USER TO DELETE .TAR.GZ FILES
|
||||
|
||||
|
|
@ -140,44 +130,26 @@ if not response or response.lower().startswith('y'):
|
|||
os.remove(f)
|
||||
|
||||
# ==============================================================================
|
||||
# PROMPT USER TO CONVERT ASCII TO BINARY
|
||||
# PROMPT USER TO GENERATE HDF5 LIBRARY
|
||||
|
||||
# Ask user to convert
|
||||
if not args.batch:
|
||||
if sys.version_info[0] < 3:
|
||||
response = raw_input('Convert ACE files to binary? ([y]/n) ')
|
||||
response = raw_input('Generate HDF5 library? ([y]/n) ')
|
||||
else:
|
||||
response = input('Convert ACE files to binary? ([y]/n) ')
|
||||
response = input('Generate HDF5 library? ([y]/n) ')
|
||||
else:
|
||||
response = 'y'
|
||||
|
||||
# Convert files if requested
|
||||
if not response or response.lower().startswith('y'):
|
||||
# get a list of all ACE files
|
||||
ace_files = sorted(glob.glob(os.path.join('nndc', '**', '*.ace*')))
|
||||
|
||||
# get a list of directories
|
||||
ace_dirs = glob.glob(os.path.join('nndc', '*K'))
|
||||
ace_dirs += glob.glob(os.path.join('nndc', 'tsl'))
|
||||
# Ensure 'import openmc.data' works in the openmc-ace-to-xml script
|
||||
cwd = os.getcwd()
|
||||
env = os.environ.copy()
|
||||
env['PYTHONPATH'] = os.path.join(cwd, '..')
|
||||
|
||||
# loop around ace directories
|
||||
for d in ace_dirs:
|
||||
print('Converting {0}...'.format(d))
|
||||
|
||||
# get a list of files to convert
|
||||
ace_files = glob.glob(os.path.join(d, '*.ace*'))
|
||||
|
||||
# convert files
|
||||
for f in ace_files:
|
||||
print(' Converting {0}...'.format(os.path.split(f)[1]))
|
||||
ascii_to_binary(f, f)
|
||||
|
||||
# Change cross_sections.xml file
|
||||
xs_file = os.path.join('nndc', 'cross_sections.xml')
|
||||
asc_str = "<filetype>ascii</filetype>"
|
||||
bin_str = "<filetype> binary </filetype>\n "
|
||||
bin_str += "<record_length> 4096 </record_length>\n "
|
||||
bin_str += "<entries> 512 </entries>"
|
||||
with open(xs_file) as fh:
|
||||
text = fh.read()
|
||||
text = text.replace(asc_str, bin_str)
|
||||
with open(xs_file, 'w') as fh:
|
||||
fh.write(text)
|
||||
subprocess.call(['../scripts/openmc-ace-to-hdf5', '-d', 'nndc_hdf5']
|
||||
+ ace_files, env=env)
|
||||
|
|
|
|||
|
|
@ -8,3 +8,11 @@
|
|||
max-width: 100%;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.wy-plain-list-disc, .rst-content .section ul, .rst-content .toctree-wrapper ul, article ul {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.wy-table, .rst-content table.docutils, .rst-content table.field-list {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ except ImportError:
|
|||
from mock import Mock as MagicMock
|
||||
|
||||
|
||||
MOCK_MODULES = ['numpy', 'h5py', 'pandas', 'opencg']
|
||||
MOCK_MODULES = ['numpy', 'numpy.polynomial', 'numpy.polynomial.polynomial',
|
||||
'h5py', 'pandas', 'opencg']
|
||||
sys.modules.update((mod_name, MagicMock()) for mod_name in MOCK_MODULES)
|
||||
|
||||
|
||||
|
|
@ -69,9 +70,9 @@ copyright = u'2011-2016, Massachusetts Institute of Technology'
|
|||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = "0.7"
|
||||
version = "0.8"
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = "0.7.1"
|
||||
release = "0.8.0"
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@ The OpenMC Monte Carlo Code
|
|||
OpenMC is a Monte Carlo particle transport simulation code focused on neutron
|
||||
criticality calculations. It is capable of simulating 3D models based on
|
||||
constructive solid geometry with second-order surfaces. OpenMC supports either
|
||||
continuous-energy or multi-group transport. The continuous-energy
|
||||
particle interaction data is based on ACE format cross sections, also used
|
||||
in the MCNP and Serpent Monte Carlo codes.
|
||||
continuous-energy or multi-group transport. The continuous-energy particle
|
||||
interaction data is based on a native HDF5 format that can be generated from ACE
|
||||
files used by the MCNP and Serpent Monte Carlo codes.
|
||||
|
||||
OpenMC was originally developed by members of the `Computational Reactor Physics
|
||||
Group`_ at the `Massachusetts Institute of Technology`_ starting
|
||||
|
|
|
|||
|
|
@ -4,12 +4,26 @@
|
|||
File Format Specifications
|
||||
==========================
|
||||
|
||||
----------
|
||||
Data Files
|
||||
----------
|
||||
|
||||
.. toctree::
|
||||
:numbered:
|
||||
:maxdepth: 3
|
||||
:maxdepth: 2
|
||||
|
||||
data_wmp
|
||||
nuclear_data
|
||||
mgxs_library
|
||||
data_wmp
|
||||
|
||||
------------
|
||||
Output Files
|
||||
------------
|
||||
|
||||
.. toctree::
|
||||
:numbered:
|
||||
:maxdepth: 2
|
||||
|
||||
statepoint
|
||||
source
|
||||
summary
|
||||
|
|
|
|||
354
docs/source/io_formats/nuclear_data.rst
Normal file
354
docs/source/io_formats/nuclear_data.rst
Normal file
|
|
@ -0,0 +1,354 @@
|
|||
.. _usersguide_nuclear_data:
|
||||
|
||||
========================
|
||||
Nuclear Data File Format
|
||||
========================
|
||||
|
||||
---------------------
|
||||
Incident Neutron Data
|
||||
---------------------
|
||||
|
||||
|
||||
**/<nuclide name>/**
|
||||
|
||||
:Attributes: - **Z** (*int*) -- Atomic number
|
||||
- **A** (*int*) -- Mass number. For a natural element, A=0 is given.
|
||||
- **metastable** (*int*) -- Metastable state (0=ground, 1=first
|
||||
excited, etc.)
|
||||
- **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses
|
||||
- **temperature** (*double*) -- Temperature in MeV
|
||||
- **n_reaction** (*int*) -- Number of reactions
|
||||
|
||||
:Datasets: - **energy** (*double[]*) -- Energy points at which cross sections are tabulated
|
||||
|
||||
**/<nuclide name>/reactions/reaction_<mt>/**
|
||||
|
||||
:Attributes: - **mt** (*int*) -- ENDF MT reaction number
|
||||
- **label** (*char[]*) -- Name of the reaction
|
||||
- **Q_value** (*double*) -- Q value in MeV
|
||||
- **threshold_idx** (*int*) -- Index on the energy grid that the
|
||||
reaction threshold corresponds to
|
||||
- **center_of_mass** (*int*) -- Whether the reference frame for
|
||||
scattering is center-of-mass (1) or laboratory (0)
|
||||
- **n_product** (*int*) -- Number of reaction products
|
||||
|
||||
:Datasets: - **xs** (*double[]*) -- Cross section values tabulated against the nuclide energy grid
|
||||
|
||||
**/<nuclide name>/reactions/reaction_<mt>/product_<j>/**
|
||||
|
||||
Reaction product data is described in :ref:`product`.
|
||||
|
||||
**/<nuclide name>/urr**
|
||||
|
||||
:Attributes: - **interpolation** (*int*) -- interpolation scheme
|
||||
- **inelastic** (*int*) -- flag indicating inelastic scattering
|
||||
- **other_absorb** (*int*) -- flag indicating other absorption
|
||||
- **factors** (*int*) -- flag indicating whether tables are
|
||||
absolute or multipliers
|
||||
|
||||
:Datasets: - **energy** (*double[]*) -- Energy at which probability tables exist
|
||||
- **table** (*double[][][]*) -- Probability tables
|
||||
|
||||
**/<nuclide name>/total_nu/**
|
||||
|
||||
This special product is used to define the total number of neutrons produced
|
||||
from fission. It is formatted as a reaction product, described in
|
||||
:ref:`product`.
|
||||
|
||||
-------------------------------
|
||||
Thermal Neutron Scattering Data
|
||||
-------------------------------
|
||||
|
||||
**/<thermal name>/**
|
||||
|
||||
:Attributes: - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses
|
||||
- **temperature** (*double*) -- Temperature in MeV
|
||||
- **zaids** (*int[]*) -- ZAID identifiers for which the thermal
|
||||
scattering data applies to
|
||||
|
||||
**/<thermal name>/elastic/**
|
||||
|
||||
:Datasets: - **xs** (:ref:`tabulated <1d_tabulated>`) -- Thermal inelastic
|
||||
scattering cross section
|
||||
- **mu_out** (*double[][]*) -- Distribution of outgoing energies
|
||||
and angles for coherent elastic scattering
|
||||
|
||||
**/<thermal name>/inelastic/**
|
||||
|
||||
:Attributes:
|
||||
- **secondary_mode** (*char[]*) -- Indicates how the inelastic
|
||||
outgoing angle-energy distributions are represented ('equal',
|
||||
'skewed', or 'continuous').
|
||||
|
||||
:Datasets: - **xs** (:ref:`tabulated <1d_tabulated>`) -- Thermal inelastic
|
||||
scattering cross section
|
||||
- **energy_out** (*double[][]*) -- Distribution of outgoing
|
||||
energies for each incoming energy. Only present if secondary mode
|
||||
is not continuous.
|
||||
- **mu_out** (*double[][][]*) -- Distribution of scattering cosines
|
||||
for each pair of incoming and outgoing energies. Only present if
|
||||
secondary mode is not continuous.
|
||||
|
||||
If the secondary mode is continuous, the outgoing energy-angle distribution is
|
||||
given as a :ref:`correlated angle-energy distribution
|
||||
<correlated_angle_energy>`.
|
||||
|
||||
.. _product:
|
||||
|
||||
-----------------
|
||||
Reaction Products
|
||||
-----------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **particle** (*char[]*) -- Type of particle
|
||||
- **emission_mode** (*char[]*) -- Emission mode (prompt, delayed,
|
||||
total)
|
||||
- **decay_rate** (*double*) -- Rate of decay in inverse seconds
|
||||
- **n_distribution** (*int*) -- Number of angle/energy
|
||||
distributions
|
||||
:Datasets:
|
||||
- **yield** (:ref:`function <1d_functions>`) -- Energy-dependent
|
||||
yield of the product.
|
||||
|
||||
:Groups:
|
||||
- **distribution_<k>** -- Formats for angle-energy distributions are
|
||||
detailed in :ref:`angle_energy`. When multiple angle-energy
|
||||
distributions occur, one dataset also may appear for each
|
||||
distribution:
|
||||
|
||||
:Datasets:
|
||||
- **applicability** (:ref:`function <1d_functions>`) --
|
||||
Probability of selecting this distribution as a function
|
||||
of incident energy
|
||||
|
||||
.. _1d_functions:
|
||||
|
||||
-------------------------
|
||||
One-dimensional Functions
|
||||
-------------------------
|
||||
|
||||
Scalar
|
||||
------
|
||||
|
||||
:Object type: Dataset
|
||||
:Datatype: *double*
|
||||
:Attributes: - **type** (*char[]*) -- 'constant'
|
||||
|
||||
.. _1d_tabulated:
|
||||
|
||||
Tabulated
|
||||
---------
|
||||
|
||||
:Object type: Dataset
|
||||
:Datatype: *double[2][]*
|
||||
:Description: x-values are listed first followed by corresponding y-values
|
||||
:Attributes: - **type** (*char[]*) -- 'tabulated'
|
||||
- **breakpoints** (*int[]*) -- Region breakpoints
|
||||
- **interpolation** (*int[]*) -- Region interpolation codes
|
||||
|
||||
Polynomial
|
||||
----------
|
||||
|
||||
:Object type: Dataset
|
||||
:Datatype: *double[]*
|
||||
:Description: Polynomial coefficients listed in order of increasing power
|
||||
:Attributes: - **type** (*char[]*) -- 'polynomial'
|
||||
|
||||
Coherent elastic scattering
|
||||
---------------------------
|
||||
|
||||
:Object type: Dataset
|
||||
:Datatype: *double[2][]*
|
||||
:Description: The first row lists Bragg edges and the second row lists structure
|
||||
factor cumulative sums.
|
||||
:Attributes: - **type** (*char[]*) -- 'bragg'
|
||||
|
||||
.. _angle_energy:
|
||||
|
||||
--------------------------
|
||||
Angle-Energy Distributions
|
||||
--------------------------
|
||||
|
||||
Uncorrelated Angle-Energy
|
||||
-------------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'uncorrelated'
|
||||
:Datasets: - **angle/energy** (*double[]*) -- energies at which angle distributions exist
|
||||
- **angle/mu** (*double[3][]*) -- tabulated angular distributions for
|
||||
each energy. The first row gives :math:`\mu` values, the second row
|
||||
gives the probability density, and the third row gives the
|
||||
cumulative distribution.
|
||||
|
||||
:Attributes: - **offsets** (*int[]*) -- indices indicating where
|
||||
each angular distribution starts
|
||||
- **interpolation** (*int[]*) -- interpolation code
|
||||
for each angular distribution
|
||||
|
||||
:Groups: - **energy/** (:ref:`energy distribution <energy_distribution>`)
|
||||
|
||||
.. _correlated_angle_energy:
|
||||
|
||||
Correlated Angle-Energy
|
||||
-----------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'correlated'
|
||||
:Datasets: - **energy** (*double[]*) -- Incoming energies at which distributions exist
|
||||
|
||||
:Attributes:
|
||||
- **interpolation** (*double[2][]*) -- Breakpoints and
|
||||
interpolation codes for incoming energy regions
|
||||
|
||||
- **energy_out** (*double[5][]*) -- Distribution of outgoing energies
|
||||
corresponding to each incoming energy. The distributions are
|
||||
flattened into a single array; the start of a given distribution
|
||||
can be determined using the ``offsets`` attribute. The first row
|
||||
gives outgoing energies, the second row gives the probability
|
||||
density, the third row gives the cumulative distribution, the
|
||||
fourth row gives interpolation codes for angular distributions, and
|
||||
the fifth row gives offsets for angular distributions.
|
||||
|
||||
:Attributes: - **offsets** (*double[]*) -- Offset for each
|
||||
distribution
|
||||
- **interpolation** (*int[]*) -- Interpolation code
|
||||
for each distribution
|
||||
- **n_discrete_lines** (*int[]*) -- Number of discrete
|
||||
lines in each distribution
|
||||
|
||||
- **mu** (*double[3][]*) -- Distribution of angular cosines
|
||||
corresponding to each pair of incoming and outgoing energies. The
|
||||
distributions are flattened into a single array; the start of a
|
||||
given distribution can be determined using offsets in the fifth row
|
||||
of the ``energy_out`` dataset. The first row gives angular cosines,
|
||||
the second row gives the probability density, and the third row
|
||||
gives the cumulative distribution.
|
||||
|
||||
Kalbach-Mann
|
||||
------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'kalbach-mann'
|
||||
:Datasets: - **energy** (*double[]*) -- Incoming energies at which distributions exist
|
||||
|
||||
:Attributes:
|
||||
- **interpolation** (*double[2][]*) -- Breakpoints and
|
||||
interpolation codes for incoming energy regions
|
||||
|
||||
- **distribution** (*double[5][]*) -- Distribution of outgoing
|
||||
energies and angles corresponding to each incoming energy. The
|
||||
distributions are flattened into a single array; the start of a
|
||||
given distribution can be determined using the ``offsets``
|
||||
attribute. The first row gives outgoing energies, the second row
|
||||
gives the probability density, the third row gives the cumulative
|
||||
distribution, the fourth row gives Kalbach-Mann precompound
|
||||
factors, and the fifth row gives Kalbach-Mann angular distribution
|
||||
slopes.
|
||||
|
||||
:Attributes: - **offsets** (*double[]*) -- Offset for each
|
||||
distribution
|
||||
- **interpolation** (*int[]*) -- Interpolation code
|
||||
for each distribution
|
||||
- **n_discrete_lines** (*int[]*) -- Number of discrete
|
||||
lines in each distribution
|
||||
|
||||
N-Body Phase Space
|
||||
------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'nbody'
|
||||
- **total_mass** (*double*) -- Total mass of product particles
|
||||
- **n_particles** (*int*) -- Number of product particles
|
||||
- **atomic_weight_ratio** (*double*) -- Atomic weight ratio of the
|
||||
target nuclide in neutron masses
|
||||
- **q_value** (*double*) -- Q value for the reaction in MeV
|
||||
|
||||
.. _energy_distribution:
|
||||
|
||||
--------------------
|
||||
Energy Distributions
|
||||
--------------------
|
||||
|
||||
Maxwell
|
||||
-------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'maxwell'
|
||||
- **u** (*double*) -- Restriction energy in MeV
|
||||
:Datasets:
|
||||
- **theta** (:ref:`tabulated <1d_tabulated>`) -- Maxwellian
|
||||
temperature as a function of energy
|
||||
|
||||
Evaporation
|
||||
-----------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'evaporation'
|
||||
- **u** (*double*) -- Restriction energy in MeV
|
||||
:Datasets:
|
||||
- **theta** (:ref:`tabulated <1d_tabulated>`) -- Evaporation
|
||||
temperature as a function of energy
|
||||
|
||||
Watt Fission Spectrum
|
||||
---------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'watt'
|
||||
- **u** (*double*) -- Restriction energy in MeV
|
||||
:Datasets: - **a** (:ref:`tabulated <1d_tabulated>`) -- Watt parameter :math:`a`
|
||||
as a function of incident energy
|
||||
- **b** (:ref:`tabulated <1d_tabulated>`) -- Watt parameter :math:`b`
|
||||
as a function of incident energy
|
||||
|
||||
Madland-Nix
|
||||
-----------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'watt'
|
||||
- **efl** (*double*) -- Average energy of light fragment in eV
|
||||
- **efh** (*double*) -- Average energy of heavy fragment in eV
|
||||
|
||||
Discrete Photon
|
||||
---------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'discrete_photon'
|
||||
- **primary_flag** (*int*) -- Whether photon is a primary
|
||||
- **energy** (*double*) -- Photon energy in MeV
|
||||
- **atomic_weight_ratio** (*double*) -- Atomic weight ratio of
|
||||
target nuclide in neutron masses
|
||||
|
||||
Level Inelastic
|
||||
---------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'level'
|
||||
- **threshold** (*double*) -- Energy threshold in the laboratory
|
||||
system in MeV
|
||||
- **mass_ratio** (*double*) -- :math:`(A/(A + 1))^2`
|
||||
|
||||
Continuous Tabular
|
||||
------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'continuous'
|
||||
:Datasets: - **energy** (*double[]*) -- Incoming energies at which distributions exist
|
||||
|
||||
:Attributes:
|
||||
- **interpolation** (*double[2][]*) -- Breakpoints and
|
||||
interpolation codes for incoming energy regions
|
||||
|
||||
- **distribution** (*double[3][]*) -- Distribution of outgoing
|
||||
energies corresponding to each incoming energy. The distributions
|
||||
are flattened into a single array; the start of a given
|
||||
distribution can be determined using the ``offsets`` attribute. The
|
||||
first row gives outgoing energies, the second row gives the
|
||||
probability density, and the third row gives the cumulative
|
||||
distribution.
|
||||
|
||||
:Attributes: - **offsets** (*double[]*) -- Offset for each
|
||||
distribution
|
||||
- **interpolation** (*int[]*) -- Interpolation code
|
||||
for each distribution
|
||||
- **n_discrete_lines** (*int[]*) -- Number of discrete
|
||||
lines in each distribution
|
||||
|
|
@ -205,7 +205,7 @@ traveling in its current direction, it will not hit the surface. The complete
|
|||
derivation for different types of surfaces used in OpenMC will be presented in
|
||||
the following sections.
|
||||
|
||||
Since :math:f(x,y,z)` in general is quadratic in :math:`x`, :math:`y`, and
|
||||
Since :math:`f(x,y,z)` in general is quadratic in :math:`x`, :math:`y`, and
|
||||
:math:`z`, this implies that :math:`f(x_0 + du_0, y + dv_0, z + dw_0)` is
|
||||
quadratic in :math:`d`. Thus we expect at most two real solutions to
|
||||
:eq:`dist-to-boundary-1`. If no solutions to :eq:`dist-to-boundary-1` exist or
|
||||
|
|
|
|||
|
|
@ -279,9 +279,9 @@ idiosyncrasies in treating fission. In an eigenvalue calculation, secondary
|
|||
neutrons from fission are only "banked" for use in the next generation rather
|
||||
than being tracked as secondary neutrons from elastic and inelastic scattering
|
||||
would be. On top of this, fission is sometimes broken into first-chance fission,
|
||||
second-chance fission, etc. An ACE table either lists the partial fission
|
||||
reactions with secondary energy distributions for each one, or a total fission
|
||||
reaction with a single secondary energy distribution.
|
||||
second-chance fission, etc. The nuclear data file either lists the partial
|
||||
fission reactions with secondary energy distributions for each one, or a total
|
||||
fission reaction with a single secondary energy distribution.
|
||||
|
||||
When a fission reaction is sampled in OpenMC (either total fission or, if data
|
||||
exists, first- or second-chance fission), the following algorithm is used to
|
||||
|
|
@ -290,7 +290,7 @@ number of prompt and delayed neutrons must be determined to decide whether the
|
|||
secondary neutrons will be prompt or delayed. This is important because delayed
|
||||
neutrons have a markedly different spectrum from prompt neutrons, one that has a
|
||||
lower average energy of emission. The total number of neutrons emitted
|
||||
:math:`\nu_t` is given as a function of incident energy in the ACE format. Two
|
||||
:math:`\nu_t` is given as a function of incident energy in the ENDF format. Two
|
||||
representations exist for :math:`\nu_t`. The first is a polynomial of order
|
||||
:math:`N` with coefficients :math:`c_0,c_1,\dots,c_N`. If :math:`\nu_t` has this
|
||||
format, we can evaluate it at incoming energy :math:`E` by using the equation
|
||||
|
|
@ -347,26 +347,52 @@ provided as group-wise data instead of in a continuous-energy format. In this
|
|||
case, the outgoing energy of the fission neutrons are represented as histograms
|
||||
by way of either the nu-fission matrix or chi vector.
|
||||
|
||||
-----------------------------------------
|
||||
Secondary Angles and Energy Distributions
|
||||
-----------------------------------------
|
||||
------------------------------------
|
||||
Secondary Angle-Energy Distributions
|
||||
------------------------------------
|
||||
|
||||
Note that this section is specific to continuous-energy mode since the
|
||||
multi-group scattering process has already been described including the
|
||||
secondary energy and angle sampling.
|
||||
|
||||
For any reactions with secondary neutrons, it is necessary to sample secondary
|
||||
angle and energy distributions. This includes elastic and inelastic scattering,
|
||||
fission, and :math:`(n,xn)` reactions. In some cases, the angle and energy
|
||||
distributions may be specified separately, and in other cases, they may be
|
||||
specified as a correlated angle-energy distribution. In the following sections,
|
||||
we will outline the methods used to sample secondary distributions as well as
|
||||
how they are used to modify the state of a particle.
|
||||
For a reaction with secondary products, it is necessary to determine the
|
||||
outgoing angle and energy of the products. For any reaction other than elastic
|
||||
and level inelastic scattering, the outgoing energy must be determined based on
|
||||
tabulated or parameterized data. The `ENDF-6 Format`_ specifies a variety of
|
||||
ways that the secondary energy distribution can be represented. ENDF File 5
|
||||
contains uncorrelated energy distribution whereas ENDF File 6 contains
|
||||
correlated energy-angle distributions. The ACE format specifies its own
|
||||
representations based loosely on the formats given in ENDF-6. OpenMC's HDF5
|
||||
nuclear data files use a combination of ENDF and ACE distributions; in this
|
||||
section, we will describe how the outgoing angle and energy of secondary
|
||||
particles are sampled.
|
||||
|
||||
One of the subtleties in the nuclear data format is the fact that a single
|
||||
reaction product can have multiple angle-energy distributions. This is mainly
|
||||
useful for reactions with multiple products of the same type in the exit channel
|
||||
such as :math:`(n,2n)` or :math:`(n,3n)`. In these types of reactions, each
|
||||
neutron is emitted corresponding to a different excitation level of the compound
|
||||
nucleus, and thus in general the neutrons will originate from different energy
|
||||
distributions. If multiple angle-energy distributions are present, they are
|
||||
assigned incoming-energy-dependent probabilities that can then be used to
|
||||
randomly select one.
|
||||
|
||||
Once a distribution has been selected, the procedure for determining the
|
||||
outgoing angle and energy will depend on the type of the distribution.
|
||||
|
||||
Uncorrelated Angle-Energy Distributions
|
||||
---------------------------------------
|
||||
|
||||
The first set of distributions we will look at are uncorrelated angle-energy
|
||||
distributions, where angle and energy are specified separately. For these
|
||||
distributions, OpenMC first samples the angular distribution as described
|
||||
:ref:`sample-angle` and then samples an energy as described in
|
||||
:ref:`sample-energy`.
|
||||
|
||||
.. _sample-angle:
|
||||
|
||||
Sampling Secondary Angle Distributions
|
||||
--------------------------------------
|
||||
Sampling Angular Distributions
|
||||
++++++++++++++++++++++++++++++
|
||||
|
||||
For elastic scattering, it is only necessary to specific a secondary angle
|
||||
distribution since the outgoing energy can be determined analytically. Other
|
||||
|
|
@ -374,15 +400,14 @@ reactions may also have separate secondary angle and secondary energy
|
|||
distributions that are uncorrelated. In these cases, the secondary angle
|
||||
distribution is represented as either
|
||||
|
||||
- An Isotropic angular distribution,
|
||||
- An equiprobable distribution with 32 bins, or
|
||||
- An isotropic angular distribution,
|
||||
- A tabular distribution.
|
||||
|
||||
Isotropic Angular Distribution
|
||||
++++++++++++++++++++++++++++++
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
In the first case, no data needs to be stored on the ACE table, and the cosine
|
||||
of the scattering angle is simply calculated as
|
||||
In the first case, no data is stored in the nuclear data file, and the cosine of
|
||||
the scattering angle is simply calculated as
|
||||
|
||||
.. math::
|
||||
:label: isotropic-angle
|
||||
|
|
@ -392,42 +417,17 @@ of the scattering angle is simply calculated as
|
|||
where :math:`\mu` is the cosine of the scattering angle and :math:`\xi` is a
|
||||
random number sampled uniformly on :math:`[0,1)`.
|
||||
|
||||
Equiprobable Angle Bin Distribution
|
||||
+++++++++++++++++++++++++++++++++++
|
||||
|
||||
For a 32 equiprobable bin distribution, we select a random number :math:`\xi` to
|
||||
sample a cosine bin :math:`i` such that
|
||||
|
||||
.. math::
|
||||
:label: equiprobable-bin
|
||||
|
||||
i = 1 + \lfloor 32\xi \rfloor.
|
||||
|
||||
The same random number can then also be used to interpolate between neighboring
|
||||
:math:`\mu` values to get the final scattering cosine:
|
||||
|
||||
.. math::
|
||||
:label: equiprobable-cosine
|
||||
|
||||
\mu = \mu_i + (32\xi - i) (\mu_{i+1} - \mu_i)
|
||||
|
||||
where :math:`\mu_i` is the :math:`i`-th scattering cosine.
|
||||
|
||||
.. _angle-tabular:
|
||||
|
||||
Tabular Angular Distribution
|
||||
++++++++++++++++++++++++++++
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
As the `MCNP Manual`_ points out, using an equiprobable bin distribution works
|
||||
well for high-probability regions of the scattering cosine probability, but for
|
||||
low-probability regions it is not very accurate. Thus, a more accurate method is
|
||||
to represent the scattering cosine with a tabular distribution. In this case, we
|
||||
have a table of cosines and their corresponding values for a probability
|
||||
distribution function and cumulative distribution function. For each incoming
|
||||
neutron energy :math:`E_i`, let us call :math:`p_{i,j}` the j-th value in the
|
||||
probability distribution function and :math:`c_{i,j}` the j-th value in the
|
||||
cumulative distribution function. We first find the interpolation factor on the
|
||||
incoming energy grid:
|
||||
In this case, we have a table of cosines and their corresponding values for a
|
||||
probability distribution function and cumulative distribution function. For each
|
||||
incoming neutron energy :math:`E_i`, let us call :math:`p_{i,j}` the j-th value
|
||||
in the probability distribution function and :math:`c_{i,j}` the j-th value in
|
||||
the cumulative distribution function. We first find the interpolation factor on
|
||||
the incoming energy grid:
|
||||
|
||||
.. math::
|
||||
:label: interpolation-factor
|
||||
|
|
@ -545,89 +545,11 @@ linear-linear interpolation:
|
|||
|
||||
.. _sample-energy:
|
||||
|
||||
Sampling Secondary Energy and Correlated Angle/Energy Distributions
|
||||
-------------------------------------------------------------------
|
||||
Sampling Energy Distributions
|
||||
+++++++++++++++++++++++++++++
|
||||
|
||||
For a reaction with secondary neutrons, it is necessary to determine the
|
||||
outgoing energy of the neutrons. For any reaction other than elastic scattering,
|
||||
the outgoing energy must be determined based on tabulated or parameterized
|
||||
data. The `ENDF-6 Format`_ specifies a variety of ways that the secondary energy
|
||||
distribution can be represented. ENDF File 5 contains uncorrelated energy
|
||||
distribution where ENDF File 6 contains correlated energy-angle
|
||||
distributions. The ACE format specifies its own representations based loosely on
|
||||
the formats given in ENDF-6. In this section, we will describe how the outgoing
|
||||
energy of secondary particles is determined based on each ACE law.
|
||||
|
||||
One of the subtleties in the ACE format is the fact that a single reaction can
|
||||
have multiple secondary energy distributions. This is mainly useful for
|
||||
reactions with multiple neutrons in the exit channel such as :math:`(n,2n)` or
|
||||
:math:`(n,3n)`. In these types of reactions, each neutron is emitted
|
||||
corresponding to a different excitation level of the compound nucleus, and thus
|
||||
in general the neutrons will originate from different energy distributions. If
|
||||
multiple energy distributions are present, they are assigned probabilities that
|
||||
can then be used to randomly select one.
|
||||
|
||||
Once a secondary energy distribution has been sampled, the procedure for
|
||||
determining the outgoing energy will depend on which ACE law has been specified
|
||||
for the data.
|
||||
|
||||
.. _ace-law-1:
|
||||
|
||||
ACE Law 1 - Tabular Equiprobable Energy Bins
|
||||
++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
In the tabular equiprobable bin representation, an array of equiprobable
|
||||
outgoing energy bins is given for a number of incident energies. While the
|
||||
representation itself is simple, the complexity lies in how one interpolates
|
||||
between incident as well as outgoing energies on such a table. If one performs
|
||||
simple interpolation between tables for neighboring incident energies, it is
|
||||
possible that the resulting energies would violate laws governing the
|
||||
kinematics, i.e. the outgoing energy may be outside the range of available
|
||||
energy in the reaction.
|
||||
|
||||
To avoid this situation, the accepted practice is to use a process known as
|
||||
scaled interpolation [Doyas]_. First, we find the tabulated incident energies
|
||||
which bound the actual incoming energy of the particle, i.e. find :math:`i` such
|
||||
that :math:`E_i < E < E_{i+1}` and calculate the interpolation factor :math:`f`
|
||||
via :eq:`interpolation-factor`. Then, we interpolate between the minimum and
|
||||
maximum energies of the outgoing energy distributions corresponding to
|
||||
:math:`E_i` and :math:`E_{i+1}`:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-1-minmax
|
||||
|
||||
E_{min} = E_{i,1} + f ( E_{i+1,1} - E_i ) \\
|
||||
E_{max} = E_{i,M} + f ( E_{i+1,M} - E_M )
|
||||
|
||||
where :math:`E_{min}` and :math:`E_{max}` are the minimum and maximum outgoing
|
||||
energies of a scaled distribution, :math:`E_{i,j}` is the j-th outgoing energy
|
||||
corresponding to the incoming energy :math:`E_i`, and :math:`M` is the number of
|
||||
outgoing energy bins. Next, statistical interpolation is performed to choose
|
||||
between using the outgoing energy distributions corresponding to energy
|
||||
:math:`E_i` and :math:`E_{i+1}`. Let :math:`\ell` be the chosen table where
|
||||
:math:`\ell = i` if :math:`\xi_1 > f` and :math:`\ell = i + 1` otherwise, and
|
||||
:math:`\xi_1` is a random number. Now, we randomly sample an equiprobable
|
||||
outgoing energy bin :math:`j` and interpolate between successive values on the
|
||||
outgoing energy distribution:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-1-intermediate
|
||||
|
||||
\hat{E} = E_{\ell,j} + \xi_2 (E_{\ell,j+1} - E_{\ell,j})
|
||||
|
||||
where :math:`\xi_2` is a random number sampled uniformly on :math:`[0,1)`. Since
|
||||
this outgoing energy may violate reaction kinematics, we then scale it to the
|
||||
minimum and maximum energies we calculated earlier to get the final outgoing
|
||||
energy:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-1-energy
|
||||
|
||||
E' = E_{min} + \frac{\hat{E} - E_{\ell,1}}{E_{\ell,M} - E_{\ell,1}}
|
||||
(E_{max} - E_{min})
|
||||
|
||||
ACE Law 3 - Inelastic Level Scattering
|
||||
++++++++++++++++++++++++++++++++++++++
|
||||
Inelastic Level Scattering
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
It can be shown (see Foderaro_) that in inelastic level scattering, the outgoing
|
||||
energy of the neutron :math:`E'` can be related to the Q-value of the reaction
|
||||
|
|
@ -640,31 +562,50 @@ and the incoming energy:
|
|||
|
||||
where :math:`A` is the mass of the target nucleus measured in neutron masses.
|
||||
|
||||
.. _ace-law-4:
|
||||
.. _continuous-tabular:
|
||||
|
||||
ACE Law 4 - Continuous Tabular Distribution
|
||||
+++++++++++++++++++++++++++++++++++++++++++
|
||||
Continuous Tabular Distribution
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
This representation is very similar to :ref:`ace-law-1` except that instead of
|
||||
equiprobable outgoing energy bins, the outgoing energy distribution for each
|
||||
incoming energy is represented with a probability distribution function. For
|
||||
each incoming neutron energy :math:`E_i`, let us call :math:`p_{i,j}` the j-th
|
||||
value in the probability distribution function, :math:`c_{i,j}` the j-th value
|
||||
in the cumulative distribution function, and :math:`E_{i,j}` the j-th outgoing
|
||||
energy.
|
||||
In a continuous tabular distribution, a tabulated energy distribution is
|
||||
provided for each of a set of incoming energies. While the representation itself
|
||||
is simple, the complexity lies in how one interpolates between incident as well
|
||||
as outgoing energies on such a table. If one performs simple interpolation
|
||||
between tables for neighboring incident energies, it is possible that the
|
||||
resulting energies would violate laws governing the kinematics, i.e., the
|
||||
outgoing energy may be outside the range of available energy in the reaction.
|
||||
|
||||
We proceed first as we did for ACE Law 1, determining the bounding energies of
|
||||
the particle's incoming energy such that :math:`E_i < E < E_{i+1}` and
|
||||
calculating an interpolation factor :math:`f` with equation
|
||||
:eq:`interpolation-factor`. Next, statistical interpolation is performed to
|
||||
choose between using the outgoing energy distributions corresponding to energy
|
||||
:math:`E_i` and :math:`E_{i+1}`. Let :math:`\ell` be the chosen table where
|
||||
:math:`\ell = i` if :math:`\xi_1 > f` and :math:`\ell = i + 1` otherwise, and
|
||||
:math:`\xi_1` is a random number. Then, we sample an outgoing energy bin
|
||||
To avoid this situation, the accepted practice is to use a process known as
|
||||
scaled interpolation [Doyas]_. First, we find the tabulated incident energies
|
||||
which bound the actual incoming energy of the particle, i.e., find :math:`i`
|
||||
such that :math:`E_i < E < E_{i+1}` and calculate the interpolation factor
|
||||
:math:`f` via :eq:`interpolation-factor`. Then, we interpolate between the
|
||||
minimum and maximum energies of the outgoing energy distributions corresponding
|
||||
to :math:`E_i` and :math:`E_{i+1}`:
|
||||
|
||||
.. math::
|
||||
:label: continuous-minmax
|
||||
|
||||
E_{min} = E_{i,1} + f ( E_{i+1,1} - E_{i,1} ) \\
|
||||
E_{max} = E_{i,M} + f ( E_{i+1,M} - E_{i,M} )
|
||||
|
||||
where :math:`E_{min}` and :math:`E_{max}` are the minimum and maximum outgoing
|
||||
energies of a scaled distribution, :math:`E_{i,j}` is the j-th outgoing energy
|
||||
corresponding to the incoming energy :math:`E_i`, and :math:`M` is the number of
|
||||
outgoing energy bins.
|
||||
|
||||
Next, statistical interpolation is performed to choose between using the
|
||||
outgoing energy distributions corresponding to energy :math:`E_i` and
|
||||
:math:`E_{i+1}`. Let :math:`\ell` be the chosen table where :math:`\ell = i` if
|
||||
:math:`\xi_1 > f` and :math:`\ell = i + 1` otherwise, and :math:`\xi_1` is a
|
||||
random number. For each incoming neutron energy :math:`E_i`, let us call
|
||||
:math:`p_{i,j}` the j-th value in the probability distribution function,
|
||||
:math:`c_{i,j}` the j-th value in the cumulative distribution function, and
|
||||
:math:`E_{i,j}` the j-th outgoing energy. We then sample an outgoing energy bin
|
||||
:math:`j` using the cumulative distribution function:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-4-sample-cdf
|
||||
:label: continuous-sample-cdf
|
||||
|
||||
c_{\ell,j} < \xi_2 < c_{\ell,j+1}
|
||||
|
||||
|
|
@ -692,22 +633,22 @@ If linear-linear interpolation is to be used, the outgoing energy on the
|
|||
\right ).
|
||||
|
||||
Since this outgoing energy may violate reaction kinematics, we then scale it to
|
||||
minimum and maximum energies interpolated between the neighboring outgoing
|
||||
energy distributions to get the final outgoing energy:
|
||||
minimum and maximum energies calculated in equation :eq:`continuous-minmax` to
|
||||
get the final outgoing energy:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-4-energy
|
||||
:label: continuous-eout
|
||||
|
||||
E' = E_{min} + \frac{\hat{E} - E_{\ell,1}}{E_{\ell,M} - E_{\ell,1}}
|
||||
(E_{max} - E_{min})
|
||||
|
||||
where :math:`E_{min}` and :math:`E_{max}` are defined the same as in equation
|
||||
:eq:`ace-law-1-minmax`.
|
||||
:eq:`continuous-minmax`.
|
||||
|
||||
.. _maxwell:
|
||||
|
||||
ACE Law 7 - Maxwell Fission Spectrum
|
||||
++++++++++++++++++++++++++++++++++++
|
||||
Maxwell Fission Spectrum
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
One representation of the secondary energies for neutrons from fission is the
|
||||
so-called Maxwell spectrum. A probability distribution for the Maxwell spectrum
|
||||
|
|
@ -720,7 +661,7 @@ can be written in the form
|
|||
|
||||
where :math:`E` is the incoming energy of the neutron and :math:`T` is the
|
||||
so-called nuclear temperature, which is a function of the incoming energy of the
|
||||
neutron. The ACE format contains a list of nuclear temperatures versus incoming
|
||||
neutron. The ENDF format contains a list of nuclear temperatures versus incoming
|
||||
energies. The nuclear temperature is interpolated between neighboring incoming
|
||||
energies using a specified interpolation law. Once the temperature :math:`T` is
|
||||
determined, we then calculate a candidate outgoing energy based on rule C64 in
|
||||
|
|
@ -740,12 +681,12 @@ interval. The outgoing energy is only accepted if
|
|||
|
||||
0 \le E' \le E - U
|
||||
|
||||
where :math:`U` is called the restriction energy and is specified on the ACE
|
||||
table. If the outgoing energy is rejected, it is resampled using equation
|
||||
where :math:`U` is called the restriction energy and is specified in the ENDF
|
||||
data. If the outgoing energy is rejected, it is resampled using equation
|
||||
:eq:`maxwell-E-candidate`.
|
||||
|
||||
ACE Law 9 - Evaporation Spectrum
|
||||
++++++++++++++++++++++++++++++++
|
||||
Evaporation Spectrum
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Evaporation spectra are primarily used in compound nucleus processes where a
|
||||
secondary particle can "evaporate" from the compound nucleus if it has
|
||||
|
|
@ -759,7 +700,7 @@ be written in the form
|
|||
|
||||
where :math:`E` is the incoming energy of the neutron and :math:`T` is the
|
||||
nuclear temperature, which is a function of the incoming energy of the
|
||||
neutron. The ACE format contains a list of nuclear temperatures versus incoming
|
||||
neutron. The ENDF format contains a list of nuclear temperatures versus incoming
|
||||
energies. The nuclear temperature is interpolated between neighboring incoming
|
||||
energies using a specified interpolation law. Once the temperature :math:`T` is
|
||||
determined, we then calculate a candidate outgoing energy based on the algorithm
|
||||
|
|
@ -777,11 +718,11 @@ energy as in equation :eq:`maxwell-restriction`. This algorithm has a much
|
|||
higher rejection efficiency than the standard technique, i.e. rule C45 in the
|
||||
`Monte Carlo Sampler`_.
|
||||
|
||||
ACE Law 11 - Energy-Dependent Watt Spectrum
|
||||
+++++++++++++++++++++++++++++++++++++++++++
|
||||
Energy-Dependent Watt Spectrum
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The probability distribution for a Watt fission spectrum can be written in the
|
||||
form
|
||||
The probability distribution for a [Watt]_ fission spectrum can be written in
|
||||
the form
|
||||
|
||||
.. math::
|
||||
:label: watt-spectrum
|
||||
|
|
@ -805,29 +746,37 @@ where :math:`\xi` is a random number sampled on the interval :math:`[0,1)`. The
|
|||
outgoing energy is only accepted according to a specified restriction energy
|
||||
:math:`U` as defined in equation :eq:`maxwell-restriction`.
|
||||
|
||||
This algorithm can be found in Forrest Brown's lectures_ on Monte Carlo methods
|
||||
and is an unpublished sampling scheme based on the original Watt spectrum
|
||||
derivation [Watt]_.
|
||||
A derivation of the algorithm described here can be found in a paper by Romano_.
|
||||
|
||||
ACE Law 44 - Kalbach-Mann Correlated Scattering
|
||||
+++++++++++++++++++++++++++++++++++++++++++++++
|
||||
Product Angle-Energy Distributions
|
||||
----------------------------------
|
||||
|
||||
This law is very similar to ACE Law 4 except now the outgoing angle of the
|
||||
neutron is correlated to the outgoing energy and is not sampled from a separate
|
||||
distribution. For each incident neutron energy :math:`E_i` tabulated, there is
|
||||
an array of precompound factors :math:`R_{i,j}` and angular distribution slopes
|
||||
:math:`A_{i,j}` corresponding to each outgoing energy bin :math:`j` in addition
|
||||
to the outgoing energies and distribution functions as in ACE Law 4.
|
||||
If the secondary distribution for a product was given in file 6 in ENDF, the
|
||||
angle and energy are correlated with one another and cannot be sampled
|
||||
separately. Several representations exist in ENDF/ACE for correlated
|
||||
angle-energy distributions.
|
||||
|
||||
Kalbach-Mann Correlated Scattering
|
||||
++++++++++++++++++++++++++++++++++
|
||||
|
||||
This law is very similar to the uncorrelated continuous tabular energy
|
||||
distribution except now the outgoing angle of the neutron is correlated to the
|
||||
outgoing energy and is not sampled from a separate distribution. For each
|
||||
incident neutron energy :math:`E_i` tabulated, there is an array of precompound
|
||||
factors :math:`R_{i,j}` and angular distribution slopes :math:`A_{i,j}`
|
||||
corresponding to each outgoing energy bin :math:`j` in addition to the outgoing
|
||||
energies and distribution functions as in :ref:`continuous-tabular`.
|
||||
|
||||
The calculation of the outgoing energy of the neutron proceeds exactly the same
|
||||
as in the algorithm described in :ref:`ace-law-4`. In that algorithm, we found
|
||||
an interpolation factor :math:`f`, statistically sampled an incoming energy bin
|
||||
:math:`\ell`, and sampled an outgoing energy bin :math:`j` based on the
|
||||
tabulated cumulative distribution function. Once the outgoing energy has been
|
||||
determined with equation :eq:`ace-law-4-energy`, we then need to calculate the
|
||||
outgoing angle based on the tabulated Kalbach-Mann parameters. These parameters
|
||||
themselves are subject to either histogram or linear-linear interpolation on the
|
||||
outgoing energy grid. For histogram interpolation, the parameters are
|
||||
as in the algorithm described in :ref:`continuous-tabular`. In that algorithm,
|
||||
we found an interpolation factor :math:`f`, statistically sampled an incoming
|
||||
energy bin :math:`\ell`, and sampled an outgoing energy bin :math:`j` based on
|
||||
the tabulated cumulative distribution function. Once the outgoing energy has
|
||||
been determined with equation :eq:`continuous-eout`, we then need to calculate
|
||||
the outgoing angle based on the tabulated Kalbach-Mann parameters. These
|
||||
parameters themselves are subject to either histogram or linear-linear
|
||||
interpolation on the outgoing energy grid. For histogram interpolation, the
|
||||
parameters are
|
||||
|
||||
.. math::
|
||||
:label: KM-parameters-histogram
|
||||
|
|
@ -873,52 +822,55 @@ outgoing angle is
|
|||
|
||||
\mu = \frac{1}{A} \ln \left ( \xi_4 e^A + (1 - \xi_4) e^{-A} \right ).
|
||||
|
||||
.. _ace-law-61:
|
||||
.. _correlated-energy-angle:
|
||||
|
||||
ACE Law 61 - Correlated Energy and Angle Distribution
|
||||
+++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
Correlated Energy and Angle Distribution
|
||||
++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
This law is very similar to ACE Law 44 in the sense that the outgoing angle of
|
||||
the neutron is correlated to the outgoing energy and is not sampled from a
|
||||
separate distribution. In this case though, rather than being determined from an
|
||||
analytical distribution function, the cosine of the scattering angle is
|
||||
determined from a tabulated distribution. For each incident energy :math:`i` and
|
||||
outgoing energy :math:`j`, there is a tabulated angular distribution.
|
||||
This distribution is very similar to a Kalbach-Mann distribution in the sense
|
||||
that the outgoing angle of the neutron is correlated to the outgoing energy and
|
||||
is not sampled from a separate distribution. In this case though, rather than
|
||||
being determined from an analytical distribution function, the cosine of the
|
||||
scattering angle is determined from a tabulated distribution. For each incident
|
||||
energy :math:`i` and outgoing energy :math:`j`, there is a tabulated angular
|
||||
distribution.
|
||||
|
||||
The calculation of the outgoing energy of the neutron proceeds exactly the same
|
||||
as in the algorithm described in :ref:`ace-law-4`. In that algorithm, we found
|
||||
an interpolation factor :math:`f`, statistically sampled an incoming energy bin
|
||||
:math:`\ell`, and sampled an outgoing energy bin :math:`j` based on the
|
||||
tabulated cumulative distribution function. Once the outgoing energy has been
|
||||
determined with equation :eq:`ace-law-4-energy`, we then need to decide which
|
||||
angular distribution to use. If histogram interpolation was used on the outgoing
|
||||
energy bins, then we use the angular distribution corresponding to incoming
|
||||
energy bin :math:`\ell` and outgoing energy bin :math:`j`. If linear-linear
|
||||
interpolation was used on the outgoing energy bins, then we use the whichever
|
||||
angular distribution was closer to the sampled value of the cumulative
|
||||
distribution function for the outgoing energy. The actual algorithm used to
|
||||
sample the chosen tabular angular distribution has been previously described in
|
||||
:ref:`angle-tabular`.
|
||||
as in the algorithm described in :ref:`continuous-tabular`. In that algorithm,
|
||||
we found an interpolation factor :math:`f`, statistically sampled an incoming
|
||||
energy bin :math:`\ell`, and sampled an outgoing energy bin :math:`j` based on
|
||||
the tabulated cumulative distribution function. Once the outgoing energy has
|
||||
been determined with equation :eq:`continuous-eout`, we then need to decide
|
||||
which angular distribution to use. If histogram interpolation was used on the
|
||||
outgoing energy bins, then we use the angular distribution corresponding to
|
||||
incoming energy bin :math:`\ell` and outgoing energy bin :math:`j`. If
|
||||
linear-linear interpolation was used on the outgoing energy bins, then we use
|
||||
the whichever angular distribution was closer to the sampled value of the
|
||||
cumulative distribution function for the outgoing energy. The actual algorithm
|
||||
used to sample the chosen tabular angular distribution has been previously
|
||||
described in :ref:`angle-tabular`.
|
||||
|
||||
ACE Law 66 - N-Body Phase Space Distribution
|
||||
++++++++++++++++++++++++++++++++++++++++++++
|
||||
N-Body Phase Space Distribution
|
||||
+++++++++++++++++++++++++++++++
|
||||
|
||||
Reactions in which there are more than two products of similar masses are
|
||||
sometimes best treated by using what's known as an N-body phase
|
||||
distribution. This distribution has the following probability density function
|
||||
for outgoing energy of the :math:`i`-th particle in the center-of-mass system:
|
||||
for outgoing energy and angle of the :math:`i`-th particle in the center-of-mass
|
||||
system:
|
||||
|
||||
.. math::
|
||||
:label: n-body-pdf
|
||||
|
||||
p_i(E') dE' = C_n \sqrt{E'} (E_i^{max} - E')^{(3n/2) - 4} dE'
|
||||
p_i(\mu, E') dE' d\mu = C_n \sqrt{E'} (E_i^{max} - E')^{(3n/2) - 4} dE' d\mu
|
||||
|
||||
where :math:`n` is the number of outgoing particles, :math:`C_n` is a
|
||||
normalization constant, :math:`E_i^{max}` is the maximum center-of-mass energy
|
||||
for particle :math:`i`, and :math:`E'` is the outgoing energy. The algorithm for
|
||||
sampling the outgoing energy is based on algorithms R28, C45, and C64 in the
|
||||
`Monte Carlo Sampler`_. First we calculate the maximum energy in the
|
||||
center-of-mass using the following equation:
|
||||
for particle :math:`i`, and :math:`E'` is the outgoing energy. We see in
|
||||
equation :eq:`n-body-pdf` that the angle is simply isotropic in the
|
||||
center-of-mass system. The algorithm for sampling the outgoing energy is based
|
||||
on algorithms R28, C45, and C64 in the `Monte Carlo Sampler`_. First we
|
||||
calculate the maximum energy in the center-of-mass using the following equation:
|
||||
|
||||
.. math::
|
||||
:label: n-body-emax
|
||||
|
|
@ -961,7 +913,7 @@ distribution. First, the documentation (and code) for MCNP5-1.60 has a mistake
|
|||
in the algorithm for :math:`n = 4`. That being said, there are no existing
|
||||
nuclear data evaluations which use an N-body phase space distribution with
|
||||
:math:`n = 4`, so the error would not affect any calculations. In the
|
||||
ENDF/B-VII.0 nuclear data evaluation, only one reaction uses an N-body phase
|
||||
ENDF/B-VII.1 nuclear data evaluation, only one reaction uses an N-body phase
|
||||
space distribution at all, the :math:`(n,2n)` reaction with H-2.
|
||||
|
||||
.. _transform-coordinates:
|
||||
|
|
@ -1527,16 +1479,16 @@ accordingly.
|
|||
Continuous Outgoing Energies
|
||||
++++++++++++++++++++++++++++
|
||||
|
||||
If the thermal data was processed with :math:`iwt=2` in NJOY, then the
|
||||
outgoing energy spectra is represented by a continuous outgoing energy spectra
|
||||
in tabular form with linear-linear interpolation. The sampling of the outgoing
|
||||
energy portion of this format is very similar to :ref:`ACE Law 61<ace-law-61>`,
|
||||
but the sampling of the correlated angle is performed as it was in the other
|
||||
two representations discussed in this sub-section. In the Law 61 algorithm,
|
||||
we found an interpolation factor :math:`f`, statistically sampled an incoming
|
||||
If the thermal data was processed with :math:`iwt=2` in NJOY, then the outgoing
|
||||
energy spectra is represented by a continuous outgoing energy spectra in tabular
|
||||
form with linear-linear interpolation. The sampling of the outgoing energy
|
||||
portion of this format is very similar to :ref:`correlated-energy-angle`, but
|
||||
the sampling of the correlated angle is performed as it was in the other two
|
||||
representations discussed in this sub-section. In the Law 61 algorithm, we
|
||||
found an interpolation factor :math:`f`, statistically sampled an incoming
|
||||
energy bin :math:`\ell`, and sampled an outgoing energy bin :math:`j` based on
|
||||
the tabulated cumulative distribution function. Once the outgoing energy has
|
||||
been determined with equation :eq:`ace-law-4-energy`, we then need to decide
|
||||
been determined with equation :eq:`continuous-eout`, we then need to decide
|
||||
which angular distribution data to use. Like the linear-linear interpolation
|
||||
case in Law 61, the angular distribution closest to the sampled value of the
|
||||
cumulative distribution function for the outgoing energy is utilized. The
|
||||
|
|
@ -1723,6 +1675,8 @@ another.
|
|||
|
||||
.. _MC21: http://www.osti.gov/bridge/servlets/purl/903083-HT5p1o/903083.pdf
|
||||
|
||||
.. _Romano: http://dx.doi.org/10.1016/j.cpc.2014.11.001
|
||||
|
||||
.. _Sutton and Brown: http://www.osti.gov/bridge/product.biblio.jsp?osti_id=307911
|
||||
|
||||
.. _lectures: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-05-4983.pdf
|
||||
|
|
|
|||
|
|
@ -165,11 +165,11 @@
|
|||
"outputs": [],
|
||||
"source": [
|
||||
"# Instantiate some Nuclides\n",
|
||||
"h1 = openmc.Nuclide('H-1')\n",
|
||||
"o16 = openmc.Nuclide('O-16')\n",
|
||||
"u235 = openmc.Nuclide('U-235')\n",
|
||||
"u238 = openmc.Nuclide('U-238')\n",
|
||||
"zr90 = openmc.Nuclide('Zr-90')"
|
||||
"h1 = openmc.Nuclide('H1')\n",
|
||||
"o16 = openmc.Nuclide('O16')\n",
|
||||
"u235 = openmc.Nuclide('U235')\n",
|
||||
"u238 = openmc.Nuclide('U238')\n",
|
||||
"zr90 = openmc.Nuclide('Zr90')"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -432,16 +432,26 @@
|
|||
" \tID =\t10000\n",
|
||||
" \tName =\t\n",
|
||||
" \tFilters =\t\n",
|
||||
<<<<<<< HEAD
|
||||
" \t\tmesh\t[10000]\n",
|
||||
" \t\tenergy\t[0.000000E+00 6.250000E-07 2.000000E+01]\n",
|
||||
=======
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
>>>>>>> upstream/develop
|
||||
" \tNuclides =\ttotal \n",
|
||||
" \tScores =\t['flux']\n",
|
||||
" \tEstimator =\ttracklength), ('absorption', Tally\n",
|
||||
" \tID =\t10001\n",
|
||||
" \tName =\t\n",
|
||||
" \tFilters =\t\n",
|
||||
<<<<<<< HEAD
|
||||
" \t\tmesh\t[10000]\n",
|
||||
" \t\tenergy\t[0.000000E+00 6.250000E-07 2.000000E+01]\n",
|
||||
=======
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
>>>>>>> upstream/develop
|
||||
" \tNuclides =\ttotal \n",
|
||||
" \tScores =\t['absorption']\n",
|
||||
" \tEstimator =\ttracklength)])"
|
||||
|
|
@ -521,26 +531,31 @@
|
|||
" Copyright: 2011-2016 Massachusetts Institute of Technology\n",
|
||||
" License: http://openmc.readthedocs.io/en/latest/license.html\n",
|
||||
" Version: 0.7.1\n",
|
||||
<<<<<<< HEAD
|
||||
" Git SHA1: 6a66fb9af7372435dc7da987c8fc3d6acff6549a\n",
|
||||
" Date/Time: 2016-07-07 16:43:21\n",
|
||||
" MPI Processes: 1\n",
|
||||
=======
|
||||
" Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n",
|
||||
" Date/Time: 2016-07-22 21:03:18\n",
|
||||
>>>>>>> upstream/develop
|
||||
"\n",
|
||||
" ===========================================================================\n",
|
||||
" ========================> INITIALIZATION <=========================\n",
|
||||
" ===========================================================================\n",
|
||||
"\n",
|
||||
" Reading settings XML file...\n",
|
||||
" Reading cross sections XML file...\n",
|
||||
" Reading geometry XML file...\n",
|
||||
" Reading cross sections XML file...\n",
|
||||
" Reading materials XML file...\n",
|
||||
" Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n",
|
||||
" Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n",
|
||||
" Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n",
|
||||
" Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n",
|
||||
" Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n",
|
||||
" Maximum neutron transport energy: 20.0000 MeV for H1.71c\n",
|
||||
" Reading tallies XML file...\n",
|
||||
" Building neighboring cells lists for each surface...\n",
|
||||
" Loading ACE cross section table: 1001.71c\n",
|
||||
" Loading ACE cross section table: 8016.71c\n",
|
||||
" Loading ACE cross section table: 92235.71c\n",
|
||||
" Loading ACE cross section table: 92238.71c\n",
|
||||
" Loading ACE cross section table: 40090.71c\n",
|
||||
" Maximum neutron transport energy: 20.0000 MeV for 1001.71c\n",
|
||||
" Initializing source particles...\n",
|
||||
"\n",
|
||||
" ===========================================================================\n",
|
||||
|
|
@ -608,6 +623,7 @@
|
|||
"\n",
|
||||
" =======================> TIMING STATISTICS <=======================\n",
|
||||
"\n",
|
||||
<<<<<<< HEAD
|
||||
" Total time for initialization = 7.1900E-01 seconds\n",
|
||||
" Reading cross sections = 2.0400E-01 seconds\n",
|
||||
" Total time in simulation = 2.4932E+01 seconds\n",
|
||||
|
|
@ -622,6 +638,22 @@
|
|||
" Total time elapsed = 2.5667E+01 seconds\n",
|
||||
" Calculation Rate (inactive) = 11452.1 neutrons/second\n",
|
||||
" Calculation Rate (active) = 4395.80 neutrons/second\n",
|
||||
=======
|
||||
" Total time for initialization = 3.2300E-01 seconds\n",
|
||||
" Reading cross sections = 1.6900E-01 seconds\n",
|
||||
" Total time in simulation = 1.9882E+01 seconds\n",
|
||||
" Time in transport only = 1.9869E+01 seconds\n",
|
||||
" Time in inactive batches = 2.6590E+00 seconds\n",
|
||||
" Time in active batches = 1.7223E+01 seconds\n",
|
||||
" Time synchronizing fission bank = 4.0000E-03 seconds\n",
|
||||
" Sampling source sites = 4.0000E-03 seconds\n",
|
||||
" SEND/RECV source sites = 0.0000E+00 seconds\n",
|
||||
" Time accumulating tallies = 0.0000E+00 seconds\n",
|
||||
" Total time for finalization = 0.0000E+00 seconds\n",
|
||||
" Total time elapsed = 2.0217E+01 seconds\n",
|
||||
" Calculation Rate (inactive) = 9402.03 neutrons/second\n",
|
||||
" Calculation Rate (active) = 5806.19 neutrons/second\n",
|
||||
>>>>>>> upstream/develop
|
||||
"\n",
|
||||
" ============================> RESULTS <============================\n",
|
||||
"\n",
|
||||
|
|
@ -1670,21 +1702,26 @@
|
|||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 2",
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python2"
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 2
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
<<<<<<< HEAD
|
||||
"pygments_lexer": "ipython2",
|
||||
"version": "2.7.11"
|
||||
=======
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.5.2"
|
||||
>>>>>>> upstream/develop
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
866
docs/source/pythonapi/examples/nuclear-data.ipynb
Normal file
866
docs/source/pythonapi/examples/nuclear-data.ipynb
Normal file
File diff suppressed because one or more lines are too long
13
docs/source/pythonapi/examples/nuclear-data.rst
Normal file
13
docs/source/pythonapi/examples/nuclear-data.rst
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
.. _notebook_nuclear_data:
|
||||
|
||||
============
|
||||
Nuclear Data
|
||||
============
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. notebook:: nuclear-data.ipynb
|
||||
|
||||
.. only:: latex
|
||||
|
||||
IPython notebooks must be viewed in the online HTML documentation.
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -45,12 +45,12 @@
|
|||
"outputs": [],
|
||||
"source": [
|
||||
"# Instantiate some Nuclides\n",
|
||||
"h1 = openmc.Nuclide('H-1')\n",
|
||||
"b10 = openmc.Nuclide('B-10')\n",
|
||||
"o16 = openmc.Nuclide('O-16')\n",
|
||||
"u235 = openmc.Nuclide('U-235')\n",
|
||||
"u238 = openmc.Nuclide('U-238')\n",
|
||||
"zr90 = openmc.Nuclide('Zr-90')"
|
||||
"h1 = openmc.Nuclide('H1')\n",
|
||||
"b10 = openmc.Nuclide('B10')\n",
|
||||
"o16 = openmc.Nuclide('O16')\n",
|
||||
"u235 = openmc.Nuclide('U235')\n",
|
||||
"u238 = openmc.Nuclide('U238')\n",
|
||||
"zr90 = openmc.Nuclide('Zr90')"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -339,7 +339,7 @@
|
|||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AFBRQzLY81/IkAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDUtMDVUMTQ6NTE6\nNDUtMDY6MDCqOITjAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA1LTA1VDE0OjUxOjQ1LTA2OjAw\n22U8XwAAAABJRU5ErkJggg==\n",
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AHFwInLqDpadAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMjJUMjE6Mzk6\nNDYtMDU6MDBOOEOsAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTIyVDIxOjM5OjQ2LTA1OjAw\nP2X7EAAAAABJRU5ErkJggg==\n",
|
||||
"text/plain": [
|
||||
"<IPython.core.display.Image object>"
|
||||
]
|
||||
|
|
@ -540,28 +540,28 @@
|
|||
" 888\n",
|
||||
"\n",
|
||||
" Copyright: 2011-2016 Massachusetts Institute of Technology\n",
|
||||
" License: http://openmc.readthedocs.org/en/latest/license.html\n",
|
||||
" License: http://openmc.readthedocs.io/en/latest/license.html\n",
|
||||
" Version: 0.7.1\n",
|
||||
" Git SHA1: df280b60eb1c6d7b7f842e05ede734a4883a0fc8\n",
|
||||
" Date/Time: 2016-05-05 14:51:45\n",
|
||||
" Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n",
|
||||
" Date/Time: 2016-07-22 21:39:46\n",
|
||||
"\n",
|
||||
" ===========================================================================\n",
|
||||
" ========================> INITIALIZATION <=========================\n",
|
||||
" ===========================================================================\n",
|
||||
"\n",
|
||||
" Reading settings XML file...\n",
|
||||
" Reading cross sections XML file...\n",
|
||||
" Reading geometry XML file...\n",
|
||||
" Reading cross sections XML file...\n",
|
||||
" Reading materials XML file...\n",
|
||||
" Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n",
|
||||
" Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n",
|
||||
" Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n",
|
||||
" Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n",
|
||||
" Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n",
|
||||
" Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n",
|
||||
" Maximum neutron transport energy: 20.0000 MeV for U235.71c\n",
|
||||
" Reading tallies XML file...\n",
|
||||
" Building neighboring cells lists for each surface...\n",
|
||||
" Loading ACE cross section table: 92235.71c\n",
|
||||
" Loading ACE cross section table: 92238.71c\n",
|
||||
" Loading ACE cross section table: 8016.71c\n",
|
||||
" Loading ACE cross section table: 1001.71c\n",
|
||||
" Loading ACE cross section table: 5010.71c\n",
|
||||
" Loading ACE cross section table: 40090.71c\n",
|
||||
" Maximum neutron transport energy: 20.0000 MeV for 92235.71c\n",
|
||||
" Initializing source particles...\n",
|
||||
"\n",
|
||||
" ===========================================================================\n",
|
||||
|
|
@ -599,20 +599,20 @@
|
|||
"\n",
|
||||
" =======================> TIMING STATISTICS <=======================\n",
|
||||
"\n",
|
||||
" Total time for initialization = 7.2500E-01 seconds\n",
|
||||
" Reading cross sections = 4.4400E-01 seconds\n",
|
||||
" Total time in simulation = 1.5547E+01 seconds\n",
|
||||
" Time in transport only = 1.5527E+01 seconds\n",
|
||||
" Time in inactive batches = 2.2880E+00 seconds\n",
|
||||
" Time in active batches = 1.3259E+01 seconds\n",
|
||||
" Total time for initialization = 3.5600E-01 seconds\n",
|
||||
" Reading cross sections = 2.3400E-01 seconds\n",
|
||||
" Total time in simulation = 1.8333E+01 seconds\n",
|
||||
" Time in transport only = 1.8325E+01 seconds\n",
|
||||
" Time in inactive batches = 2.6950E+00 seconds\n",
|
||||
" Time in active batches = 1.5638E+01 seconds\n",
|
||||
" Time synchronizing fission bank = 1.0000E-03 seconds\n",
|
||||
" Sampling source sites = 0.0000E+00 seconds\n",
|
||||
" SEND/RECV source sites = 0.0000E+00 seconds\n",
|
||||
" Time accumulating tallies = 1.0000E-03 seconds\n",
|
||||
" Total time for finalization = 2.0000E-03 seconds\n",
|
||||
" Total time elapsed = 1.6291E+01 seconds\n",
|
||||
" Calculation Rate (inactive) = 5463.29 neutrons/second\n",
|
||||
" Calculation Rate (active) = 2828.27 neutrons/second\n",
|
||||
" SEND/RECV source sites = 1.0000E-03 seconds\n",
|
||||
" Time accumulating tallies = 0.0000E+00 seconds\n",
|
||||
" Total time for finalization = 1.0000E-03 seconds\n",
|
||||
" Total time elapsed = 1.8711E+01 seconds\n",
|
||||
" Calculation Rate (inactive) = 4638.22 neutrons/second\n",
|
||||
" Calculation Rate (active) = 2398.00 neutrons/second\n",
|
||||
"\n",
|
||||
" ============================> RESULTS <============================\n",
|
||||
"\n",
|
||||
|
|
@ -1107,7 +1107,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>0.000000e+00</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>(U-238 / total)</td>\n",
|
||||
" <td>(U238 / total)</td>\n",
|
||||
" <td>(nu-fission / flux)</td>\n",
|
||||
" <td>6.636968e-07</td>\n",
|
||||
" <td>4.132875e-09</td>\n",
|
||||
|
|
@ -1117,7 +1117,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>0.000000e+00</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>(U-238 / total)</td>\n",
|
||||
" <td>(U238 / total)</td>\n",
|
||||
" <td>(scatter / flux)</td>\n",
|
||||
" <td>2.099856e-01</td>\n",
|
||||
" <td>1.232455e-03</td>\n",
|
||||
|
|
@ -1127,7 +1127,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>0.000000e+00</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>(U-235 / total)</td>\n",
|
||||
" <td>(U235 / total)</td>\n",
|
||||
" <td>(nu-fission / flux)</td>\n",
|
||||
" <td>3.552458e-01</td>\n",
|
||||
" <td>2.252681e-03</td>\n",
|
||||
|
|
@ -1137,7 +1137,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>0.000000e+00</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>(U-235 / total)</td>\n",
|
||||
" <td>(U235 / total)</td>\n",
|
||||
" <td>(scatter / flux)</td>\n",
|
||||
" <td>5.554345e-03</td>\n",
|
||||
" <td>3.265385e-05</td>\n",
|
||||
|
|
@ -1147,7 +1147,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>2.000000e+01</td>\n",
|
||||
" <td>(U-238 / total)</td>\n",
|
||||
" <td>(U238 / total)</td>\n",
|
||||
" <td>(nu-fission / flux)</td>\n",
|
||||
" <td>7.126668e-03</td>\n",
|
||||
" <td>5.296883e-05</td>\n",
|
||||
|
|
@ -1157,7 +1157,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>2.000000e+01</td>\n",
|
||||
" <td>(U-238 / total)</td>\n",
|
||||
" <td>(U238 / total)</td>\n",
|
||||
" <td>(scatter / flux)</td>\n",
|
||||
" <td>2.277460e-01</td>\n",
|
||||
" <td>1.003558e-03</td>\n",
|
||||
|
|
@ -1167,7 +1167,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>2.000000e+01</td>\n",
|
||||
" <td>(U-235 / total)</td>\n",
|
||||
" <td>(U235 / total)</td>\n",
|
||||
" <td>(nu-fission / flux)</td>\n",
|
||||
" <td>8.010911e-03</td>\n",
|
||||
" <td>6.802256e-05</td>\n",
|
||||
|
|
@ -1177,7 +1177,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>2.000000e+01</td>\n",
|
||||
" <td>(U-235 / total)</td>\n",
|
||||
" <td>(U235 / total)</td>\n",
|
||||
" <td>(scatter / flux)</td>\n",
|
||||
" <td>3.367794e-03</td>\n",
|
||||
" <td>1.443644e-05</td>\n",
|
||||
|
|
@ -1187,15 +1187,15 @@
|
|||
"</div>"
|
||||
],
|
||||
"text/plain": [
|
||||
" cell energy low [MeV] energy high [MeV] nuclide \\\n",
|
||||
"0 10000 0.00e+00 6.25e-07 (U-238 / total) \n",
|
||||
"1 10000 0.00e+00 6.25e-07 (U-238 / total) \n",
|
||||
"2 10000 0.00e+00 6.25e-07 (U-235 / total) \n",
|
||||
"3 10000 0.00e+00 6.25e-07 (U-235 / total) \n",
|
||||
"4 10000 6.25e-07 2.00e+01 (U-238 / total) \n",
|
||||
"5 10000 6.25e-07 2.00e+01 (U-238 / total) \n",
|
||||
"6 10000 6.25e-07 2.00e+01 (U-235 / total) \n",
|
||||
"7 10000 6.25e-07 2.00e+01 (U-235 / total) \n",
|
||||
" cell energy low [MeV] energy high [MeV] nuclide \\\n",
|
||||
"0 10000 0.00e+00 6.25e-07 (U238 / total) \n",
|
||||
"1 10000 0.00e+00 6.25e-07 (U238 / total) \n",
|
||||
"2 10000 0.00e+00 6.25e-07 (U235 / total) \n",
|
||||
"3 10000 0.00e+00 6.25e-07 (U235 / total) \n",
|
||||
"4 10000 6.25e-07 2.00e+01 (U238 / total) \n",
|
||||
"5 10000 6.25e-07 2.00e+01 (U238 / total) \n",
|
||||
"6 10000 6.25e-07 2.00e+01 (U235 / total) \n",
|
||||
"7 10000 6.25e-07 2.00e+01 (U235 / total) \n",
|
||||
"\n",
|
||||
" score mean std. dev. \n",
|
||||
"0 (nu-fission / flux) 6.64e-07 4.13e-09 \n",
|
||||
|
|
@ -1276,7 +1276,7 @@
|
|||
],
|
||||
"source": [
|
||||
"# Show how to use Tally.get_values(...) with a CrossScore and CrossNuclide\n",
|
||||
"u235_scatter_xs = fuel_xs.get_values(nuclides=['(U-235 / total)'], \n",
|
||||
"u235_scatter_xs = fuel_xs.get_values(nuclides=['(U235 / total)'], \n",
|
||||
" scores=['(scatter / flux)'])\n",
|
||||
"print(u235_scatter_xs)"
|
||||
]
|
||||
|
|
@ -1342,7 +1342,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>0.000000e+00</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>U-238</td>\n",
|
||||
" <td>U238</td>\n",
|
||||
" <td>nu-fission</td>\n",
|
||||
" <td>0.000002</td>\n",
|
||||
" <td>7.473789e-09</td>\n",
|
||||
|
|
@ -1352,7 +1352,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>0.000000e+00</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>U-235</td>\n",
|
||||
" <td>U235</td>\n",
|
||||
" <td>nu-fission</td>\n",
|
||||
" <td>0.861547</td>\n",
|
||||
" <td>4.131310e-03</td>\n",
|
||||
|
|
@ -1362,7 +1362,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>2.000000e+01</td>\n",
|
||||
" <td>U-238</td>\n",
|
||||
" <td>U238</td>\n",
|
||||
" <td>nu-fission</td>\n",
|
||||
" <td>0.082356</td>\n",
|
||||
" <td>5.560461e-04</td>\n",
|
||||
|
|
@ -1372,7 +1372,7 @@
|
|||
" <td>10000</td>\n",
|
||||
" <td>6.250000e-07</td>\n",
|
||||
" <td>2.000000e+01</td>\n",
|
||||
" <td>U-235</td>\n",
|
||||
" <td>U235</td>\n",
|
||||
" <td>nu-fission</td>\n",
|
||||
" <td>0.092574</td>\n",
|
||||
" <td>7.315442e-04</td>\n",
|
||||
|
|
@ -1383,10 +1383,10 @@
|
|||
],
|
||||
"text/plain": [
|
||||
" cell energy low [MeV] energy high [MeV] nuclide score mean \\\n",
|
||||
"0 10000 0.00e+00 6.25e-07 U-238 nu-fission 1.61e-06 \n",
|
||||
"1 10000 0.00e+00 6.25e-07 U-235 nu-fission 8.62e-01 \n",
|
||||
"2 10000 6.25e-07 2.00e+01 U-238 nu-fission 8.24e-02 \n",
|
||||
"3 10000 6.25e-07 2.00e+01 U-235 nu-fission 9.26e-02 \n",
|
||||
"0 10000 0.00e+00 6.25e-07 U238 nu-fission 1.61e-06 \n",
|
||||
"1 10000 0.00e+00 6.25e-07 U235 nu-fission 8.62e-01 \n",
|
||||
"2 10000 6.25e-07 2.00e+01 U238 nu-fission 8.24e-02 \n",
|
||||
"3 10000 6.25e-07 2.00e+01 U235 nu-fission 9.26e-02 \n",
|
||||
"\n",
|
||||
" std. dev. \n",
|
||||
"0 7.47e-09 \n",
|
||||
|
|
@ -1436,7 +1436,7 @@
|
|||
" <td>10002</td>\n",
|
||||
" <td>1.000000e-08</td>\n",
|
||||
" <td>1.080060e-07</td>\n",
|
||||
" <td>H-1</td>\n",
|
||||
" <td>H1</td>\n",
|
||||
" <td>scatter</td>\n",
|
||||
" <td>4.599225</td>\n",
|
||||
" <td>0.015973</td>\n",
|
||||
|
|
@ -1446,7 +1446,7 @@
|
|||
" <td>10002</td>\n",
|
||||
" <td>1.080060e-07</td>\n",
|
||||
" <td>1.166529e-06</td>\n",
|
||||
" <td>H-1</td>\n",
|
||||
" <td>H1</td>\n",
|
||||
" <td>scatter</td>\n",
|
||||
" <td>2.037260</td>\n",
|
||||
" <td>0.011236</td>\n",
|
||||
|
|
@ -1456,7 +1456,7 @@
|
|||
" <td>10002</td>\n",
|
||||
" <td>1.166529e-06</td>\n",
|
||||
" <td>1.259921e-05</td>\n",
|
||||
" <td>H-1</td>\n",
|
||||
" <td>H1</td>\n",
|
||||
" <td>scatter</td>\n",
|
||||
" <td>1.662552</td>\n",
|
||||
" <td>0.010280</td>\n",
|
||||
|
|
@ -1466,7 +1466,7 @@
|
|||
" <td>10002</td>\n",
|
||||
" <td>1.259921e-05</td>\n",
|
||||
" <td>1.360790e-04</td>\n",
|
||||
" <td>H-1</td>\n",
|
||||
" <td>H1</td>\n",
|
||||
" <td>scatter</td>\n",
|
||||
" <td>1.872201</td>\n",
|
||||
" <td>0.012136</td>\n",
|
||||
|
|
@ -1476,7 +1476,7 @@
|
|||
" <td>10002</td>\n",
|
||||
" <td>1.360790e-04</td>\n",
|
||||
" <td>1.469734e-03</td>\n",
|
||||
" <td>H-1</td>\n",
|
||||
" <td>H1</td>\n",
|
||||
" <td>scatter</td>\n",
|
||||
" <td>2.080459</td>\n",
|
||||
" <td>0.013155</td>\n",
|
||||
|
|
@ -1486,7 +1486,7 @@
|
|||
" <td>10002</td>\n",
|
||||
" <td>1.469734e-03</td>\n",
|
||||
" <td>1.587401e-02</td>\n",
|
||||
" <td>H-1</td>\n",
|
||||
" <td>H1</td>\n",
|
||||
" <td>scatter</td>\n",
|
||||
" <td>2.154996</td>\n",
|
||||
" <td>0.011975</td>\n",
|
||||
|
|
@ -1496,7 +1496,7 @@
|
|||
" <td>10002</td>\n",
|
||||
" <td>1.587401e-02</td>\n",
|
||||
" <td>1.714488e-01</td>\n",
|
||||
" <td>H-1</td>\n",
|
||||
" <td>H1</td>\n",
|
||||
" <td>scatter</td>\n",
|
||||
" <td>2.218740</td>\n",
|
||||
" <td>0.008528</td>\n",
|
||||
|
|
@ -1506,7 +1506,7 @@
|
|||
" <td>10002</td>\n",
|
||||
" <td>1.714488e-01</td>\n",
|
||||
" <td>1.851749e+00</td>\n",
|
||||
" <td>H-1</td>\n",
|
||||
" <td>H1</td>\n",
|
||||
" <td>scatter</td>\n",
|
||||
" <td>2.010517</td>\n",
|
||||
" <td>0.009187</td>\n",
|
||||
|
|
@ -1516,7 +1516,7 @@
|
|||
" <td>10002</td>\n",
|
||||
" <td>1.851749e+00</td>\n",
|
||||
" <td>2.000000e+01</td>\n",
|
||||
" <td>H-1</td>\n",
|
||||
" <td>H1</td>\n",
|
||||
" <td>scatter</td>\n",
|
||||
" <td>0.372022</td>\n",
|
||||
" <td>0.003196</td>\n",
|
||||
|
|
@ -1527,15 +1527,15 @@
|
|||
],
|
||||
"text/plain": [
|
||||
" cell energy low [MeV] energy high [MeV] nuclide score mean \\\n",
|
||||
"0 10002 1.00e-08 1.08e-07 H-1 scatter 4.60e+00 \n",
|
||||
"1 10002 1.08e-07 1.17e-06 H-1 scatter 2.04e+00 \n",
|
||||
"2 10002 1.17e-06 1.26e-05 H-1 scatter 1.66e+00 \n",
|
||||
"3 10002 1.26e-05 1.36e-04 H-1 scatter 1.87e+00 \n",
|
||||
"4 10002 1.36e-04 1.47e-03 H-1 scatter 2.08e+00 \n",
|
||||
"5 10002 1.47e-03 1.59e-02 H-1 scatter 2.15e+00 \n",
|
||||
"6 10002 1.59e-02 1.71e-01 H-1 scatter 2.22e+00 \n",
|
||||
"7 10002 1.71e-01 1.85e+00 H-1 scatter 2.01e+00 \n",
|
||||
"8 10002 1.85e+00 2.00e+01 H-1 scatter 3.72e-01 \n",
|
||||
"0 10002 1.00e-08 1.08e-07 H1 scatter 4.60e+00 \n",
|
||||
"1 10002 1.08e-07 1.17e-06 H1 scatter 2.04e+00 \n",
|
||||
"2 10002 1.17e-06 1.26e-05 H1 scatter 1.66e+00 \n",
|
||||
"3 10002 1.26e-05 1.36e-04 H1 scatter 1.87e+00 \n",
|
||||
"4 10002 1.36e-04 1.47e-03 H1 scatter 2.08e+00 \n",
|
||||
"5 10002 1.47e-03 1.59e-02 H1 scatter 2.15e+00 \n",
|
||||
"6 10002 1.59e-02 1.71e-01 H1 scatter 2.22e+00 \n",
|
||||
"7 10002 1.71e-01 1.85e+00 H1 scatter 2.01e+00 \n",
|
||||
"8 10002 1.85e+00 2.00e+01 H1 scatter 3.72e-01 \n",
|
||||
"\n",
|
||||
" std. dev. \n",
|
||||
"0 1.60e-02 \n",
|
||||
|
|
@ -1557,7 +1557,7 @@
|
|||
"source": [
|
||||
"# \"Slice\" the H-1 scatter data in the moderator Cell into a new derived Tally\n",
|
||||
"need_to_slice = sp.get_tally(name='need-to-slice')\n",
|
||||
"slice_test = need_to_slice.get_slice(scores=['scatter'], nuclides=['H-1'],\n",
|
||||
"slice_test = need_to_slice.get_slice(scores=['scatter'], nuclides=['H1'],\n",
|
||||
" filters=['cell'], filter_bins=[(moderator_cell.id,)])\n",
|
||||
"slice_test.get_pandas_dataframe()"
|
||||
]
|
||||
|
|
@ -1579,7 +1579,7 @@
|
|||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.5.1"
|
||||
"version": "3.5.2"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ Example Jupyter Notebooks
|
|||
examples/mgxs-part-ii
|
||||
examples/mgxs-part-iii
|
||||
examples/mgxs-part-iv
|
||||
examples/nuclear-data
|
||||
|
||||
------------------------------------
|
||||
:mod:`openmc` -- Basic Functionality
|
||||
|
|
@ -35,9 +36,6 @@ Example Jupyter Notebooks
|
|||
Handling nuclear data
|
||||
---------------------
|
||||
|
||||
Classes
|
||||
+++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
|
|
@ -46,14 +44,6 @@ Classes
|
|||
openmc.XSdata
|
||||
openmc.MGXSLibrary
|
||||
|
||||
Functions
|
||||
+++++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
|
||||
openmc.ace.ascii_to_binary
|
||||
|
||||
Simulation Settings
|
||||
-------------------
|
||||
|
|
@ -224,6 +214,8 @@ Univariate Probability Distributions
|
|||
openmc.stats.Maxwell
|
||||
openmc.stats.Watt
|
||||
openmc.stats.Tabular
|
||||
openmc.stats.Legendre
|
||||
openmc.stats.Mixture
|
||||
|
||||
Angular Distributions
|
||||
---------------------
|
||||
|
|
@ -325,6 +317,72 @@ Functions
|
|||
|
||||
openmc.model.create_triso_lattice
|
||||
|
||||
--------------------------------------------
|
||||
:mod:`openmc.data` -- Nuclear Data Interface
|
||||
--------------------------------------------
|
||||
|
||||
Core Classes
|
||||
------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myclass.rst
|
||||
|
||||
openmc.data.IncidentNeutron
|
||||
openmc.data.Reaction
|
||||
openmc.data.Product
|
||||
openmc.data.Tabulated1D
|
||||
openmc.data.ThermalScattering
|
||||
openmc.data.CoherentElastic
|
||||
|
||||
Angle-Energy Distributions
|
||||
--------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myclass.rst
|
||||
|
||||
openmc.data.AngleEnergy
|
||||
openmc.data.KalbachMann
|
||||
openmc.data.CorrelatedAngleEnergy
|
||||
openmc.data.UncorrelatedAngleEnergy
|
||||
openmc.data.NBodyPhaseSpace
|
||||
openmc.data.AngleDistribution
|
||||
openmc.data.EnergyDistribution
|
||||
openmc.data.ArbitraryTabulated
|
||||
openmc.data.GeneralEvaporation
|
||||
openmc.data.MaxwellEnergy
|
||||
openmc.data.Evaporation
|
||||
openmc.data.WattEnergy
|
||||
openmc.data.MadlandNix
|
||||
openmc.data.DiscretePhoton
|
||||
openmc.data.LevelInelastic
|
||||
openmc.data.ContinuousTabular
|
||||
|
||||
ACE Format
|
||||
----------
|
||||
|
||||
Classes
|
||||
+++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myclass.rst
|
||||
|
||||
openmc.data.ace.Library
|
||||
openmc.data.ace.Table
|
||||
|
||||
Functions
|
||||
+++++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
|
||||
openmc.data.ace.ascii_to_binary
|
||||
|
||||
.. _Jupyter: https://jupyter.org/
|
||||
.. _NumPy: http://www.numpy.org/
|
||||
|
|
|
|||
|
|
@ -1,78 +1,83 @@
|
|||
.. _releasenotes:
|
||||
|
||||
==============================
|
||||
Release Notes for OpenMC 0.7.1
|
||||
Release Notes for OpenMC 0.8.0
|
||||
==============================
|
||||
|
||||
This release of OpenMC provides some substantial improvements over version
|
||||
0.7.0. Non-simple cell regions can now be defined through the ``|`` (union) and
|
||||
``~`` (complement) operators. Similar changes in the Python API also allow
|
||||
complex cell regions to be defined. A true secondary particle bank now exists;
|
||||
this is crucial for photon transport (to be added in the next minor release). A
|
||||
rich API for multi-group cross section generation has been added via the
|
||||
``openmc.mgxs`` Python module.
|
||||
This release of OpenMC includes a few new major features including the
|
||||
capability to perform neutron transport with multi-group cross section data as
|
||||
well as experimental support for the windowed multipole method being developed
|
||||
at MIT. Source sampling options have also been expanded significantly, with the
|
||||
option to supply arbitrary tabular and discrete distributions for energy, angle,
|
||||
and spatial coordinates.
|
||||
|
||||
Various improvements to tallies have also been made. It is now possible to
|
||||
explicitly specify that a collision estimator be used in a tally. A new
|
||||
``delayedgroup`` filter and ``delayed-nu-fission`` score allow a user to obtain
|
||||
delayed fission neutron production rates filtered by delayed group. Finally, the
|
||||
new ``inverse-velocity`` score may be useful for calculating kinetics
|
||||
parameters.
|
||||
The Python API has been significantly restructured in this release compared to
|
||||
version 0.7.1. Any scripts written based on the version 0.7.1 API will likely
|
||||
need to be rewritten. Some of the most visible changes include the following:
|
||||
|
||||
.. caution:: In previous versions, depending on how OpenMC was compiled binary
|
||||
output was either given in HDF5 or a flat binary format. With this
|
||||
version, all binary output is now HDF5 which means you **must**
|
||||
have HDF5 in order to install OpenMC. Please consult the user's
|
||||
guide for instructions on how to compile with HDF5.
|
||||
- ``SettingsFile`` is now ``Settings``, ``MaterialsFile`` is now ``Materials``,
|
||||
and ``TalliesFile`` is now ``Tallies``.
|
||||
- The ``GeometryFile`` class no longer exists and is replaced by the
|
||||
``Geometry`` class which now has an ``export_to_xml()`` method.
|
||||
- Source distributions are defined using the ``Source`` class and assigned to
|
||||
the ``Settings.source`` property.
|
||||
- The ``Executor`` class no longer exists and is replaced by ``openmc.run()``
|
||||
and ``openmc.plot_geometry()`` functions.
|
||||
|
||||
The Python API documentation has also been significantly expanded.
|
||||
|
||||
-------------------
|
||||
System Requirements
|
||||
-------------------
|
||||
|
||||
There are no special requirements for running the OpenMC code. As of this
|
||||
release, OpenMC has been tested on a variety of Linux distributions, Mac OS X,
|
||||
and Microsoft Windows 7. Memory requirements will vary depending on the size of
|
||||
the problem at hand (mostly on the number of nuclides in the problem).
|
||||
release, OpenMC has been tested on a variety of Linux distributions and Mac
|
||||
OS X. Numerous users have reported working builds on Microsoft Windows, but your
|
||||
mileage may vary. Memory requirements will vary depending on the size of the
|
||||
problem at hand (mostly on the number of nuclides and tallies in the problem).
|
||||
|
||||
------------
|
||||
New Features
|
||||
------------
|
||||
|
||||
- Support for complex cell regions (union and complement operators)
|
||||
- Generic quadric surface type
|
||||
- Improved handling of secondary particles
|
||||
- Binary output is now solely HDF5
|
||||
- ``openmc.mgxs`` Python module enabling multi-group cross section generation
|
||||
- Collision estimator for tallies
|
||||
- Delayed fission neutron production tallies with ability to filter by delayed
|
||||
group
|
||||
- Inverse velocity tally score
|
||||
- Performance improvements for binary search
|
||||
- Performance improvements for reaction rate tallies
|
||||
- Multi-group mode
|
||||
- Vast improvements to the Python API
|
||||
- Experimental windowed multipole capability
|
||||
- Periodic boundary conditions
|
||||
- Expanded source sampling options
|
||||
- Distributed materials
|
||||
- Subcritical multiplication support
|
||||
- Improved method for reproducible URR table sampling
|
||||
- Refactor of continuous-energy reaction data
|
||||
- Improved documentation and new Jupyter notebooks
|
||||
|
||||
---------
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
- 299322_: Bug with material filter when void material present
|
||||
- d74840_: Fix triggers on tallies with multiple filters
|
||||
- c29a81_: Correctly handle maximum transport energy
|
||||
- 3edc23_: Fixes in the nu-scatter score
|
||||
- 629e3b_: Assume unspecified surface coefficients are zero in Python API
|
||||
- 5dbe8b_: Fix energy filters for openmc-plot-mesh-tally
|
||||
- ff66f4_: Fixes in the openmc-plot-mesh-tally script
|
||||
- 441fd4_: Fix bug in kappa-fission score
|
||||
- 7e5974_: Allow fixed source simulations from Python API
|
||||
- 70daa7_: Make sure MT=3 cross section is not used
|
||||
- 40b05f_: Ensure source bank is resampled for fixed source runs
|
||||
- 9586ed_: Fix two hexagonal lattice bugs
|
||||
- a855e8_: Make sure graphite models don't error out on max events
|
||||
- 7294a1_: Fix incorrect check on cmfd.xml
|
||||
- 12f246_: Ensure number of realizations is written to statepoint
|
||||
- 0227f4_: Fix bug when sampling multiple energy distributions
|
||||
- 51deaa_: Prevent segfault when user specifies '18' on tally scores
|
||||
- fed74b_: Prevent duplicate tally scores
|
||||
- 8467ae_: Better threshold for allowable lost particles
|
||||
- 493c6f_: Fix type of return argument for h5pget_driver_f
|
||||
|
||||
.. _299322: https://github.com/mit-crpg/openmc/commit/299322
|
||||
.. _d74840: https://github.com/mit-crpg/openmc/commit/d74840
|
||||
.. _c29a81: https://github.com/mit-crpg/openmc/commit/c29a81
|
||||
.. _3edc23: https://github.com/mit-crpg/openmc/commit/3edc23
|
||||
.. _629e3b: https://github.com/mit-crpg/openmc/commit/629e3b
|
||||
.. _5dbe8b: https://github.com/mit-crpg/openmc/commit/5dbe8b
|
||||
.. _ff66f4: https://github.com/mit-crpg/openmc/commit/ff66f4
|
||||
.. _441fd4: https://github.com/mit-crpg/openmc/commit/441fd4
|
||||
.. _7e5974: https://github.com/mit-crpg/openmc/commit/7e5974
|
||||
.. _70daa7: https://github.com/mit-crpg/openmc/commit/70daa7
|
||||
.. _40b05f: https://github.com/mit-crpg/openmc/commit/40b05f
|
||||
.. _9586ed: https://github.com/mit-crpg/openmc/commit/9586ed
|
||||
.. _a855e8: https://github.com/mit-crpg/openmc/commit/a855e8
|
||||
.. _7294a1: https://github.com/mit-crpg/openmc/commit/7294a1
|
||||
.. _12f246: https://github.com/mit-crpg/openmc/commit/12f246
|
||||
.. _0227f4: https://github.com/mit-crpg/openmc/commit/0227f4
|
||||
.. _51deaa: https://github.com/mit-crpg/openmc/commit/51deaa
|
||||
.. _fed74b: https://github.com/mit-crpg/openmc/commit/fed74b
|
||||
.. _8467ae: https://github.com/mit-crpg/openmc/commit/8467ae
|
||||
.. _493c6f: https://github.com/mit-crpg/openmc/commit/493c6f
|
||||
|
||||
------------
|
||||
Contributors
|
||||
|
|
@ -81,11 +86,11 @@ Contributors
|
|||
This release contains new contributions from the following people:
|
||||
|
||||
- `Will Boyd <wbinventor@gmail.com>`_
|
||||
- `Sterling Harper <sterlingmharper@mit.edu>`_
|
||||
- `Bryan Herman <hermab53@gmail.com>`_
|
||||
- `Derek Gaston <friedmud@gmail.com>`_
|
||||
- `Sterling Harper <sterlingmharper@gmail.com>`_
|
||||
- `Colin Josey <cjosey@mit.edu>`_
|
||||
- `Jingang Liang <liangjg2008@gmail.com>`_
|
||||
- `Adam Nelson <nelsonag@umich.edu>`_
|
||||
- `Paul Romano <paul.k.romano@gmail.com>`_
|
||||
- `Kelly Rowland <kellylynnerowland@gmail.com>`_
|
||||
- `Sam Shaner <samuelshaner@gmail.com>`_
|
||||
- `Jon Walsh <walshjon@mit.edu>`_
|
||||
|
|
|
|||
|
|
@ -16,16 +16,16 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
moderator = openmc.Material(material_id=41, name='moderator')
|
||||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O', '71t')
|
||||
|
||||
fuel = openmc.Material(material_id=40, name='fuel')
|
||||
fuel.set_density('g/cc', 4.5)
|
||||
|
|
|
|||
|
|
@ -16,10 +16,10 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
u238 = openmc.Nuclide('U-238')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
u238 = openmc.Nuclide('U238')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
fuel1 = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
@ -34,7 +34,7 @@ moderator = openmc.Material(material_id=3, name='moderator')
|
|||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O', '71t')
|
||||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([fuel1, fuel2, moderator])
|
||||
|
|
|
|||
|
|
@ -15,10 +15,10 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
fe56 = openmc.Nuclide('Fe-56')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
fe56 = openmc.Nuclide('Fe56')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
fuel = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
@ -29,7 +29,7 @@ moderator = openmc.Material(material_id=2, name='moderator')
|
|||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O', '71t')
|
||||
|
||||
iron = openmc.Material(material_id=3, name='iron')
|
||||
iron.set_density('g/cc', 7.9)
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
fuel = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
@ -28,7 +28,7 @@ moderator = openmc.Material(material_id=2, name='moderator')
|
|||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O', '71t')
|
||||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials((moderator, fuel))
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
fuel = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
@ -28,7 +28,7 @@ moderator = openmc.Material(material_id=2, name='moderator')
|
|||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O', '71t')
|
||||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([moderator, fuel])
|
||||
|
|
|
|||
|
|
@ -15,39 +15,39 @@ particles = 1000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
h2 = openmc.Nuclide('H-2')
|
||||
he4 = openmc.Nuclide('He-4')
|
||||
b10 = openmc.Nuclide('B-10')
|
||||
b11 = openmc.Nuclide('B-11')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
o17 = openmc.Nuclide('O-17')
|
||||
cr50 = openmc.Nuclide('Cr-50')
|
||||
cr52 = openmc.Nuclide('Cr-52')
|
||||
cr53 = openmc.Nuclide('Cr-53')
|
||||
cr54 = openmc.Nuclide('Cr-54')
|
||||
fe54 = openmc.Nuclide('Fe-54')
|
||||
fe56 = openmc.Nuclide('Fe-56')
|
||||
fe57 = openmc.Nuclide('Fe-57')
|
||||
fe58 = openmc.Nuclide('Fe-58')
|
||||
zr90 = openmc.Nuclide('Zr-90')
|
||||
zr91 = openmc.Nuclide('Zr-91')
|
||||
zr92 = openmc.Nuclide('Zr-92')
|
||||
zr94 = openmc.Nuclide('Zr-94')
|
||||
zr96 = openmc.Nuclide('Zr-96')
|
||||
sn112 = openmc.Nuclide('Sn-112')
|
||||
sn114 = openmc.Nuclide('Sn-114')
|
||||
sn115 = openmc.Nuclide('Sn-115')
|
||||
sn116 = openmc.Nuclide('Sn-116')
|
||||
sn117 = openmc.Nuclide('Sn-117')
|
||||
sn118 = openmc.Nuclide('Sn-118')
|
||||
sn119 = openmc.Nuclide('Sn-119')
|
||||
sn120 = openmc.Nuclide('Sn-120')
|
||||
sn122 = openmc.Nuclide('Sn-122')
|
||||
sn124 = openmc.Nuclide('Sn-124')
|
||||
u234 = openmc.Nuclide('U-234')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
u238 = openmc.Nuclide('U-238')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
h2 = openmc.Nuclide('H2')
|
||||
he4 = openmc.Nuclide('He4')
|
||||
b10 = openmc.Nuclide('B10')
|
||||
b11 = openmc.Nuclide('B11')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
o17 = openmc.Nuclide('O17')
|
||||
cr50 = openmc.Nuclide('Cr50')
|
||||
cr52 = openmc.Nuclide('Cr52')
|
||||
cr53 = openmc.Nuclide('Cr53')
|
||||
cr54 = openmc.Nuclide('Cr54')
|
||||
fe54 = openmc.Nuclide('Fe54')
|
||||
fe56 = openmc.Nuclide('Fe56')
|
||||
fe57 = openmc.Nuclide('Fe57')
|
||||
fe58 = openmc.Nuclide('Fe58')
|
||||
zr90 = openmc.Nuclide('Zr90')
|
||||
zr91 = openmc.Nuclide('Zr91')
|
||||
zr92 = openmc.Nuclide('Zr92')
|
||||
zr94 = openmc.Nuclide('Zr94')
|
||||
zr96 = openmc.Nuclide('Zr96')
|
||||
sn112 = openmc.Nuclide('Sn112')
|
||||
sn114 = openmc.Nuclide('Sn114')
|
||||
sn115 = openmc.Nuclide('Sn115')
|
||||
sn116 = openmc.Nuclide('Sn116')
|
||||
sn117 = openmc.Nuclide('Sn117')
|
||||
sn118 = openmc.Nuclide('Sn118')
|
||||
sn119 = openmc.Nuclide('Sn119')
|
||||
sn120 = openmc.Nuclide('Sn120')
|
||||
sn122 = openmc.Nuclide('Sn122')
|
||||
sn124 = openmc.Nuclide('Sn124')
|
||||
u234 = openmc.Nuclide('U234')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
u238 = openmc.Nuclide('U238')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
uo2 = openmc.Material(material_id=1, name='UO2 fuel at 2.4% wt enrichment')
|
||||
|
|
@ -98,7 +98,7 @@ borated_water.add_nuclide(h1, 4.9457e-2)
|
|||
borated_water.add_nuclide(h2, 7.4196e-6)
|
||||
borated_water.add_nuclide(o16, 2.4672e-2)
|
||||
borated_water.add_nuclide(o17, 6.0099e-5)
|
||||
borated_water.add_s_alpha_beta('HH2O', '71t')
|
||||
borated_water.add_s_alpha_beta('c_H_in_H2O', '71t')
|
||||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([uo2, helium, zircaloy, borated_water])
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate a Nuclides
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
|
||||
# Instantiate a Material and register the Nuclide
|
||||
fuel = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
|
|||
|
|
@ -5,14 +5,14 @@
|
|||
|
||||
<material id="40">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="41">
|
||||
<density value="1.0" units="g/cc" />
|
||||
<nuclide name="H-1" ao="2.0" />
|
||||
<nuclide name="O-16" ao="1.0" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="H1" ao="2.0" />
|
||||
<nuclide name="O16" ao="1.0" />
|
||||
<sab name="c_H_in_H2O" xs="71t" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -5,19 +5,19 @@
|
|||
|
||||
<material id="1">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="2">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-238" ao="1.0" />
|
||||
<nuclide name="U238" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="3">
|
||||
<density value="1.0" units="g/cc" />
|
||||
<nuclide name="O-16" ao="1.0" />
|
||||
<nuclide name="H-1" ao="2.0" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="O16" ao="1.0" />
|
||||
<nuclide name="H1" ao="2.0" />
|
||||
<sab name="c_H_in_H2O" xs="71t" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -6,14 +6,14 @@
|
|||
<!-- Definition of materials -->
|
||||
<material id="1">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="2">
|
||||
<density value="1.0" units="g/cc" />
|
||||
<nuclide name="H-1" ao="2.0" />
|
||||
<nuclide name="O-16" ao="1.0" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="H1" ao="2.0" />
|
||||
<nuclide name="O16" ao="1.0" />
|
||||
<sab name="c_H_in_H2O" xs="71t" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -6,14 +6,14 @@
|
|||
<!-- Definition of materials -->
|
||||
<material id="1">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="2">
|
||||
<density value="1.0" units="g/cc" />
|
||||
<nuclide name="H-1" ao="2.0" />
|
||||
<nuclide name="O-16" ao="1.0" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="H1" ao="2.0" />
|
||||
<nuclide name="O16" ao="1.0" />
|
||||
<sab name="c_H_in_H2O" xs="71t" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -12,59 +12,59 @@
|
|||
<!-- UO2 fuel at 2.4 wt% enrichment -->
|
||||
<material id="1">
|
||||
<density value="10.29769" units="g/cm3" />
|
||||
<nuclide name="U-234" ao="4.4843e-06" />
|
||||
<nuclide name="U-235" ao="5.5815e-04" />
|
||||
<nuclide name="U-238" ao="2.2408e-02" />
|
||||
<nuclide name="O-16" ao="4.5829e-02" />
|
||||
<nuclide name="O-17" ao="1.1164e-04" />
|
||||
<nuclide name="U234" ao="4.4843e-06" />
|
||||
<nuclide name="U235" ao="5.5815e-04" />
|
||||
<nuclide name="U238" ao="2.2408e-02" />
|
||||
<nuclide name="O16" ao="4.5829e-02" />
|
||||
<nuclide name="O17" ao="1.1164e-04" />
|
||||
</material>
|
||||
|
||||
<!-- Helium for gap -->
|
||||
<material id="2">
|
||||
<density value="0.001598" units="g/cm3" />
|
||||
<nuclide name="He-4" ao="2.4044e-04" />
|
||||
<nuclide name="He4" ao="2.4044e-04" />
|
||||
</material>
|
||||
|
||||
<!-- Zircaloy 4 -->
|
||||
<material id="3">
|
||||
<density value="6.55" units="g/cm3" />
|
||||
<nuclide name="O-16" ao="3.0743e-04" />
|
||||
<nuclide name="O-17" ao="7.4887e-07" />
|
||||
<nuclide name="Cr-50" ao="3.2962e-06" />
|
||||
<nuclide name="Cr-52" ao="6.3564e-05" />
|
||||
<nuclide name="Cr-53" ao="7.2076e-06" />
|
||||
<nuclide name="Cr-54" ao="1.7941e-06" />
|
||||
<nuclide name="Fe-54" ao="8.6699e-06" />
|
||||
<nuclide name="Fe-56" ao="1.3610e-04" />
|
||||
<nuclide name="Fe-57" ao="3.1431e-06" />
|
||||
<nuclide name="Fe-58" ao="4.1829e-07" />
|
||||
<nuclide name="Zr-90" ao="2.1827e-02" />
|
||||
<nuclide name="Zr-91" ao="4.7600e-03" />
|
||||
<nuclide name="Zr-92" ao="7.2758e-03" />
|
||||
<nuclide name="Zr-94" ao="7.3734e-03" />
|
||||
<nuclide name="Zr-96" ao="1.1879e-03" />
|
||||
<nuclide name="Sn-112" ao="4.6735e-06" />
|
||||
<nuclide name="Sn-114" ao="3.1799e-06" />
|
||||
<nuclide name="Sn-115" ao="1.6381e-06" />
|
||||
<nuclide name="Sn-116" ao="7.0055e-05" />
|
||||
<nuclide name="Sn-117" ao="3.7003e-05" />
|
||||
<nuclide name="Sn-118" ao="1.1669e-04" />
|
||||
<nuclide name="Sn-119" ao="4.1387e-05" />
|
||||
<nuclide name="Sn-120" ao="1.5697e-04" />
|
||||
<nuclide name="Sn-122" ao="2.2308e-05" />
|
||||
<nuclide name="Sn-124" ao="2.7897e-05" />
|
||||
<nuclide name="O16" ao="3.0743e-04" />
|
||||
<nuclide name="O17" ao="7.4887e-07" />
|
||||
<nuclide name="Cr50" ao="3.2962e-06" />
|
||||
<nuclide name="Cr52" ao="6.3564e-05" />
|
||||
<nuclide name="Cr53" ao="7.2076e-06" />
|
||||
<nuclide name="Cr54" ao="1.7941e-06" />
|
||||
<nuclide name="Fe54" ao="8.6699e-06" />
|
||||
<nuclide name="Fe56" ao="1.3610e-04" />
|
||||
<nuclide name="Fe57" ao="3.1431e-06" />
|
||||
<nuclide name="Fe58" ao="4.1829e-07" />
|
||||
<nuclide name="Zr90" ao="2.1827e-02" />
|
||||
<nuclide name="Zr91" ao="4.7600e-03" />
|
||||
<nuclide name="Zr92" ao="7.2758e-03" />
|
||||
<nuclide name="Zr94" ao="7.3734e-03" />
|
||||
<nuclide name="Zr96" ao="1.1879e-03" />
|
||||
<nuclide name="Sn112" ao="4.6735e-06" />
|
||||
<nuclide name="Sn114" ao="3.1799e-06" />
|
||||
<nuclide name="Sn115" ao="1.6381e-06" />
|
||||
<nuclide name="Sn116" ao="7.0055e-05" />
|
||||
<nuclide name="Sn117" ao="3.7003e-05" />
|
||||
<nuclide name="Sn118" ao="1.1669e-04" />
|
||||
<nuclide name="Sn119" ao="4.1387e-05" />
|
||||
<nuclide name="Sn120" ao="1.5697e-04" />
|
||||
<nuclide name="Sn122" ao="2.2308e-05" />
|
||||
<nuclide name="Sn124" ao="2.7897e-05" />
|
||||
</material>
|
||||
|
||||
|
||||
<!-- Borated water at 975 ppm -->
|
||||
<material id="4">
|
||||
<density value="0.740582" units="g/cm3" />
|
||||
<nuclide name="B-10" ao="8.0042e-06" />
|
||||
<nuclide name="B-11" ao="3.2218e-05" />
|
||||
<nuclide name="H-1" ao="4.9457e-02" />
|
||||
<nuclide name="H-2" ao="7.4196e-06" />
|
||||
<nuclide name="O-16" ao="2.4672e-02" />
|
||||
<nuclide name="O-17" ao="6.0099e-05" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="B10" ao="8.0042e-06" />
|
||||
<nuclide name="B11" ao="3.2218e-05" />
|
||||
<nuclide name="H1" ao="4.9457e-02" />
|
||||
<nuclide name="H2" ao="7.4196e-06" />
|
||||
<nuclide name="O16" ao="2.4672e-02" />
|
||||
<nuclide name="O17" ao="6.0099e-05" />
|
||||
<sab name="c_H_in_H2O" xs="71t" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
<material id="1">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ to locate ACE format cross section libraries if the user has not specified the
|
|||
<cross_sections> tag in
|
||||
.I settings.xml\fP.
|
||||
.SH LICENSE
|
||||
Copyright \(co 2011-2015 Massachusetts Institute of Technology.
|
||||
Copyright \(co 2011-2016 Massachusetts Institute of Technology.
|
||||
.PP
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
|||
|
|
@ -1,65 +0,0 @@
|
|||
from __future__ import division
|
||||
from struct import pack
|
||||
|
||||
|
||||
def ascii_to_binary(ascii_file, binary_file):
|
||||
"""Convert an ACE file in ASCII format (type 1) to binary format (type 2).
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ascii_file : str
|
||||
Filename of ASCII ACE file
|
||||
binary_file : str
|
||||
Filename of binary ACE file to be written
|
||||
|
||||
"""
|
||||
|
||||
# Open ASCII file
|
||||
ascii = open(ascii_file, 'r')
|
||||
|
||||
# Set default record length
|
||||
record_length = 4096
|
||||
|
||||
# Read data from ASCII file
|
||||
lines = ascii.readlines()
|
||||
ascii.close()
|
||||
|
||||
# Open binary file
|
||||
binary = open(binary_file, 'wb')
|
||||
|
||||
idx = 0
|
||||
while idx < len(lines):
|
||||
# Read/write header block
|
||||
hz = lines[idx][:10].encode('UTF-8')
|
||||
aw0 = float(lines[idx][10:22])
|
||||
tz = float(lines[idx][22:34])
|
||||
hd = lines[idx][35:45].encode('UTF-8')
|
||||
hk = lines[idx + 1][:70].encode('UTF-8')
|
||||
hm = lines[idx + 1][70:80].encode('UTF-8')
|
||||
binary.write(pack('=10sdd10s70s10s', hz, aw0, tz, hd, hk, hm))
|
||||
|
||||
# Read/write IZ/AW pairs
|
||||
data = ' '.join(lines[idx + 2:idx + 6]).split()
|
||||
iz = list(map(int, data[::2]))
|
||||
aw = list(map(float, data[1::2]))
|
||||
izaw = [item for sublist in zip(iz, aw) for item in sublist]
|
||||
binary.write(pack('=' + 16*'id', *izaw))
|
||||
|
||||
# Read/write NXS and JXS arrays. Null bytes are added at the end so
|
||||
# that XSS will start at the second record
|
||||
nxs = list(map(int, ' '.join(lines[idx + 6:idx + 8]).split()))
|
||||
jxs = list(map(int, ' '.join(lines[idx + 8:idx + 12]).split()))
|
||||
binary.write(pack('=16i32i{0}x'.format(record_length - 500), *(nxs + jxs)))
|
||||
|
||||
# Read/write XSS array. Null bytes are added to form a complete record
|
||||
# at the end of the file
|
||||
n_lines = (nxs[0] + 3)//4
|
||||
xss = list(map(float, ' '.join(lines[idx + 12:idx + 12 + n_lines]).split()))
|
||||
extra_bytes = record_length - ((len(xss)*8 - 1) % record_length + 1)
|
||||
binary.write(pack('={0}d{1}x'.format(nxs[0], extra_bytes), *xss))
|
||||
|
||||
# Advance to next table in file
|
||||
idx += 12 + n_lines
|
||||
|
||||
# Close binary file
|
||||
binary.close()
|
||||
|
|
@ -1 +1,16 @@
|
|||
from .data import *
|
||||
from .neutron import *
|
||||
from .reaction import *
|
||||
from .ace import *
|
||||
from .angle_distribution import *
|
||||
from .function import *
|
||||
from .energy_distribution import *
|
||||
from .product import *
|
||||
from .angle_energy import *
|
||||
from .uncorrelated import *
|
||||
from .correlated import *
|
||||
from .kalbach_mann import *
|
||||
from .nbody import *
|
||||
from .thermal import *
|
||||
from .urr import *
|
||||
from .library import *
|
||||
|
|
|
|||
390
openmc/data/ace.py
Normal file
390
openmc/data/ace.py
Normal file
|
|
@ -0,0 +1,390 @@
|
|||
"""This module is for reading ACE-format cross sections. ACE stands for "A
|
||||
Compact ENDF" format and originated from work on MCNP_. It is used in a number
|
||||
of other Monte Carlo particle transport codes.
|
||||
|
||||
ACE-format cross sections are typically generated from ENDF_ files through a
|
||||
cross section processing program like NJOY_. The ENDF data consists of tabulated
|
||||
thermal data, ENDF/B resonance parameters, distribution parameters in the
|
||||
unresolved resonance region, and tabulated data in the fast region. After the
|
||||
ENDF data has been reconstructed and Doppler-broadened, the ACER module
|
||||
generates ACE-format cross sections.
|
||||
|
||||
.. _MCNP: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/
|
||||
.. _NJOY: http://t2.lanl.gov/codes.shtml
|
||||
.. _ENDF: http://www.nndc.bnl.gov/endf
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import division, unicode_literals
|
||||
from os import SEEK_CUR
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import numpy as np
|
||||
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
|
||||
def ascii_to_binary(ascii_file, binary_file):
|
||||
"""Convert an ACE file in ASCII format (type 1) to binary format (type 2).
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ascii_file : str
|
||||
Filename of ASCII ACE file
|
||||
binary_file : str
|
||||
Filename of binary ACE file to be written
|
||||
|
||||
"""
|
||||
|
||||
# Open ASCII file
|
||||
ascii = open(ascii_file, 'r')
|
||||
|
||||
# Set default record length
|
||||
record_length = 4096
|
||||
|
||||
# Read data from ASCII file
|
||||
lines = ascii.readlines()
|
||||
ascii.close()
|
||||
|
||||
# Open binary file
|
||||
binary = open(binary_file, 'wb')
|
||||
|
||||
idx = 0
|
||||
|
||||
while idx < len(lines):
|
||||
# check if it's a > 2.0.0 version header
|
||||
if lines[idx].split()[0][1] == '.':
|
||||
if lines[idx + 1].split()[3] == '3':
|
||||
idx = idx + 3
|
||||
else:
|
||||
raise NotImplementedError('Only backwards compatible ACE'
|
||||
'headers currently supported')
|
||||
# Read/write header block
|
||||
hz = lines[idx][:10].encode('UTF-8')
|
||||
aw0 = float(lines[idx][10:22])
|
||||
tz = float(lines[idx][22:34])
|
||||
hd = lines[idx][35:45].encode('UTF-8')
|
||||
hk = lines[idx + 1][:70].encode('UTF-8')
|
||||
hm = lines[idx + 1][70:80].encode('UTF-8')
|
||||
binary.write(struct.pack(str('=10sdd10s70s10s'), hz, aw0, tz, hd, hk, hm))
|
||||
|
||||
# Read/write IZ/AW pairs
|
||||
data = ' '.join(lines[idx + 2:idx + 6]).split()
|
||||
iz = list(map(int, data[::2]))
|
||||
aw = list(map(float, data[1::2]))
|
||||
izaw = [item for sublist in zip(iz, aw) for item in sublist]
|
||||
binary.write(struct.pack(str('=' + 16*'id'), *izaw))
|
||||
|
||||
# Read/write NXS and JXS arrays. Null bytes are added at the end so
|
||||
# that XSS will start at the second record
|
||||
nxs = list(map(int, ' '.join(lines[idx + 6:idx + 8]).split()))
|
||||
jxs = list(map(int, ' '.join(lines[idx + 8:idx + 12]).split()))
|
||||
binary.write(struct.pack(str('=16i32i{0}x'.format(record_length - 500)),
|
||||
*(nxs + jxs)))
|
||||
|
||||
# Read/write XSS array. Null bytes are added to form a complete record
|
||||
# at the end of the file
|
||||
n_lines = (nxs[0] + 3)//4
|
||||
xss = list(map(float, ' '.join(lines[
|
||||
idx + 12:idx + 12 + n_lines]).split()))
|
||||
extra_bytes = record_length - ((len(xss)*8 - 1) % record_length + 1)
|
||||
binary.write(struct.pack(str('={0}d{1}x'.format(nxs[0], extra_bytes)),
|
||||
*xss))
|
||||
|
||||
# Advance to next table in file
|
||||
idx += 12 + n_lines
|
||||
|
||||
# Close binary file
|
||||
binary.close()
|
||||
|
||||
|
||||
def get_table(filename, name=None):
|
||||
"""Read a single table from an ACE file
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Path of the ACE library to load table from
|
||||
name : str, optional
|
||||
Name of table to load, e.g. '92235.71c'
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ace.Table
|
||||
ACE table with specified name. If no name is specified, the first table
|
||||
in the file is returned.
|
||||
|
||||
"""
|
||||
|
||||
lib = Library(filename)
|
||||
if name is None:
|
||||
return lib.tables[0]
|
||||
else:
|
||||
for table in lib.tables:
|
||||
if table.name == name:
|
||||
return table
|
||||
else:
|
||||
raise ValueError('Could not find ACE table with name: {}'
|
||||
.format(name))
|
||||
|
||||
|
||||
class Library(object):
|
||||
"""A Library objects represents an ACE-formatted file which may contain
|
||||
multiple tables with data.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Path of the ACE library file to load.
|
||||
table_names : None, str, or iterable, optional
|
||||
Tables from the file to read in. If None, reads in all of the
|
||||
tables. If str, reads in only the single table of a matching name.
|
||||
verbose : bool, optional
|
||||
Determines whether output is printed to the stdout when reading a
|
||||
Library
|
||||
|
||||
Attributes
|
||||
----------
|
||||
tables : list
|
||||
List of :class:`Table` instances
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, filename, table_names=None, verbose=False):
|
||||
if isinstance(table_names, basestring):
|
||||
table_names = [table_names]
|
||||
if table_names is not None:
|
||||
table_names = set(table_names)
|
||||
|
||||
self.tables = []
|
||||
|
||||
# Determine whether file is ASCII or binary
|
||||
try:
|
||||
fh = open(filename, 'rb')
|
||||
# Grab 10 lines of the library
|
||||
sb = b''.join([fh.readline() for i in range(10)])
|
||||
|
||||
# Try to decode it with ascii
|
||||
sb.decode('ascii')
|
||||
|
||||
# No exception so proceed with ASCII - reopen in non-binary
|
||||
fh.close()
|
||||
with open(filename, 'r') as fh:
|
||||
fh.seek(0)
|
||||
self._read_ascii(fh, table_names, verbose)
|
||||
except UnicodeDecodeError:
|
||||
fh.close()
|
||||
with open(filename, 'rb') as fh:
|
||||
self._read_binary(fh, table_names, verbose)
|
||||
|
||||
def _read_binary(self, ace_file, table_names, verbose=False,
|
||||
recl_length=4096, entries=512):
|
||||
"""Read a binary (Type 2) ACE table.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace_file : file
|
||||
Open ACE file
|
||||
table_names : None, str, or iterable
|
||||
Tables from the file to read in. If None, reads in all of the
|
||||
tables. If str, reads in only the single table of a matching name.
|
||||
verbose : str, optional
|
||||
Whether to display what tables are being read. Defaults to False.
|
||||
recl_length : int, optional
|
||||
Fortran record length in binary file. Default value is 4096 bytes.
|
||||
entries : int, optional
|
||||
Number of entries per record. The default is 512 corresponding to a
|
||||
record length of 4096 bytes with double precision data.
|
||||
|
||||
"""
|
||||
|
||||
while True:
|
||||
start_position = ace_file.tell()
|
||||
|
||||
# Check for end-of-file
|
||||
if len(ace_file.read(1)) == 0:
|
||||
return
|
||||
ace_file.seek(start_position)
|
||||
|
||||
# Read name, atomic mass ratio, temperature, date, comment, and
|
||||
# material
|
||||
name, atomic_weight_ratio, temperature, date, comment, mat = \
|
||||
struct.unpack(str('=10sdd10s70s10s'), ace_file.read(116))
|
||||
name = name.decode().strip()
|
||||
|
||||
# Read ZAID/awr combinations
|
||||
data = struct.unpack(str('=' + 16*'id'), ace_file.read(192))
|
||||
pairs = list(zip(data[::2], data[1::2]))
|
||||
|
||||
# Read NXS
|
||||
nxs = list(struct.unpack(str('=16i'), ace_file.read(64)))
|
||||
|
||||
# Determine length of XSS and number of records
|
||||
length = nxs[0]
|
||||
n_records = (length + entries - 1)//entries
|
||||
|
||||
# verify that we are supposed to read this table in
|
||||
if (table_names is not None) and (name not in table_names):
|
||||
ace_file.seek(start_position + recl_length*(n_records + 1))
|
||||
continue
|
||||
|
||||
if verbose:
|
||||
kelvin = round(temperature * 1e6 / 8.617342e-5)
|
||||
print("Loading nuclide {0} at {1} K".format(name, kelvin))
|
||||
|
||||
# Read JXS
|
||||
jxs = list(struct.unpack(str('=32i'), ace_file.read(128)))
|
||||
|
||||
# Read XSS
|
||||
ace_file.seek(start_position + recl_length)
|
||||
xss = list(struct.unpack(str('={0}d'.format(length)),
|
||||
ace_file.read(length*8)))
|
||||
|
||||
# Insert zeros at beginning of NXS, JXS, and XSS arrays so that the
|
||||
# indexing will be the same as Fortran. This makes it easier to
|
||||
# follow the ACE format specification.
|
||||
nxs.insert(0, 0)
|
||||
nxs = np.array(nxs, dtype=int)
|
||||
|
||||
jxs.insert(0, 0)
|
||||
jxs = np.array(jxs, dtype=int)
|
||||
|
||||
xss.insert(0, 0.0)
|
||||
xss = np.array(xss)
|
||||
|
||||
# Create ACE table with data read in
|
||||
table = Table(name, atomic_weight_ratio, temperature, pairs,
|
||||
nxs, jxs, xss)
|
||||
self.tables.append(table)
|
||||
|
||||
# Advance to next record
|
||||
ace_file.seek(start_position + recl_length*(n_records + 1))
|
||||
|
||||
def _read_ascii(self, ace_file, table_names, verbose=False):
|
||||
"""Read an ASCII (Type 1) ACE table.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace_file : file
|
||||
Open ACE file
|
||||
table_names : None, str, or iterable
|
||||
Tables from the file to read in. If None, reads in all of the
|
||||
tables. If str, reads in only the single table of a matching name.
|
||||
verbose : str, optional
|
||||
Whether to display what tables are being read. Defaults to False.
|
||||
|
||||
"""
|
||||
|
||||
tables_seen = set()
|
||||
|
||||
lines = [ace_file.readline() for i in range(13)]
|
||||
|
||||
while len(lines) != 0 and lines[0] != '':
|
||||
# Read name of table, atomic mass ratio, and temperature. If first
|
||||
# line is empty, we are at end of file
|
||||
|
||||
# check if it's a 2.0 style header
|
||||
if lines[0].split()[0][1] == '.':
|
||||
words = lines[0].split()
|
||||
name = words[1]
|
||||
words = lines[1].split()
|
||||
atomic_weight_ratio = float(words[0])
|
||||
temperature = float(words[1])
|
||||
commentlines = int(words[3])
|
||||
for i in range(commentlines):
|
||||
lines.pop(0)
|
||||
lines.append(ace_file.readline())
|
||||
else:
|
||||
words = lines[0].split()
|
||||
name = words[0]
|
||||
atomic_weight_ratio = float(words[1])
|
||||
temperature = float(words[2])
|
||||
|
||||
datastr = ' '.join(lines[2:6]).split()
|
||||
pairs = list(zip(map(int, datastr[::2]),
|
||||
map(float, datastr[1::2])))
|
||||
|
||||
datastr = '0 ' + ' '.join(lines[6:8])
|
||||
nxs = np.fromstring(datastr, sep=' ', dtype=int)
|
||||
|
||||
n_lines = (nxs[1] + 3)//4
|
||||
n_bytes = len(lines[-1]) * (n_lines - 2) + 1
|
||||
|
||||
# Ensure that we have more tables to read in
|
||||
if (table_names is not None) and (table_names < tables_seen):
|
||||
break
|
||||
tables_seen.add(name)
|
||||
|
||||
# verify that we are suppossed to read this table in
|
||||
if (table_names is not None) and (name not in table_names):
|
||||
ace_file.seek(n_bytes, SEEK_CUR)
|
||||
ace_file.readline()
|
||||
lines = [ace_file.readline() for i in range(13)]
|
||||
continue
|
||||
|
||||
# read and fix over-shoot
|
||||
lines += ace_file.readlines(n_bytes)
|
||||
if 12 + n_lines < len(lines):
|
||||
goback = sum([len(line) for line in lines[12+n_lines:]])
|
||||
lines = lines[:12+n_lines]
|
||||
ace_file.seek(-goback, SEEK_CUR)
|
||||
|
||||
if verbose:
|
||||
kelvin = round(temperature * 1e6 / 8.617342e-5)
|
||||
print("Loading nuclide {0} at {1} K".format(name, kelvin))
|
||||
|
||||
# Insert zeros at beginning of NXS, JXS, and XSS arrays so that the
|
||||
# indexing will be the same as Fortran. This makes it easier to
|
||||
# follow the ACE format specification.
|
||||
datastr = '0 ' + ' '.join(lines[8:12])
|
||||
jxs = np.fromstring(datastr, dtype=int, sep=' ')
|
||||
|
||||
datastr = '0.0 ' + ''.join(lines[12:12+n_lines])
|
||||
xss = np.fromstring(datastr, sep=' ')
|
||||
|
||||
table = Table(name, atomic_weight_ratio, temperature, pairs,
|
||||
nxs, jxs, xss)
|
||||
self.tables.append(table)
|
||||
|
||||
# Read all data blocks
|
||||
lines = [ace_file.readline() for i in range(13)]
|
||||
|
||||
|
||||
class Table(object):
|
||||
"""ACE cross section table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
ZAID identifier of the table, e.g. '92235.70c'.
|
||||
atomic_weight_ratio : float
|
||||
Atomic mass ratio of the target nuclide.
|
||||
temperature : float
|
||||
Temperature of the target nuclide in MeV.
|
||||
pairs : list of tuple
|
||||
16 pairs of ZAIDs and atomic weight ratios. Used for thermal scattering
|
||||
tables to indicate what isotopes scattering is applied to.
|
||||
nxs : numpy.ndarray
|
||||
Array that defines various lengths with in the table
|
||||
jxs : numpy.ndarray
|
||||
Array that gives locations in the ``xss`` array for various blocks of
|
||||
data
|
||||
xss : numpy.ndarray
|
||||
Raw data for the ACE table
|
||||
|
||||
"""
|
||||
def __init__(self, name, atomic_weight_ratio, temperature, pairs,
|
||||
nxs, jxs, xss):
|
||||
self.name = name
|
||||
self.atomic_weight_ratio = atomic_weight_ratio
|
||||
self.temperature = temperature
|
||||
self.pairs = pairs
|
||||
self.nxs = nxs
|
||||
self.jxs = jxs
|
||||
self.xss = xss
|
||||
|
||||
def __repr__(self):
|
||||
return "<ACE Table: {}>".format(self.name)
|
||||
200
openmc/data/angle_distribution.py
Normal file
200
openmc/data/angle_distribution.py
Normal file
|
|
@ -0,0 +1,200 @@
|
|||
from collections import Iterable
|
||||
from numbers import Real
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.stats import Univariate, Tabular, Uniform
|
||||
from .function import INTERPOLATION_SCHEME
|
||||
|
||||
|
||||
class AngleDistribution(object):
|
||||
"""Angle distribution as a function of incoming energy
|
||||
|
||||
Parameters
|
||||
----------
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
mu : Iterable of openmc.stats.Univariate
|
||||
Distribution of scattering cosines corresponding to each incoming energy
|
||||
|
||||
Attributes
|
||||
----------
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
mu : Iterable of openmc.stats.Univariate
|
||||
Distribution of scattering cosines corresponding to each incoming energy
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, energy, mu):
|
||||
super(AngleDistribution, self).__init__()
|
||||
self.energy = energy
|
||||
self.mu = mu
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@property
|
||||
def mu(self):
|
||||
return self._mu
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('angle distribution incoming energy', energy,
|
||||
Iterable, Real)
|
||||
self._energy = energy
|
||||
|
||||
@mu.setter
|
||||
def mu(self, mu):
|
||||
cv.check_type('angle distribution scattering cosines', mu,
|
||||
Iterable, Univariate)
|
||||
self._mu = mu
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write angle distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
|
||||
dset = group.create_dataset('energy', data=self.energy)
|
||||
|
||||
# Make sure all data is tabular
|
||||
mu_tabular = [mu_i if isinstance(mu_i, Tabular) else
|
||||
mu_i.to_tabular() for mu_i in self.mu]
|
||||
|
||||
# Determine total number of (mu,p) pairs and create array
|
||||
n_pairs = sum([len(mu_i.x) for mu_i in mu_tabular])
|
||||
pairs = np.empty((3, n_pairs))
|
||||
|
||||
# Create array for offsets
|
||||
offsets = np.empty(len(mu_tabular), dtype=int)
|
||||
interpolation = np.empty(len(mu_tabular), dtype=int)
|
||||
j = 0
|
||||
|
||||
# Populate offsets and pairs array
|
||||
for i, mu_i in enumerate(mu_tabular):
|
||||
n = len(mu_i.x)
|
||||
offsets[i] = j
|
||||
interpolation[i] = 1 if mu_i.interpolation == 'histogram' else 2
|
||||
pairs[0, j:j+n] = mu_i.x
|
||||
pairs[1, j:j+n] = mu_i.p
|
||||
pairs[2, j:j+n] = mu_i.c
|
||||
j += n
|
||||
|
||||
# Create dataset for distributions
|
||||
dset = group.create_dataset('mu', data=pairs)
|
||||
|
||||
# Write interpolation as attribute
|
||||
dset.attrs['offsets'] = offsets
|
||||
dset.attrs['interpolation'] = interpolation
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate angular distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.AngleDistribution
|
||||
Angular distribution
|
||||
|
||||
"""
|
||||
energy = group['energy'].value
|
||||
data = group['mu']
|
||||
offsets = data.attrs['offsets']
|
||||
interpolation = data.attrs['interpolation']
|
||||
|
||||
mu = []
|
||||
n_energy = len(energy)
|
||||
for i in range(n_energy):
|
||||
# Determine length of outgoing energy distribution and number of
|
||||
# discrete lines
|
||||
j = offsets[i]
|
||||
if i < n_energy - 1:
|
||||
n = offsets[i+1] - j
|
||||
else:
|
||||
n = data.shape[1] - j
|
||||
|
||||
interp = INTERPOLATION_SCHEME[interpolation[i]]
|
||||
mu_i = Tabular(data[0, j:j+n], data[1, j:j+n], interp)
|
||||
mu_i.c = data[2, j:j+n]
|
||||
|
||||
mu.append(mu_i)
|
||||
|
||||
return cls(energy, mu)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, location_dist, location_start):
|
||||
"""Generate an angular distribution from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
location_dist : int
|
||||
Index in the XSS array corresponding to the start of a block,
|
||||
e.g. JXS(9).
|
||||
location_start : int
|
||||
Index in the XSS array corresponding to the start of an angle
|
||||
distribution array
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.AngleDistribution
|
||||
Angular distribution
|
||||
|
||||
"""
|
||||
# Set starting index for angle distribution
|
||||
idx = location_dist + location_start - 1
|
||||
|
||||
# Number of energies at which angular distributions are tabulated
|
||||
n_energies = int(ace.xss[idx])
|
||||
idx += 1
|
||||
|
||||
# Incoming energy grid
|
||||
energy = ace.xss[idx:idx + n_energies]
|
||||
idx += n_energies
|
||||
|
||||
# Read locations for angular distributions
|
||||
lc = ace.xss[idx:idx + n_energies].astype(int)
|
||||
idx += n_energies
|
||||
|
||||
mu = []
|
||||
for i in range(n_energies):
|
||||
if lc[i] > 0:
|
||||
# Equiprobable 32 bin distribution
|
||||
idx = location_dist + abs(lc[i]) - 1
|
||||
cos = ace.xss[idx:idx + 33]
|
||||
pdf = np.zeros(33)
|
||||
pdf[:32] = 1.0/(32.0*np.diff(cos))
|
||||
cdf = np.linspace(0.0, 1.0, 33)
|
||||
|
||||
mu_i = Tabular(cos, pdf, 'histogram', ignore_negative=True)
|
||||
mu_i.c = cdf
|
||||
elif lc[i] < 0:
|
||||
# Tabular angular distribution
|
||||
idx = location_dist + abs(lc[i]) - 1
|
||||
intt = int(ace.xss[idx])
|
||||
n_points = int(ace.xss[idx + 1])
|
||||
data = ace.xss[idx + 2:idx + 2 + 3*n_points]
|
||||
data.shape = (3, n_points)
|
||||
|
||||
mu_i = Tabular(data[0], data[1], INTERPOLATION_SCHEME[intt])
|
||||
mu_i.c = data[2]
|
||||
else:
|
||||
# Isotropic angular distribution
|
||||
mu_i = Uniform(-1., 1.)
|
||||
|
||||
mu.append(mu_i)
|
||||
|
||||
return cls(energy, mu)
|
||||
108
openmc/data/angle_energy.py
Normal file
108
openmc/data/angle_energy.py
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
from abc import ABCMeta, abstractmethod
|
||||
|
||||
import openmc.data
|
||||
|
||||
|
||||
class AngleEnergy(object):
|
||||
"""Distribution in angle and energy of a secondary particle."""
|
||||
|
||||
__metaclass = ABCMeta
|
||||
|
||||
@abstractmethod
|
||||
def to_hdf5(self, group):
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def from_hdf5(group):
|
||||
"""Generate angle-energy distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.AngleEnergy
|
||||
Angle-energy distribution
|
||||
|
||||
"""
|
||||
dist_type = group.attrs['type'].decode()
|
||||
if dist_type == 'uncorrelated':
|
||||
return openmc.data.UncorrelatedAngleEnergy.from_hdf5(group)
|
||||
elif dist_type == 'correlated':
|
||||
return openmc.data.CorrelatedAngleEnergy.from_hdf5(group)
|
||||
elif dist_type == 'kalbach-mann':
|
||||
return openmc.data.KalbachMann.from_hdf5(group)
|
||||
elif dist_type == 'nbody':
|
||||
return openmc.data.NBodyPhaseSpace.from_hdf5(group)
|
||||
|
||||
@staticmethod
|
||||
def from_ace(ace, location_dist, location_start, rx=None):
|
||||
"""Generate an AngleEnergy object from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
location_dist : int
|
||||
Index in the XSS array corresponding to the start of a block,
|
||||
e.g. JXS(11) for the the DLW block.
|
||||
location_start : int
|
||||
Index in the XSS array corresponding to the start of an energy
|
||||
distribution array
|
||||
rx : Reaction
|
||||
Reaction this energy distribution will be associated with
|
||||
|
||||
Returns
|
||||
-------
|
||||
distribution : openmc.data.AngleEnergy
|
||||
Secondary angle-energy distribution
|
||||
|
||||
"""
|
||||
# Set starting index for energy distribution
|
||||
idx = location_dist + location_start - 1
|
||||
|
||||
law = int(ace.xss[idx + 1])
|
||||
location_data = int(ace.xss[idx + 2])
|
||||
|
||||
# Position index for reading law data
|
||||
idx = location_dist + location_data - 1
|
||||
|
||||
# Parse energy distribution data
|
||||
if law == 2:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.DiscretePhoton.from_ace(ace, idx)
|
||||
elif law in (3, 33):
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.LevelInelastic.from_ace(ace, idx)
|
||||
elif law == 4:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.ContinuousTabular.from_ace(
|
||||
ace, idx, location_dist)
|
||||
elif law == 5:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.GeneralEvaporation.from_ace(ace, idx)
|
||||
elif law == 7:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.MaxwellEnergy.from_ace(ace, idx)
|
||||
elif law == 9:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.Evaporation.from_ace(ace, idx)
|
||||
elif law == 11:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.WattEnergy.from_ace(ace, idx)
|
||||
elif law == 44:
|
||||
distribution = openmc.data.KalbachMann.from_ace(
|
||||
ace, idx, location_dist)
|
||||
elif law == 61:
|
||||
distribution = openmc.data.CorrelatedAngleEnergy.from_ace(
|
||||
ace, idx, location_dist)
|
||||
elif law == 66:
|
||||
distribution = openmc.data.NBodyPhaseSpace.from_ace(
|
||||
ace, idx, rx.q_value)
|
||||
else:
|
||||
raise ValueError("Unsupported ACE secondary energy "
|
||||
"distribution law {}".format(law))
|
||||
|
||||
return distribution
|
||||
406
openmc/data/correlated.py
Normal file
406
openmc/data/correlated.py
Normal file
|
|
@ -0,0 +1,406 @@
|
|||
from collections import Iterable
|
||||
from numbers import Real, Integral
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.stats import Tabular, Univariate, Discrete, Mixture, Uniform
|
||||
from .function import INTERPOLATION_SCHEME
|
||||
from .angle_energy import AngleEnergy
|
||||
|
||||
|
||||
class CorrelatedAngleEnergy(AngleEnergy):
|
||||
"""Correlated angle-energy distribution
|
||||
|
||||
Parameters
|
||||
----------
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints defining interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation codes
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
energy_out : Iterable of openmc.stats.Univariate
|
||||
Distribution of outgoing energies corresponding to each incoming energy
|
||||
mu : Iterable of Iterable of openmc.stats.Univariate
|
||||
Distribution of scattering cosine for each incoming/outgoing energy
|
||||
|
||||
Attributes
|
||||
----------
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints defining interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation codes
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
energy_out : Iterable of openmc.stats.Univariate
|
||||
Distribution of outgoing energies corresponding to each incoming energy
|
||||
mu : Iterable of Iterable of openmc.stats.Univariate
|
||||
Distribution of scattering cosine for each incoming/outgoing energy
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, breakpoints, interpolation, energy, energy_out, mu):
|
||||
super(CorrelatedAngleEnergy, self).__init__()
|
||||
self.breakpoints = breakpoints
|
||||
self.interpolation = interpolation
|
||||
self.energy = energy
|
||||
self.energy_out = energy_out
|
||||
self.mu = mu
|
||||
|
||||
@property
|
||||
def breakpoints(self):
|
||||
return self._breakpoints
|
||||
|
||||
@property
|
||||
def interpolation(self):
|
||||
return self._interpolation
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@property
|
||||
def energy_out(self):
|
||||
return self._energy_out
|
||||
|
||||
@property
|
||||
def mu(self):
|
||||
return self._mu
|
||||
|
||||
@breakpoints.setter
|
||||
def breakpoints(self, breakpoints):
|
||||
cv.check_type('correlated angle-energy breakpoints', breakpoints,
|
||||
Iterable, Integral)
|
||||
self._breakpoints = breakpoints
|
||||
|
||||
@interpolation.setter
|
||||
def interpolation(self, interpolation):
|
||||
cv.check_type('correlated angle-energy interpolation', interpolation,
|
||||
Iterable, Integral)
|
||||
self._interpolation = interpolation
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('correlated angle-energy incoming energy', energy,
|
||||
Iterable, Real)
|
||||
self._energy = energy
|
||||
|
||||
@energy_out.setter
|
||||
def energy_out(self, energy_out):
|
||||
cv.check_type('correlated angle-energy outgoing energy', energy_out,
|
||||
Iterable, Univariate)
|
||||
self._energy_out = energy_out
|
||||
|
||||
@mu.setter
|
||||
def mu(self, mu):
|
||||
cv.check_iterable_type('correlated angle-energy outgoing cosine',
|
||||
mu, Univariate, 2, 2)
|
||||
self._mu = mu
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['type'] = np.string_('correlated')
|
||||
|
||||
dset = group.create_dataset('energy', data=self.energy)
|
||||
dset.attrs['interpolation'] = np.vstack((self.breakpoints,
|
||||
self.interpolation))
|
||||
|
||||
# Determine total number of (E,p) pairs and create array
|
||||
n_tuple = sum(len(d.x) for d in self.energy_out)
|
||||
eout = np.empty((5, n_tuple))
|
||||
|
||||
# Make sure all mu data is tabular
|
||||
mu_tabular = []
|
||||
for i, mu_i in enumerate(self.mu):
|
||||
mu_tabular.append([mu_ij if isinstance(mu_ij, (Tabular, Discrete)) else
|
||||
mu_ij.to_tabular() for mu_ij in mu_i])
|
||||
|
||||
# Determine total number of (mu,p) points and create array
|
||||
n_tuple = sum(sum(len(mu_ij.x) for mu_ij in mu_i)
|
||||
for mu_i in mu_tabular)
|
||||
mu = np.empty((3, n_tuple))
|
||||
|
||||
# Create array for offsets
|
||||
offsets = np.empty(len(self.energy_out), dtype=int)
|
||||
interpolation = np.empty(len(self.energy_out), dtype=int)
|
||||
n_discrete_lines = np.empty(len(self.energy_out), dtype=int)
|
||||
offset_e = 0
|
||||
offset_mu = 0
|
||||
|
||||
# Populate offsets and eout array
|
||||
for i, d in enumerate(self.energy_out):
|
||||
n = len(d)
|
||||
offsets[i] = offset_e
|
||||
|
||||
if isinstance(d, Mixture):
|
||||
discrete, continuous = d.distribution
|
||||
n_discrete_lines[i] = m = len(discrete)
|
||||
interpolation[i] = 1 if continuous.interpolation == 'histogram' else 2
|
||||
eout[0, offset_e:offset_e+m] = discrete.x
|
||||
eout[1, offset_e:offset_e+m] = discrete.p
|
||||
eout[2, offset_e:offset_e+m] = discrete.c
|
||||
eout[0, offset_e+m:offset_e+n] = continuous.x
|
||||
eout[1, offset_e+m:offset_e+n] = continuous.p
|
||||
eout[2, offset_e+m:offset_e+n] = continuous.c
|
||||
else:
|
||||
if isinstance(d, Tabular):
|
||||
n_discrete_lines[i] = 0
|
||||
interpolation[i] = 1 if d.interpolation == 'histogram' else 2
|
||||
elif isinstance(d, Discrete):
|
||||
n_discrete_lines[i] = n
|
||||
interpolation[i] = 1
|
||||
eout[0, offset_e:offset_e+n] = d.x
|
||||
eout[1, offset_e:offset_e+n] = d.p
|
||||
eout[2, offset_e:offset_e+n] = d.c
|
||||
|
||||
for j, mu_ij in enumerate(mu_tabular[i]):
|
||||
if isinstance(mu_ij, Discrete):
|
||||
eout[3, offset_e+j] = 0
|
||||
else:
|
||||
eout[3, offset_e+j] = 1 if mu_ij.interpolation == 'histogram' else 2
|
||||
eout[4, offset_e+j] = offset_mu
|
||||
|
||||
n_mu = len(mu_ij)
|
||||
mu[0, offset_mu:offset_mu+n_mu] = mu_ij.x
|
||||
mu[1, offset_mu:offset_mu+n_mu] = mu_ij.p
|
||||
mu[2, offset_mu:offset_mu+n_mu] = mu_ij.c
|
||||
|
||||
offset_mu += n_mu
|
||||
|
||||
offset_e += n
|
||||
|
||||
# Create dataset for outgoing energy distributions
|
||||
dset = group.create_dataset('energy_out', data=eout)
|
||||
|
||||
# Write interpolation on outgoing energy as attribute
|
||||
dset.attrs['offsets'] = offsets
|
||||
dset.attrs['interpolation'] = interpolation
|
||||
dset.attrs['n_discrete_lines'] = n_discrete_lines
|
||||
|
||||
# Create dataset for outgoing angle distributions
|
||||
group.create_dataset('mu', data=mu)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate correlated angle-energy distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.CorrelatedAngleEnergy
|
||||
Correlated angle-energy distribution
|
||||
|
||||
"""
|
||||
interp_data = group['energy'].attrs['interpolation']
|
||||
energy_breakpoints = interp_data[0, :]
|
||||
energy_interpolation = interp_data[1, :]
|
||||
energy = group['energy'].value
|
||||
|
||||
offsets = group['energy_out'].attrs['offsets']
|
||||
interpolation = group['energy_out'].attrs['interpolation']
|
||||
n_discrete_lines = group['energy_out'].attrs['n_discrete_lines']
|
||||
dset_eout = group['energy_out'].value
|
||||
energy_out = []
|
||||
|
||||
dset_mu = group['mu'].value
|
||||
mu = []
|
||||
|
||||
n_energy = len(energy)
|
||||
for i in range(n_energy):
|
||||
# Determine length of outgoing energy distribution and number of
|
||||
# discrete lines
|
||||
offset_e = offsets[i]
|
||||
if i < n_energy - 1:
|
||||
n = offsets[i+1] - offset_e
|
||||
else:
|
||||
n = dset_eout.shape[1] - offset_e
|
||||
m = n_discrete_lines[i]
|
||||
|
||||
# Create discrete distribution if lines are present
|
||||
if m > 0:
|
||||
x = dset_eout[0, offset_e:offset_e+m]
|
||||
p = dset_eout[1, offset_e:offset_e+m]
|
||||
eout_discrete = Discrete(x, p)
|
||||
eout_discrete.c = dset_eout[2, offset_e:offset_e+m]
|
||||
p_discrete = eout_discrete.c[-1]
|
||||
|
||||
# Create continuous distribution
|
||||
if m < n:
|
||||
interp = INTERPOLATION_SCHEME[interpolation[i]]
|
||||
|
||||
x = dset_eout[0, offset_e+m:offset_e+n]
|
||||
p = dset_eout[1, offset_e+m:offset_e+n]
|
||||
eout_continuous = Tabular(x, p, interp, ignore_negative=True)
|
||||
eout_continuous.c = dset_eout[2, offset_e+m:offset_e+n]
|
||||
|
||||
# If both continuous and discrete are present, create a mixture
|
||||
# distribution
|
||||
if m == 0:
|
||||
eout_i = eout_continuous
|
||||
elif m == n:
|
||||
eout_i = eout_discrete
|
||||
else:
|
||||
eout_i = Mixture([p_discrete, 1. - p_discrete],
|
||||
[eout_discrete, eout_continuous])
|
||||
|
||||
# Read angular distributions
|
||||
mu_i = []
|
||||
for j in range(n):
|
||||
# Determine interpolation scheme
|
||||
interp_code = int(dset_eout[3, offsets[i] + j])
|
||||
|
||||
# Determine offset and length
|
||||
offset_mu = int(dset_eout[4, offsets[i] + j])
|
||||
if offsets[i] + j < dset_eout.shape[1] - 1:
|
||||
n_mu = int(dset_eout[4, offsets[i] + j + 1]) - offset_mu
|
||||
else:
|
||||
n_mu = dset_mu.shape[1] - offset_mu
|
||||
|
||||
# Get data
|
||||
x = dset_mu[0, offset_mu:offset_mu+n_mu]
|
||||
p = dset_mu[1, offset_mu:offset_mu+n_mu]
|
||||
c = dset_mu[2, offset_mu:offset_mu+n_mu]
|
||||
|
||||
if interp_code == 0:
|
||||
mu_ij = Discrete(x, p)
|
||||
else:
|
||||
mu_ij = Tabular(x, p, INTERPOLATION_SCHEME[interp_code],
|
||||
ignore_negative=True)
|
||||
mu_ij.c = c
|
||||
mu_i.append(mu_ij)
|
||||
|
||||
offset_mu += n_mu
|
||||
|
||||
energy_out.append(eout_i)
|
||||
mu.append(mu_i)
|
||||
|
||||
return cls(energy_breakpoints, energy_interpolation,
|
||||
energy, energy_out, mu)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, idx, ldis):
|
||||
"""Generate correlated angle-energy distribution from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
idx : int
|
||||
Index in XSS array of the start of the energy distribution data
|
||||
(LDIS + LOCC - 1)
|
||||
ldis : int
|
||||
Index in XSS array of the start of the energy distribution block
|
||||
(e.g. JXS[11])
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.CorrelatedAngleEnergy
|
||||
Correlated angle-energy distribution
|
||||
|
||||
"""
|
||||
# Read number of interpolation regions and incoming energies
|
||||
n_regions = int(ace.xss[idx])
|
||||
n_energy_in = int(ace.xss[idx + 1 + 2*n_regions])
|
||||
|
||||
# Get interpolation information
|
||||
idx += 1
|
||||
if n_regions > 0:
|
||||
breakpoints = ace.xss[idx:idx + n_regions].astype(int)
|
||||
interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int)
|
||||
else:
|
||||
breakpoints = np.array([n_energy_in])
|
||||
interpolation = np.array([2])
|
||||
|
||||
# Incoming energies at which distributions exist
|
||||
idx += 2*n_regions + 1
|
||||
energy = ace.xss[idx:idx + n_energy_in]
|
||||
|
||||
# Location of distributions
|
||||
idx += n_energy_in
|
||||
loc_dist = ace.xss[idx:idx + n_energy_in].astype(int)
|
||||
|
||||
# Initialize list of distributions
|
||||
energy_out = []
|
||||
mu = []
|
||||
|
||||
# Read each outgoing energy distribution
|
||||
for i in range(n_energy_in):
|
||||
idx = ldis + loc_dist[i] - 1
|
||||
|
||||
# intt = interpolation scheme (1=hist, 2=lin-lin)
|
||||
INTTp = int(ace.xss[idx])
|
||||
intt = INTTp % 10
|
||||
n_discrete_lines = (INTTp - intt)//10
|
||||
if intt not in (1, 2):
|
||||
warn("Interpolation scheme for continuous tabular distribution "
|
||||
"is not histogram or linear-linear.")
|
||||
intt = 2
|
||||
|
||||
# Secondary energy distribution
|
||||
n_energy_out = int(ace.xss[idx + 1])
|
||||
data = ace.xss[idx + 2:idx + 2 + 4*n_energy_out]
|
||||
data.shape = (4, n_energy_out)
|
||||
|
||||
# Create continuous distribution
|
||||
eout_continuous = Tabular(data[0][n_discrete_lines:],
|
||||
data[1][n_discrete_lines:],
|
||||
INTERPOLATION_SCHEME[intt],
|
||||
ignore_negative=True)
|
||||
eout_continuous.c = data[2][n_discrete_lines:]
|
||||
if np.any(data[1][n_discrete_lines:] < 0.0):
|
||||
warn("Correlated angle-energy distribution has negative "
|
||||
"probabilities.")
|
||||
|
||||
# If discrete lines are present, create a mixture distribution
|
||||
if n_discrete_lines > 0:
|
||||
eout_discrete = Discrete(data[0][:n_discrete_lines],
|
||||
data[1][:n_discrete_lines])
|
||||
eout_discrete.c = data[2][:n_discrete_lines]
|
||||
if n_discrete_lines == n_energy_out:
|
||||
eout_i = eout_discrete
|
||||
else:
|
||||
p_discrete = min(sum(eout_discrete.p), 1.0)
|
||||
eout_i = Mixture([p_discrete, 1. - p_discrete],
|
||||
[eout_discrete, eout_continuous])
|
||||
else:
|
||||
eout_i = eout_continuous
|
||||
|
||||
energy_out.append(eout_i)
|
||||
|
||||
lc = data[3].astype(int)
|
||||
|
||||
# Secondary angular distributions
|
||||
mu_i = []
|
||||
for j in range(n_energy_out):
|
||||
if lc[j] > 0:
|
||||
idx = ldis + abs(lc[j]) - 1
|
||||
|
||||
intt = int(ace.xss[idx])
|
||||
n_cosine = int(ace.xss[idx + 1])
|
||||
data = ace.xss[idx + 2:idx + 2 + 3*n_cosine]
|
||||
data.shape = (3, n_cosine)
|
||||
|
||||
mu_ij = Tabular(data[0], data[1], INTERPOLATION_SCHEME[intt])
|
||||
mu_ij.c = data[2]
|
||||
else:
|
||||
# Isotropic distribution
|
||||
mu_ij = Uniform(-1., 1.)
|
||||
|
||||
mu_i.append(mu_ij)
|
||||
|
||||
# Add cosine distributions for this incoming energy to list
|
||||
mu.append(mu_i)
|
||||
|
||||
return cls(breakpoints, interpolation, energy, energy_out, mu)
|
||||
|
|
@ -1,101 +1,177 @@
|
|||
# Isotopic abundances from M. Berglund and M. E. Wieser, "Isotopic compositions
|
||||
# of the elements 2009 (IUPAC Technical Report)", Pure. Appl. Chem. 83 (2),
|
||||
# pp. 397--410 (2011).
|
||||
natural_abundance = {
|
||||
'H-1': 0.999885, 'H-2': 0.000115, 'He-3': 1.34e-06,
|
||||
'He-4': 0.99999866, 'Li-6': 0.0759, 'Li-7': 0.9241,
|
||||
'Be-9': 1.0, 'B-10': 0.199, 'B-11': 0.801,
|
||||
'C-12': 0.9893, 'C-13': 0.0107, 'N-14': 0.99636,
|
||||
'N-15': 0.00364, 'O-16': 0.99757, 'O-17': 0.00038,
|
||||
'O-18': 0.00205, 'F-19': 1.0, 'Ne-20': 0.9048,
|
||||
'Ne-21': 0.0027, 'Ne-22': 0.0925, 'Na-23': 1.0,
|
||||
'Mg-24': 0.7899, 'Mg-25': 0.1, 'Mg-26': 0.1101,
|
||||
'Al-27': 1.0, 'Si-28': 0.92223, 'Si-29': 0.04685,
|
||||
'Si-30': 0.03092, 'P-31': 1.0, 'S-32': 0.9499,
|
||||
'S-33': 0.0075, 'S-34': 0.0425, 'S-36': 0.0001,
|
||||
'Cl-35': 0.7576, 'Cl-37': 0.2424, 'Ar-36': 0.003336,
|
||||
'Ar-38': 0.000629, 'Ar-40': 0.996035, 'K-39': 0.932581,
|
||||
'K-40': 0.000117, 'K-41': 0.067302, 'Ca-40': 0.96941,
|
||||
'Ca-42': 0.00647, 'Ca-43': 0.00135, 'Ca-44': 0.02086,
|
||||
'Ca-46': 4e-05, 'Ca-48': 0.00187, 'Sc-45': 1.0,
|
||||
'Ti-46': 0.0825, 'Ti-47': 0.0744, 'Ti-48': 0.7372,
|
||||
'Ti-49': 0.0541, 'Ti-50': 0.0518, 'V-50': 0.0025,
|
||||
'V-51': 0.9975, 'Cr-50': 0.04345, 'Cr-52': 0.83789,
|
||||
'Cr-53': 0.09501, 'Cr-54': 0.02365, 'Mn-55': 1.0,
|
||||
'Fe-54': 0.05845, 'Fe-56': 0.91754, 'Fe-57': 0.02119,
|
||||
'Fe-58': 0.00282, 'Co-59': 1.0, 'Ni-58': 0.68077,
|
||||
'Ni-60': 0.26223, 'Ni-61': 0.011399, 'Ni-62': 0.036346,
|
||||
'Ni-64': 0.009255, 'Cu-63': 0.6915, 'Cu-65': 0.3085,
|
||||
'Zn-64': 0.4917, 'Zn-66': 0.2773, 'Zn-67': 0.0404,
|
||||
'Zn-68': 0.1845, 'Zn-70': 0.0061, 'Ga-69': 0.60108,
|
||||
'Ga-71': 0.39892, 'Ge-70': 0.2057, 'Ge-72': 0.2745,
|
||||
'Ge-73': 0.0775, 'Ge-74': 0.365, 'Ge-76': 0.0773,
|
||||
'As-75': 1.0, 'Se-74': 0.0089, 'Se-76': 0.0937,
|
||||
'Se-77': 0.0763, 'Se-78': 0.2377, 'Se-80': 0.4961,
|
||||
'Se-82': 0.0873, 'Br-79': 0.5069, 'Br-81': 0.4931,
|
||||
'Kr-78': 0.00355, 'Kr-80': 0.02286, 'Kr-82': 0.11593,
|
||||
'Kr-83': 0.115, 'Kr-84': 0.56987, 'Kr-86': 0.17279,
|
||||
'Rb-85': 0.7217, 'Rb-87': 0.2783, 'Sr-84': 0.0056,
|
||||
'Sr-86': 0.0986, 'Sr-87': 0.07, 'Sr-88': 0.8258,
|
||||
'Y-89': 1.0, 'Zr-90': 0.5145, 'Zr-91': 0.1122,
|
||||
'Zr-92': 0.1715, 'Zr-94': 0.1738, 'Zr-96': 0.028,
|
||||
'Nb-93': 1.0, 'Mo-92': 0.1453, 'Mo-94': 0.0915,
|
||||
'Mo-95': 0.1584, 'Mo-96': 0.1667, 'Mo-97': 0.096,
|
||||
'Mo-98': 0.2439, 'Mo-100': 0.0982, 'Ru-96': 0.0554,
|
||||
'Ru-98': 0.0187, 'Ru-99': 0.1276, 'Ru-100': 0.126,
|
||||
'Ru-101': 0.1706, 'Ru-102': 0.3155, 'Ru-104': 0.1862,
|
||||
'Rh-103': 1.0, 'Pd-102': 0.0102, 'Pd-104': 0.1114,
|
||||
'Pd-105': 0.2233, 'Pd-106': 0.2733, 'Pd-108': 0.2646,
|
||||
'Pd-110': 0.1172, 'Ag-107': 0.51839, 'Ag-109': 0.48161,
|
||||
'Cd-106': 0.0125, 'Cd-108': 0.0089, 'Cd-110': 0.1249,
|
||||
'Cd-111': 0.128, 'Cd-112': 0.2413, 'Cd-113': 0.1222,
|
||||
'Cd-114': 0.2873, 'Cd-116': 0.0749, 'In-113': 0.0429,
|
||||
'In-115': 0.9571, 'Sn-112': 0.0097, 'Sn-114': 0.0066,
|
||||
'Sn-115': 0.0034, 'Sn-116': 0.1454, 'Sn-117': 0.0768,
|
||||
'Sn-118': 0.2422, 'Sn-119': 0.0859, 'Sn-120': 0.3258,
|
||||
'Sn-122': 0.0463, 'Sn-124': 0.0579, 'Sb-121': 0.5721,
|
||||
'Sb-123': 0.4279, 'Te-120': 0.0009, 'Te-122': 0.0255,
|
||||
'Te-123': 0.0089, 'Te-124': 0.0474, 'Te-125': 0.0707,
|
||||
'Te-126': 0.1884, 'Te-128': 0.3174, 'Te-130': 0.3408,
|
||||
'I-127': 1.0, 'Xe-124': 0.000952, 'Xe-126': 0.00089,
|
||||
'Xe-128': 0.019102, 'Xe-129': 0.264006, 'Xe-130': 0.04071,
|
||||
'Xe-131': 0.212324, 'Xe-132': 0.269086, 'Xe-134': 0.104357,
|
||||
'Xe-136': 0.088573, 'Cs-133': 1.0, 'Ba-130': 0.00106,
|
||||
'Ba-132': 0.00101, 'Ba-134': 0.02417, 'Ba-135': 0.06592,
|
||||
'Ba-136': 0.07854, 'Ba-137': 0.11232, 'Ba-138': 0.71698,
|
||||
'La-138': 0.0008881, 'La-139': 0.9991119, 'Ce-136': 0.00185,
|
||||
'Ce-138': 0.00251, 'Ce-140': 0.8845, 'Ce-142': 0.11114,
|
||||
'Pr-141': 1.0, 'Nd-142': 0.27152, 'Nd-143': 0.12174,
|
||||
'Nd-144': 0.23798, 'Nd-145': 0.08293, 'Nd-146': 0.17189,
|
||||
'Nd-148': 0.05756, 'Nd-150': 0.05638, 'Sm-144': 0.0307,
|
||||
'Sm-147': 0.1499, 'Sm-148': 0.1124, 'Sm-149': 0.1382,
|
||||
'Sm-150': 0.0738, 'Sm-152': 0.2675, 'Sm-154': 0.2275,
|
||||
'Eu-151': 0.4781, 'Eu-153': 0.5219, 'Gd-152': 0.002,
|
||||
'Gd-154': 0.0218, 'Gd-155': 0.148, 'Gd-156': 0.2047,
|
||||
'Gd-157': 0.1565, 'Gd-158': 0.2484, 'Gd-160': 0.2186,
|
||||
'Tb-159': 1.0, 'Dy-156': 0.00056, 'Dy-158': 0.00095,
|
||||
'Dy-160': 0.02329, 'Dy-161': 0.18889, 'Dy-162': 0.25475,
|
||||
'Dy-163': 0.24896, 'Dy-164': 0.2826, 'Ho-165': 1.0,
|
||||
'Er-162': 0.00139, 'Er-164': 0.01601, 'Er-166': 0.33503,
|
||||
'Er-167': 0.22869, 'Er-168': 0.26978, 'Er-170': 0.1491,
|
||||
'Tm-169': 1.0, 'Yb-168': 0.00123, 'Yb-170': 0.02982,
|
||||
'Yb-171': 0.1409, 'Yb-172': 0.2168, 'Yb-173': 0.16103,
|
||||
'Yb-174': 0.32026, 'Yb-176': 0.12996, 'Lu-175': 0.97401,
|
||||
'Lu-176': 0.02599, 'Hf-174': 0.0016, 'Hf-176': 0.0526,
|
||||
'Hf-177': 0.186, 'Hf-178': 0.2728, 'Hf-179': 0.1362,
|
||||
'Hf-180': 0.3508, 'Ta-180': 0.0001201, 'Ta-181': 0.9998799,
|
||||
'W-180': 0.0012, 'W-182': 0.265, 'W-183': 0.1431,
|
||||
'W-184': 0.3064, 'W-186': 0.2843, 'Re-185': 0.374,
|
||||
'Re-187': 0.626, 'Os-184': 0.0002, 'Os-186': 0.0159,
|
||||
'Os-187': 0.0196, 'Os-188': 0.1324, 'Os-189': 0.1615,
|
||||
'Os-190': 0.2626, 'Os-192': 0.4078, 'Ir-191': 0.373,
|
||||
'Ir-193': 0.627, 'Pt-190': 0.00012, 'Pt-192': 0.00782,
|
||||
'Pt-194': 0.3286, 'Pt-195': 0.3378, 'Pt-196': 0.2521,
|
||||
'Pt-198': 0.07356, 'Au-197': 1.0, 'Hg-196': 0.0015,
|
||||
'Hg-198': 0.0997, 'Hg-199': 0.1687, 'Hg-200': 0.231,
|
||||
'Hg-201': 0.1318, 'Hg-202': 0.2986, 'Hg-204': 0.0687,
|
||||
'Tl-203': 0.2952, 'Tl-205': 0.7048, 'Pb-204': 0.014,
|
||||
'Pb-206': 0.241, 'Pb-207': 0.221, 'Pb-208': 0.524,
|
||||
'Bi-209': 1.0, 'Th-232': 1.0, 'Pa-231': 1.0,
|
||||
'U-234': 5.4e-05, 'U-235': 0.007204, 'U-238': 0.992742
|
||||
NATURAL_ABUNDANCE = {
|
||||
'H1': 0.999885, 'H2': 0.000115, 'He3': 1.34e-06,
|
||||
'He4': 0.99999866, 'Li6': 0.0759, 'Li7': 0.9241,
|
||||
'Be9': 1.0, 'B10': 0.199, 'B11': 0.801,
|
||||
'C12': 0.9893, 'C13': 0.0107, 'N14': 0.99636,
|
||||
'N15': 0.00364, 'O16': 0.99757, 'O17': 0.00038,
|
||||
'O18': 0.00205, 'F19': 1.0, 'Ne20': 0.9048,
|
||||
'Ne21': 0.0027, 'Ne22': 0.0925, 'Na23': 1.0,
|
||||
'Mg24': 0.7899, 'Mg25': 0.1, 'Mg26': 0.1101,
|
||||
'Al27': 1.0, 'Si28': 0.92223, 'Si29': 0.04685,
|
||||
'Si30': 0.03092, 'P31': 1.0, 'S32': 0.9499,
|
||||
'S33': 0.0075, 'S34': 0.0425, 'S36': 0.0001,
|
||||
'Cl35': 0.7576, 'Cl37': 0.2424, 'Ar36': 0.003336,
|
||||
'Ar38': 0.000629, 'Ar40': 0.996035, 'K39': 0.932581,
|
||||
'K40': 0.000117, 'K41': 0.067302, 'Ca40': 0.96941,
|
||||
'Ca42': 0.00647, 'Ca43': 0.00135, 'Ca44': 0.02086,
|
||||
'Ca46': 4e-05, 'Ca48': 0.00187, 'Sc45': 1.0,
|
||||
'Ti46': 0.0825, 'Ti47': 0.0744, 'Ti48': 0.7372,
|
||||
'Ti49': 0.0541, 'Ti50': 0.0518, 'V50': 0.0025,
|
||||
'V51': 0.9975, 'Cr50': 0.04345, 'Cr52': 0.83789,
|
||||
'Cr53': 0.09501, 'Cr54': 0.02365, 'Mn55': 1.0,
|
||||
'Fe54': 0.05845, 'Fe56': 0.91754, 'Fe57': 0.02119,
|
||||
'Fe58': 0.00282, 'Co59': 1.0, 'Ni58': 0.68077,
|
||||
'Ni60': 0.26223, 'Ni61': 0.011399, 'Ni62': 0.036346,
|
||||
'Ni64': 0.009255, 'Cu63': 0.6915, 'Cu65': 0.3085,
|
||||
'Zn64': 0.4917, 'Zn66': 0.2773, 'Zn67': 0.0404,
|
||||
'Zn68': 0.1845, 'Zn70': 0.0061, 'Ga69': 0.60108,
|
||||
'Ga71': 0.39892, 'Ge70': 0.2057, 'Ge72': 0.2745,
|
||||
'Ge73': 0.0775, 'Ge74': 0.365, 'Ge76': 0.0773,
|
||||
'As75': 1.0, 'Se74': 0.0089, 'Se76': 0.0937,
|
||||
'Se77': 0.0763, 'Se78': 0.2377, 'Se80': 0.4961,
|
||||
'Se82': 0.0873, 'Br79': 0.5069, 'Br81': 0.4931,
|
||||
'Kr78': 0.00355, 'Kr80': 0.02286, 'Kr82': 0.11593,
|
||||
'Kr83': 0.115, 'Kr84': 0.56987, 'Kr86': 0.17279,
|
||||
'Rb85': 0.7217, 'Rb87': 0.2783, 'Sr84': 0.0056,
|
||||
'Sr86': 0.0986, 'Sr87': 0.07, 'Sr88': 0.8258,
|
||||
'Y89': 1.0, 'Zr90': 0.5145, 'Zr91': 0.1122,
|
||||
'Zr92': 0.1715, 'Zr94': 0.1738, 'Zr96': 0.028,
|
||||
'Nb93': 1.0, 'Mo92': 0.1453, 'Mo94': 0.0915,
|
||||
'Mo95': 0.1584, 'Mo96': 0.1667, 'Mo97': 0.096,
|
||||
'Mo98': 0.2439, 'Mo100': 0.0982, 'Ru96': 0.0554,
|
||||
'Ru98': 0.0187, 'Ru99': 0.1276, 'Ru100': 0.126,
|
||||
'Ru101': 0.1706, 'Ru102': 0.3155, 'Ru104': 0.1862,
|
||||
'Rh103': 1.0, 'Pd102': 0.0102, 'Pd104': 0.1114,
|
||||
'Pd105': 0.2233, 'Pd106': 0.2733, 'Pd108': 0.2646,
|
||||
'Pd110': 0.1172, 'Ag107': 0.51839, 'Ag109': 0.48161,
|
||||
'Cd106': 0.0125, 'Cd108': 0.0089, 'Cd110': 0.1249,
|
||||
'Cd111': 0.128, 'Cd112': 0.2413, 'Cd113': 0.1222,
|
||||
'Cd114': 0.2873, 'Cd116': 0.0749, 'In113': 0.0429,
|
||||
'In115': 0.9571, 'Sn112': 0.0097, 'Sn114': 0.0066,
|
||||
'Sn115': 0.0034, 'Sn116': 0.1454, 'Sn117': 0.0768,
|
||||
'Sn118': 0.2422, 'Sn119': 0.0859, 'Sn120': 0.3258,
|
||||
'Sn122': 0.0463, 'Sn124': 0.0579, 'Sb121': 0.5721,
|
||||
'Sb123': 0.4279, 'Te120': 0.0009, 'Te122': 0.0255,
|
||||
'Te123': 0.0089, 'Te124': 0.0474, 'Te125': 0.0707,
|
||||
'Te126': 0.1884, 'Te128': 0.3174, 'Te130': 0.3408,
|
||||
'I127': 1.0, 'Xe124': 0.000952, 'Xe126': 0.00089,
|
||||
'Xe128': 0.019102, 'Xe129': 0.264006, 'Xe130': 0.04071,
|
||||
'Xe131': 0.212324, 'Xe132': 0.269086, 'Xe134': 0.104357,
|
||||
'Xe136': 0.088573, 'Cs133': 1.0, 'Ba130': 0.00106,
|
||||
'Ba132': 0.00101, 'Ba134': 0.02417, 'Ba135': 0.06592,
|
||||
'Ba136': 0.07854, 'Ba137': 0.11232, 'Ba138': 0.71698,
|
||||
'La138': 0.0008881, 'La139': 0.9991119, 'Ce136': 0.00185,
|
||||
'Ce138': 0.00251, 'Ce140': 0.8845, 'Ce142': 0.11114,
|
||||
'Pr141': 1.0, 'Nd142': 0.27152, 'Nd143': 0.12174,
|
||||
'Nd144': 0.23798, 'Nd145': 0.08293, 'Nd146': 0.17189,
|
||||
'Nd148': 0.05756, 'Nd150': 0.05638, 'Sm144': 0.0307,
|
||||
'Sm147': 0.1499, 'Sm148': 0.1124, 'Sm149': 0.1382,
|
||||
'Sm150': 0.0738, 'Sm152': 0.2675, 'Sm154': 0.2275,
|
||||
'Eu151': 0.4781, 'Eu153': 0.5219, 'Gd152': 0.002,
|
||||
'Gd154': 0.0218, 'Gd155': 0.148, 'Gd156': 0.2047,
|
||||
'Gd157': 0.1565, 'Gd158': 0.2484, 'Gd160': 0.2186,
|
||||
'Tb159': 1.0, 'Dy156': 0.00056, 'Dy158': 0.00095,
|
||||
'Dy160': 0.02329, 'Dy161': 0.18889, 'Dy162': 0.25475,
|
||||
'Dy163': 0.24896, 'Dy164': 0.2826, 'Ho165': 1.0,
|
||||
'Er162': 0.00139, 'Er164': 0.01601, 'Er166': 0.33503,
|
||||
'Er167': 0.22869, 'Er168': 0.26978, 'Er170': 0.1491,
|
||||
'Tm169': 1.0, 'Yb168': 0.00123, 'Yb170': 0.02982,
|
||||
'Yb171': 0.1409, 'Yb172': 0.2168, 'Yb173': 0.16103,
|
||||
'Yb174': 0.32026, 'Yb176': 0.12996, 'Lu175': 0.97401,
|
||||
'Lu176': 0.02599, 'Hf174': 0.0016, 'Hf176': 0.0526,
|
||||
'Hf177': 0.186, 'Hf178': 0.2728, 'Hf179': 0.1362,
|
||||
'Hf180': 0.3508, 'Ta180': 0.0001201, 'Ta181': 0.9998799,
|
||||
'W180': 0.0012, 'W182': 0.265, 'W183': 0.1431,
|
||||
'W184': 0.3064, 'W186': 0.2843, 'Re185': 0.374,
|
||||
'Re187': 0.626, 'Os184': 0.0002, 'Os186': 0.0159,
|
||||
'Os187': 0.0196, 'Os188': 0.1324, 'Os189': 0.1615,
|
||||
'Os190': 0.2626, 'Os192': 0.4078, 'Ir191': 0.373,
|
||||
'Ir193': 0.627, 'Pt190': 0.00012, 'Pt192': 0.00782,
|
||||
'Pt194': 0.3286, 'Pt195': 0.3378, 'Pt196': 0.2521,
|
||||
'Pt198': 0.07356, 'Au197': 1.0, 'Hg196': 0.0015,
|
||||
'Hg198': 0.0997, 'Hg199': 0.1687, 'Hg200': 0.231,
|
||||
'Hg201': 0.1318, 'Hg202': 0.2986, 'Hg204': 0.0687,
|
||||
'Tl203': 0.2952, 'Tl205': 0.7048, 'Pb204': 0.014,
|
||||
'Pb206': 0.241, 'Pb207': 0.221, 'Pb208': 0.524,
|
||||
'Bi209': 1.0, 'Th232': 1.0, 'Pa231': 1.0,
|
||||
'U234': 5.4e-05, 'U235': 0.007204, 'U238': 0.992742
|
||||
}
|
||||
|
||||
ATOMIC_SYMBOL = {1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N',
|
||||
8: 'O', 9: 'F', 10: 'Ne', 11: 'Na', 12: 'Mg', 13: 'Al',
|
||||
14: 'Si', 15: 'P', 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K',
|
||||
20: 'Ca', 21: 'Sc', 22: 'Ti', 23: 'V', 24: 'Cr', 25: 'Mn',
|
||||
26: 'Fe', 27: 'Co', 28: 'Ni', 29: 'Cu', 30: 'Zn', 31: 'Ga',
|
||||
32: 'Ge', 33: 'As', 34: 'Se', 35: 'Br', 36: 'Kr', 37: 'Rb',
|
||||
38: 'Sr', 39: 'Y', 40: 'Zr', 41: 'Nb', 42: 'Mo', 43: 'Tc',
|
||||
44: 'Ru', 45: 'Rh', 46: 'Pd', 47: 'Ag', 48: 'Cd', 49: 'In',
|
||||
50: 'Sn', 51: 'Sb', 52: 'Te', 53: 'I', 54: 'Xe', 55: 'Cs',
|
||||
56: 'Ba', 57: 'La', 58: 'Ce', 59: 'Pr', 60: 'Nd', 61: 'Pm',
|
||||
62: 'Sm', 63: 'Eu', 64: 'Gd', 65: 'Tb', 66: 'Dy', 67: 'Ho',
|
||||
68: 'Er', 69: 'Tm', 70: 'Yb', 71: 'Lu', 72: 'Hf', 73: 'Ta',
|
||||
74: 'W', 75: 'Re', 76: 'Os', 77: 'Ir', 78: 'Pt', 79: 'Au',
|
||||
80: 'Hg', 81: 'Tl', 82: 'Pb', 83: 'Bi', 84: 'Po', 85: 'At',
|
||||
86: 'Rn', 87: 'Fr', 88: 'Ra', 89: 'Ac', 90: 'Th', 91: 'Pa',
|
||||
92: 'U', 93: 'Np', 94: 'Pu', 95: 'Am', 96: 'Cm', 97: 'Bk',
|
||||
98: 'Cf', 99: 'Es', 100: 'Fm', 101: 'Md', 102: 'No',
|
||||
103: 'Lr', 104: 'Rf', 105: 'Db', 106: 'Sg', 107: 'Bh',
|
||||
108: 'Hs', 109: 'Mt', 110: 'Ds', 111: 'Rg', 112: 'Cn',
|
||||
114: 'Fl', 116: 'Lv'}
|
||||
ATOMIC_NUMBER = {value: key for key, value in ATOMIC_SYMBOL.items()}
|
||||
|
||||
REACTION_NAME = {1: '(n,total)', 2: '(n,elastic)', 4: '(n,level)',
|
||||
5: '(n,misc)', 11: '(n,2nd)', 16: '(n,2n)', 17: '(n,3n)',
|
||||
18: '(n,fission)', 19: '(n,f)', 20: '(n,nf)', 21: '(n,2nf)',
|
||||
22: '(n,na)', 23: '(n,n3a)', 24: '(n,2na)', 25: '(n,3na)',
|
||||
27: '(n,absorption)', 28: '(n,np)', 29: '(n,n2a)',
|
||||
30: '(n,2n2a)', 32: '(n,nd)', 33: '(n,nt)', 34: '(n,nHe-3)',
|
||||
35: '(n,nd2a)', 36: '(n,nt2a)', 37: '(n,4n)', 38: '(n,3nf)',
|
||||
41: '(n,2np)', 42: '(n,3np)', 44: '(n,n2p)', 45: '(n,npa)',
|
||||
91: '(n,nc)', 101: '(n,disappear)', 102: '(n,gamma)',
|
||||
103: '(n,p)', 104: '(n,d)', 105: '(n,t)', 106: '(n,3He)',
|
||||
107: '(n,a)', 108: '(n,2a)', 109: '(n,3a)', 111: '(n,2p)',
|
||||
112: '(n,pa)', 113: '(n,t2a)', 114: '(n,d2a)', 115: '(n,pd)',
|
||||
116: '(n,pt)', 117: '(n,da)', 152: '(n,5n)', 153: '(n,6n)',
|
||||
154: '(n,2nt)', 155: '(n,ta)', 156: '(n,4np)', 157: '(n,3nd)',
|
||||
158: '(n,nda)', 159: '(n,2npa)', 160: '(n,7n)', 161: '(n,8n)',
|
||||
162: '(n,5np)', 163: '(n,6np)', 164: '(n,7np)', 165: '(n,4na)',
|
||||
166: '(n,5na)', 167: '(n,6na)', 168: '(n,7na)', 169: '(n,4nd)',
|
||||
170: '(n,5nd)', 171: '(n,6nd)', 172: '(n,3nt)', 173: '(n,4nt)',
|
||||
174: '(n,5nt)', 175: '(n,6nt)', 176: '(n,2n3He)',
|
||||
177: '(n,3n3He)', 178: '(n,4n3He)', 179: '(n,3n2p)',
|
||||
180: '(n,3n3a)', 181: '(n,3npa)', 182: '(n,dt)',
|
||||
183: '(n,npd)', 184: '(n,npt)', 185: '(n,ndt)',
|
||||
186: '(n,np3He)', 187: '(n,nd3He)', 188: '(n,nt3He)',
|
||||
189: '(n,nta)', 190: '(n,2n2p)', 191: '(n,p3He)',
|
||||
192: '(n,d3He)', 193: '(n,3Hea)', 194: '(n,4n2p)',
|
||||
195: '(n,4n2a)', 196: '(n,4npa)', 197: '(n,3p)',
|
||||
198: '(n,n3p)', 199: '(n,3n2pa)', 200: '(n,5n2p)', 444: '(n,damage)',
|
||||
649: '(n,pc)', 699: '(n,dc)', 749: '(n,tc)', 799: '(n,3Hec)',
|
||||
849: '(n,ac)'}
|
||||
REACTION_NAME.update({i: '(n,n{})'.format(i-50) for i in range(50, 91)})
|
||||
REACTION_NAME.update({i: '(n,p{})'.format(i-600) for i in range(600, 649)})
|
||||
REACTION_NAME.update({i: '(n,d{})'.format(i-650) for i in range(650, 699)})
|
||||
REACTION_NAME.update({i: '(n,t{})'.format(i-700) for i in range(700, 749)})
|
||||
REACTION_NAME.update({i: '(n,3He{})'.format(i-750) for i in range(750, 799)})
|
||||
REACTION_NAME.update({i: '(n,a{})'.format(i-800) for i in range(800, 849)})
|
||||
|
||||
SUM_RULES = {1: [2, 3],
|
||||
3: [4, 5, 11, 16, 17, 22, 23, 24, 25, 27, 28, 29, 30, 32, 33, 34, 35,
|
||||
36, 37, 41, 42, 44, 45, 152, 153, 154, 156, 157, 158, 159, 160,
|
||||
161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
|
||||
173, 174, 175, 176, 177, 178, 179, 180, 181, 183, 184, 185,
|
||||
186, 187, 188, 189, 190, 194, 195, 196, 198, 199, 200],
|
||||
4: list(range(50, 92)),
|
||||
16: list(range(875, 892)),
|
||||
18: [19, 20, 21, 38],
|
||||
27: [18, 101],
|
||||
101: [102, 103, 104, 105, 106, 107, 108, 109, 111, 112, 113, 114,
|
||||
115, 116, 117, 155, 182, 191, 192, 193, 197],
|
||||
103: list(range(600, 650)),
|
||||
104: list(range(650, 700)),
|
||||
105: list(range(700, 750)),
|
||||
106: list(range(750, 800)),
|
||||
107: list(range(800, 850))}
|
||||
|
|
|
|||
1083
openmc/data/energy_distribution.py
Normal file
1083
openmc/data/energy_distribution.py
Normal file
File diff suppressed because it is too large
Load diff
339
openmc/data/function.py
Normal file
339
openmc/data/function.py
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
from collections import Iterable, Callable
|
||||
from numbers import Real, Integral
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
|
||||
INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log',
|
||||
4: 'log-linear', 5: 'log-log'}
|
||||
|
||||
|
||||
class Tabulated1D(object):
|
||||
"""A one-dimensional tabulated function.
|
||||
|
||||
This class mirrors the TAB1 type from the ENDF-6 format. A tabulated
|
||||
function is specified by tabulated (x,y) pairs along with interpolation
|
||||
rules that determine the values between tabulated pairs.
|
||||
|
||||
Once an object has been created, it can be used as though it were an actual
|
||||
function, e.g.:
|
||||
|
||||
>>> f = Tabulated1D([0, 10], [4, 5])
|
||||
>>> [f(xi) for xi in numpy.linspace(0, 10, 5)]
|
||||
[4.0, 4.25, 4.5, 4.75, 5.0]
|
||||
|
||||
Parameters
|
||||
----------
|
||||
x : Iterable of float
|
||||
Independent variable
|
||||
y : Iterable of float
|
||||
Dependent variable
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints for interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation scheme identification number, e.g., 3 means y is linear in
|
||||
ln(x).
|
||||
|
||||
Attributes
|
||||
----------
|
||||
x : Iterable of float
|
||||
Independent variable
|
||||
y : Iterable of float
|
||||
Dependent variable
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints for interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation scheme identification number, e.g., 3 means y is linear in
|
||||
ln(x).
|
||||
n_regions : int
|
||||
Number of interpolation regions
|
||||
n_pairs : int
|
||||
Number of tabulated (x,y) pairs
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, x, y, breakpoints=None, interpolation=None):
|
||||
if breakpoints is None or interpolation is None:
|
||||
# Single linear-linear interpolation region by default
|
||||
self.breakpoints = np.array([len(x)])
|
||||
self.interpolation = np.array([2])
|
||||
else:
|
||||
self.breakpoints = np.asarray(breakpoints, dtype=int)
|
||||
self.interpolation = np.asarray(interpolation, dtype=int)
|
||||
|
||||
self.x = np.asarray(x)
|
||||
self.y = np.asarray(y)
|
||||
|
||||
def __call__(self, x):
|
||||
# Check if input is array or scalar
|
||||
if isinstance(x, Iterable):
|
||||
iterable = True
|
||||
x = np.array(x)
|
||||
else:
|
||||
iterable = False
|
||||
x = np.array([x], dtype=float)
|
||||
|
||||
# Create output array
|
||||
y = np.zeros_like(x)
|
||||
|
||||
# Get indices for interpolation
|
||||
idx = np.searchsorted(self.x, x, side='right') - 1
|
||||
|
||||
# Loop over interpolation regions
|
||||
for k in range(len(self.breakpoints)):
|
||||
# Get indices for the begining and ending of this region
|
||||
i_begin = self.breakpoints[k-1] - 1 if k > 0 else 0
|
||||
i_end = self.breakpoints[k] - 1
|
||||
|
||||
# Figure out which idx values lie within this region
|
||||
contained = (idx >= i_begin) & (idx < i_end)
|
||||
|
||||
xk = x[contained] # x values in this region
|
||||
xi = self.x[idx[contained]] # low edge of corresponding bins
|
||||
xi1 = self.x[idx[contained] + 1] # high edge of corresponding bins
|
||||
yi = self.y[idx[contained]]
|
||||
yi1 = self.y[idx[contained] + 1]
|
||||
|
||||
if self.interpolation[k] == 1:
|
||||
# Histogram
|
||||
y[contined] = yi
|
||||
|
||||
elif self.interpolation[k] == 2:
|
||||
# Linear-linear
|
||||
y[contained] = yi + (xk - xi)/(xi1 - xi)*(yi1 - yi)
|
||||
|
||||
elif self.interpolation[k] == 3:
|
||||
# Linear-log
|
||||
y[contained] = yi + np.log(xk/xi)/np.log(xi1/xi)*(yi1 - yi)
|
||||
|
||||
elif self.interpolation[k] == 4:
|
||||
# Log-linear
|
||||
y[contained] = yi*np.exp((xk - xi)/(xi1 - xi)*np.log(yi1/yi))
|
||||
|
||||
elif self.interpolation[k] == 5:
|
||||
# Log-log
|
||||
y[contained] = (yi*np.exp(np.log(xk/xi)/np.log(xi1/xi)
|
||||
*np.log(yi1/yi)))
|
||||
|
||||
# In some cases, x values might be outside the tabulated region due only
|
||||
# to precision, so we check if they're close and set them equal if so.
|
||||
y[np.isclose(x, self.x[0], atol=1e-14)] = self.y[0]
|
||||
y[np.isclose(x, self.x[-1], atol=1e-14)] = self.y[-1]
|
||||
|
||||
return y if iterable else y[0]
|
||||
|
||||
def __len__(self):
|
||||
return len(self.x)
|
||||
|
||||
@property
|
||||
def x(self):
|
||||
return self._x
|
||||
|
||||
@property
|
||||
def y(self):
|
||||
return self._y
|
||||
|
||||
@property
|
||||
def breakpoints(self):
|
||||
return self._breakpoints
|
||||
|
||||
@property
|
||||
def interpolation(self):
|
||||
return self._interpolation
|
||||
|
||||
@property
|
||||
def n_pairs(self):
|
||||
return len(self.x)
|
||||
|
||||
@property
|
||||
def n_regions(self):
|
||||
return len(self.breakpoints)
|
||||
|
||||
@x.setter
|
||||
def x(self, x):
|
||||
cv.check_type('x values', x, Iterable, Real)
|
||||
self._x = x
|
||||
|
||||
@y.setter
|
||||
def y(self, y):
|
||||
cv.check_type('y values', y, Iterable, Real)
|
||||
self._y = y
|
||||
|
||||
@breakpoints.setter
|
||||
def breakpoints(self, breakpoints):
|
||||
cv.check_type('breakpoints', breakpoints, Iterable, Integral)
|
||||
self._breakpoints = breakpoints
|
||||
|
||||
@interpolation.setter
|
||||
def interpolation(self, interpolation):
|
||||
cv.check_type('interpolation', interpolation, Iterable, Integral)
|
||||
self._interpolation = interpolation
|
||||
|
||||
def integral(self):
|
||||
"""Integral of the tabulated function over its tabulated range.
|
||||
|
||||
Returns
|
||||
-------
|
||||
numpy.ndarray
|
||||
Array of same length as the tabulated data that represents partial
|
||||
integrals from the bottom of the range to each tabulated point.
|
||||
|
||||
"""
|
||||
|
||||
# Create output array
|
||||
partial_sum = np.zeros(len(self.x) - 1)
|
||||
|
||||
i_low = 0
|
||||
for k in range(len(self.breakpoints)):
|
||||
# Determine which x values are within this interpolation range
|
||||
i_high = self.breakpoints[k] - 1
|
||||
|
||||
# Get x values and bounding (x,y) pairs
|
||||
x0 = self.x[i_low:i_high]
|
||||
x1 = self.x[i_low + 1:i_high + 1]
|
||||
y0 = self.y[i_low:i_high]
|
||||
y1 = self.y[i_low + 1:i_high + 1]
|
||||
|
||||
if self.interpolation[k] == 1:
|
||||
# Histogram
|
||||
partial_sum[i_low:i_high] = y0*(x1 - x0)
|
||||
|
||||
elif self.interpolation[k] == 2:
|
||||
# Linear-linear
|
||||
m = (y1 - y0)/(x1 - x0)
|
||||
partial_sum[i_low:i_high] = (y0 - m*x0)*(x1 - x0) + \
|
||||
m*(x1**2 - x0**2)/2
|
||||
|
||||
elif self.interpolation[k] == 3:
|
||||
# Linear-log
|
||||
logx = np.log(x1/x0)
|
||||
m = (y1 - y0)/logx
|
||||
partial_sum[i_low:i_high] = y0 + m*(x1*(logx - 1) + x0)
|
||||
|
||||
elif self.interpolation[k] == 4:
|
||||
# Log-linear
|
||||
m = np.log(y1/y0)/(x1 - x0)
|
||||
partial_sum[i_low:i_high] = y0/m*(np.exp(m*(x1 - x0)) - 1)
|
||||
|
||||
elif self.interpolation[k] == 5:
|
||||
# Log-log
|
||||
m = np.log(y1/y0)/np.log(x1/x0)
|
||||
partial_sum[i_low:i_high] = y0/((m + 1)*x0**m)*(
|
||||
x1**(m + 1) - x0**(m + 1))
|
||||
|
||||
i_low = i_high
|
||||
|
||||
return np.concatenate(([0.], np.cumsum(partial_sum)))
|
||||
|
||||
def to_hdf5(self, group, name='xy'):
|
||||
"""Write tabulated function to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
name : str
|
||||
Name of the dataset to create
|
||||
|
||||
"""
|
||||
dataset = group.create_dataset(name, data=np.vstack(
|
||||
[self.x, self.y]))
|
||||
dataset.attrs['type'] = np.string_('tab1')
|
||||
dataset.attrs['breakpoints'] = self.breakpoints
|
||||
dataset.attrs['interpolation'] = self.interpolation
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, dataset):
|
||||
"""Generate tabulated function from an HDF5 dataset
|
||||
|
||||
Parameters
|
||||
----------
|
||||
dataset : h5py.Dataset
|
||||
Dataset to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.Tabulated1D
|
||||
Function read from dataset
|
||||
|
||||
"""
|
||||
x = dataset.value[0, :]
|
||||
y = dataset.value[1, :]
|
||||
breakpoints = dataset.attrs['breakpoints']
|
||||
interpolation = dataset.attrs['interpolation']
|
||||
return cls(x, y, breakpoints, interpolation)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, idx=0):
|
||||
"""Create a Tabulated1D object from an ACE table.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
An ACE table
|
||||
idx : int
|
||||
Offset to read from in XSS array (default of zero)
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.Tabulated1D
|
||||
Tabulated data object
|
||||
|
||||
"""
|
||||
|
||||
# Get number of regions and pairs
|
||||
n_regions = int(ace.xss[idx])
|
||||
n_pairs = int(ace.xss[idx + 1 + 2*n_regions])
|
||||
|
||||
# Get interpolation information
|
||||
idx += 1
|
||||
if n_regions > 0:
|
||||
breakpoints = ace.xss[idx:idx + n_regions].astype(int)
|
||||
interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int)
|
||||
else:
|
||||
# 0 regions implies linear-linear interpolation by default
|
||||
breakpoints = np.array([n_pairs])
|
||||
interpolation = np.array([2])
|
||||
|
||||
# Get (x,y) pairs
|
||||
idx += 2*n_regions + 1
|
||||
x = ace.xss[idx:idx + n_pairs]
|
||||
y = ace.xss[idx + n_pairs:idx + 2*n_pairs]
|
||||
|
||||
return Tabulated1D(x, y, breakpoints, interpolation)
|
||||
|
||||
|
||||
class Sum(object):
|
||||
"""Sum of multiple functions.
|
||||
|
||||
This class allows you to create a callable object which represents the sum
|
||||
of other callable objects. This is used for summed reactions whereby the
|
||||
cross section is defined as the sum of other cross sections.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
functions : Iterable of Callable
|
||||
Functions which are to be added together
|
||||
|
||||
Attributes
|
||||
----------
|
||||
functions : Iterable of Callable
|
||||
Functions which are to be added together
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, functions):
|
||||
self.functions = functions
|
||||
|
||||
def __call__(self, x):
|
||||
return sum(f(x) for f in self.functions)
|
||||
|
||||
@property
|
||||
def functions(self):
|
||||
return self._functions
|
||||
|
||||
@functions.setter
|
||||
def functions(self, functions):
|
||||
cv.check_type('functions', functions, Iterable, Callable)
|
||||
self._functions = functions
|
||||
348
openmc/data/kalbach_mann.py
Normal file
348
openmc/data/kalbach_mann.py
Normal file
|
|
@ -0,0 +1,348 @@
|
|||
from collections import Iterable
|
||||
from numbers import Real, Integral
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.stats import Tabular, Univariate, Discrete, Mixture
|
||||
from .function import Tabulated1D, INTERPOLATION_SCHEME
|
||||
from .angle_energy import AngleEnergy
|
||||
|
||||
|
||||
class KalbachMann(AngleEnergy):
|
||||
"""Kalbach-Mann distribution
|
||||
|
||||
Parameters
|
||||
----------
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints defining interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation codes
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
energy_out : Iterable of openmc.stats.Univariate
|
||||
Distribution of outgoing energies corresponding to each incoming energy
|
||||
precompound : Iterable of openmc.data.Tabulated1D
|
||||
Precompound factor 'r' as a function of outgoing energy for each
|
||||
incoming energy
|
||||
slope : Iterable of openmc.data.Tabulated1D
|
||||
Kalbach-Chadwick angular distribution slope value 'a' as a function of
|
||||
outgoing energy for each incoming energy
|
||||
|
||||
Attributes
|
||||
----------
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints defining interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation codes
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
energy_out : Iterable of openmc.stats.Univariate
|
||||
Distribution of outgoing energies corresponding to each incoming energy
|
||||
precompound : Iterable of openmc.data.Tabulated1D
|
||||
Precompound factor 'r' as a function of outgoing energy for each
|
||||
incoming energy
|
||||
slope : Iterable of openmc.data.Tabulated1D
|
||||
Kalbach-Chadwick angular distribution slope value 'a' as a function of
|
||||
outgoing energy for each incoming energy
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, breakpoints, interpolation, energy, energy_out,
|
||||
precompound, slope):
|
||||
super(KalbachMann, self).__init__()
|
||||
self.breakpoints = breakpoints
|
||||
self.interpolation = interpolation
|
||||
self.energy = energy
|
||||
self.energy_out = energy_out
|
||||
self.precompound = precompound
|
||||
self.slope = slope
|
||||
|
||||
@property
|
||||
def breakpoints(self):
|
||||
return self._breakpoints
|
||||
|
||||
@property
|
||||
def interpolation(self):
|
||||
return self._interpolation
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@property
|
||||
def energy_out(self):
|
||||
return self._energy_out
|
||||
|
||||
@property
|
||||
def precompound(self):
|
||||
return self._precompound
|
||||
|
||||
@property
|
||||
def slope(self):
|
||||
return self._slope
|
||||
|
||||
@breakpoints.setter
|
||||
def breakpoints(self, breakpoints):
|
||||
cv.check_type('Kalbach-Mann breakpoints', breakpoints,
|
||||
Iterable, Integral)
|
||||
self._breakpoints = breakpoints
|
||||
|
||||
@interpolation.setter
|
||||
def interpolation(self, interpolation):
|
||||
cv.check_type('Kalbach-Mann interpolation', interpolation,
|
||||
Iterable, Integral)
|
||||
self._interpolation = interpolation
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('Kalbach-Mann incoming energy', energy,
|
||||
Iterable, Real)
|
||||
self._energy = energy
|
||||
|
||||
@energy_out.setter
|
||||
def energy_out(self, energy_out):
|
||||
cv.check_type('Kalbach-Mann distributions', energy_out,
|
||||
Iterable, Univariate)
|
||||
self._energy_out = energy_out
|
||||
|
||||
@precompound.setter
|
||||
def precompound(self, precompound):
|
||||
cv.check_type('Kalbach-Mann precompound factor', precompound,
|
||||
Iterable, Tabulated1D)
|
||||
self._precompound = precompound
|
||||
|
||||
@slope.setter
|
||||
def slope(self, slope):
|
||||
cv.check_type('Kalbach-Mann slope', slope, Iterable, Tabulated1D)
|
||||
self._slope = slope
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['type'] = np.string_('kalbach-mann')
|
||||
|
||||
dset = group.create_dataset('energy', data=self.energy)
|
||||
dset.attrs['interpolation'] = np.vstack((self.breakpoints,
|
||||
self.interpolation))
|
||||
|
||||
# Determine total number of (E,p,r,a) tuples and create array
|
||||
n_tuple = sum(len(d) for d in self.energy_out)
|
||||
distribution = np.empty((5, n_tuple))
|
||||
|
||||
# Create array for offsets
|
||||
offsets = np.empty(len(self.energy_out), dtype=int)
|
||||
interpolation = np.empty(len(self.energy_out), dtype=int)
|
||||
n_discrete_lines = np.empty(len(self.energy_out), dtype=int)
|
||||
j = 0
|
||||
|
||||
# Populate offsets and distribution array
|
||||
for i, (eout, km_r, km_a) in enumerate(zip(
|
||||
self.energy_out, self.precompound, self.slope)):
|
||||
n = len(eout)
|
||||
offsets[i] = j
|
||||
|
||||
if isinstance(eout, Mixture):
|
||||
discrete, continuous = eout.distribution
|
||||
n_discrete_lines[i] = m = len(discrete)
|
||||
interpolation[i] = 1 if continuous.interpolation == 'histogram' else 2
|
||||
distribution[0, j:j+m] = discrete.x
|
||||
distribution[1, j:j+m] = discrete.p
|
||||
distribution[2, j:j+m] = discrete.c
|
||||
distribution[0, j+m:j+n] = continuous.x
|
||||
distribution[1, j+m:j+n] = continuous.p
|
||||
distribution[2, j+m:j+n] = continuous.c
|
||||
else:
|
||||
if isinstance(eout, Tabular):
|
||||
n_discrete_lines[i] = 0
|
||||
interpolation[i] = 1 if eout.interpolation == 'histogram' else 2
|
||||
elif isinstance(eout, Discrete):
|
||||
n_discrete_lines[i] = n
|
||||
interpolation[i] = 1
|
||||
distribution[0, j:j+n] = eout.x
|
||||
distribution[1, j:j+n] = eout.p
|
||||
distribution[2, j:j+n] = eout.c
|
||||
|
||||
distribution[3, j:j+n] = km_r.y
|
||||
distribution[4, j:j+n] = km_a.y
|
||||
j += n
|
||||
|
||||
# Create dataset for distributions
|
||||
dset = group.create_dataset('distribution', data=distribution)
|
||||
|
||||
# Write interpolation as attribute
|
||||
dset.attrs['offsets'] = offsets
|
||||
dset.attrs['interpolation'] = interpolation
|
||||
dset.attrs['n_discrete_lines'] = n_discrete_lines
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate Kalbach-Mann distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.KalbachMann
|
||||
Kalbach-Mann energy distribution
|
||||
|
||||
"""
|
||||
interp_data = group['energy'].attrs['interpolation']
|
||||
energy_breakpoints = interp_data[0, :]
|
||||
energy_interpolation = interp_data[1, :]
|
||||
energy = group['energy'].value
|
||||
|
||||
data = group['distribution']
|
||||
offsets = data.attrs['offsets']
|
||||
interpolation = data.attrs['interpolation']
|
||||
n_discrete_lines = data.attrs['n_discrete_lines']
|
||||
|
||||
energy_out = []
|
||||
precompound = []
|
||||
slope = []
|
||||
n_energy = len(energy)
|
||||
for i in range(n_energy):
|
||||
# Determine length of outgoing energy distribution and number of
|
||||
# discrete lines
|
||||
j = offsets[i]
|
||||
if i < n_energy - 1:
|
||||
n = offsets[i+1] - j
|
||||
else:
|
||||
n = data.shape[1] - j
|
||||
m = n_discrete_lines[i]
|
||||
|
||||
# Create discrete distribution if lines are present
|
||||
if m > 0:
|
||||
eout_discrete = Discrete(data[0, j:j+m], data[1, j:j+m])
|
||||
eout_discrete.c = data[2, j:j+m]
|
||||
p_discrete = eout_discrete.c[-1]
|
||||
|
||||
# Create continuous distribution
|
||||
if m < n:
|
||||
interp = INTERPOLATION_SCHEME[interpolation[i]]
|
||||
eout_continuous = Tabular(data[0, j+m:j+n], data[1, j+m:j+n], interp)
|
||||
eout_continuous.c = data[2, j+m:j+n]
|
||||
|
||||
# If both continuous and discrete are present, create a mixture
|
||||
# distribution
|
||||
if m == 0:
|
||||
eout_i = eout_continuous
|
||||
elif m == n:
|
||||
eout_i = eout_discrete
|
||||
else:
|
||||
eout_i = Mixture([p_discrete, 1. - p_discrete],
|
||||
[eout_discrete, eout_continuous])
|
||||
|
||||
km_r = Tabulated1D(data[0, j:j+n], data[3, j:j+n])
|
||||
km_a = Tabulated1D(data[0, j:j+n], data[4, j:j+n])
|
||||
|
||||
energy_out.append(eout_i)
|
||||
precompound.append(km_r)
|
||||
slope.append(km_a)
|
||||
|
||||
return cls(energy_breakpoints, energy_interpolation,
|
||||
energy, energy_out, precompound, slope)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, idx, ldis):
|
||||
"""Generate Kalbach-Mann energy-angle distribution from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
idx : int
|
||||
Index in XSS array of the start of the energy distribution data
|
||||
(LDIS + LOCC - 1)
|
||||
ldis : int
|
||||
Index in XSS array of the start of the energy distribution block
|
||||
(e.g. JXS[11])
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.KalbachMann
|
||||
Kalbach-Mann energy-angle distribution
|
||||
|
||||
"""
|
||||
# Read number of interpolation regions and incoming energies
|
||||
n_regions = int(ace.xss[idx])
|
||||
n_energy_in = int(ace.xss[idx + 1 + 2*n_regions])
|
||||
|
||||
# Get interpolation information
|
||||
idx += 1
|
||||
if n_regions > 0:
|
||||
breakpoints = ace.xss[idx:idx + n_regions].astype(int)
|
||||
interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int)
|
||||
else:
|
||||
breakpoints = np.array([n_energy_in])
|
||||
interpolation = np.array([2])
|
||||
|
||||
# Incoming energies at which distributions exist
|
||||
idx += 2*n_regions + 1
|
||||
energy = ace.xss[idx:idx + n_energy_in]
|
||||
|
||||
# Location of distributions
|
||||
idx += n_energy_in
|
||||
loc_dist = ace.xss[idx:idx + n_energy_in].astype(int)
|
||||
|
||||
# Initialize variables
|
||||
energy_out = []
|
||||
km_r = []
|
||||
km_a = []
|
||||
|
||||
# Read each outgoing energy distribution
|
||||
for i in range(n_energy_in):
|
||||
idx = ldis + loc_dist[i] - 1
|
||||
|
||||
# intt = interpolation scheme (1=hist, 2=lin-lin)
|
||||
INTTp = int(ace.xss[idx])
|
||||
intt = INTTp % 10
|
||||
n_discrete_lines = (INTTp - intt)//10
|
||||
if intt not in (1, 2):
|
||||
warn("Interpolation scheme for continuous tabular distribution "
|
||||
"is not histogram or linear-linear.")
|
||||
intt = 2
|
||||
|
||||
n_energy_out = int(ace.xss[idx + 1])
|
||||
data = ace.xss[idx + 2:idx + 2 + 5*n_energy_out]
|
||||
data.shape = (5, n_energy_out)
|
||||
|
||||
# Create continuous distribution
|
||||
eout_continuous = Tabular(data[0][n_discrete_lines:],
|
||||
data[1][n_discrete_lines:],
|
||||
INTERPOLATION_SCHEME[intt],
|
||||
ignore_negative=True)
|
||||
eout_continuous.c = data[2][n_discrete_lines:]
|
||||
if np.any(data[1][n_discrete_lines:] < 0.0):
|
||||
warn("Kalbach-Mann energy distribution has negative "
|
||||
"probabilities.")
|
||||
|
||||
# If discrete lines are present, create a mixture distribution
|
||||
if n_discrete_lines > 0:
|
||||
eout_discrete = Discrete(data[0][:n_discrete_lines],
|
||||
data[1][:n_discrete_lines])
|
||||
eout_discrete.c = data[2][:n_discrete_lines]
|
||||
if n_discrete_lines == n_energy_out:
|
||||
eout_i = eout_discrete
|
||||
else:
|
||||
p_discrete = min(sum(eout_discrete.p), 1.0)
|
||||
eout_i = Mixture([p_discrete, 1. - p_discrete],
|
||||
[eout_discrete, eout_continuous])
|
||||
else:
|
||||
eout_i = eout_continuous
|
||||
|
||||
energy_out.append(eout_i)
|
||||
km_r.append(Tabulated1D(data[0], data[3]))
|
||||
km_a.append(Tabulated1D(data[0], data[4]))
|
||||
|
||||
return cls(breakpoints, interpolation, energy, energy_out, km_r, km_a)
|
||||
48
openmc/data/library.py
Normal file
48
openmc/data/library.py
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
import os
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import h5py
|
||||
|
||||
from openmc.clean_xml import clean_xml_indentation
|
||||
|
||||
class DataLibrary(object):
|
||||
def __init__(self):
|
||||
self.libraries = []
|
||||
|
||||
def register_file(self, filename, filetype='neutron'):
|
||||
h5file = h5py.File(filename, 'r')
|
||||
|
||||
materials = []
|
||||
for name in h5file:
|
||||
materials.append(name)
|
||||
|
||||
library = {'path': filename, 'type': filetype, 'materials': materials}
|
||||
self.libraries.append(library)
|
||||
|
||||
def export_to_xml(self, path='cross_sections.xml'):
|
||||
root = ET.Element('cross_sections')
|
||||
|
||||
# Determine common directory for library paths
|
||||
common_dir = os.path.dirname(os.path.commonprefix(
|
||||
[lib['path'] for lib in self.libraries]))
|
||||
if common_dir == '':
|
||||
common_dir = '.'
|
||||
|
||||
directory = os.path.relpath(common_dir, os.path.dirname(path))
|
||||
if directory != '.':
|
||||
dir_element = ET.SubElement(root, "directory")
|
||||
dir_element.text = directory
|
||||
|
||||
for library in self.libraries:
|
||||
lib_element = ET.SubElement(root, "library")
|
||||
lib_element.set('materials', ' '.join(library['materials']))
|
||||
lib_element.set('path', os.path.relpath(library['path'], common_dir))
|
||||
lib_element.set('type', library['type'])
|
||||
|
||||
# Clean the indentation to be user-readable
|
||||
clean_xml_indentation(root)
|
||||
|
||||
# Write XML file
|
||||
tree = ET.ElementTree(root)
|
||||
tree.write(path, xml_declaration=True, encoding='utf-8',
|
||||
method='xml')
|
||||
142
openmc/data/nbody.py
Normal file
142
openmc/data/nbody.py
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
from numbers import Real, Integral
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from .angle_energy import AngleEnergy
|
||||
|
||||
class NBodyPhaseSpace(AngleEnergy):
|
||||
"""N-body phase space distribution
|
||||
|
||||
Parameters
|
||||
----------
|
||||
total_mass : float
|
||||
Total mass of product particles
|
||||
n_particles : int
|
||||
Number of product particles
|
||||
atomic_weight_ratio : float
|
||||
Atomic weight ratio of target nuclide
|
||||
q_value : float
|
||||
Q value for reaction in MeV
|
||||
|
||||
Attributes
|
||||
----------
|
||||
total_mass : float
|
||||
Total mass of product particles
|
||||
n_particles : int
|
||||
Number of product particles
|
||||
atomic_weight_ratio : float
|
||||
Atomic weight ratio of target nuclide
|
||||
q_value : float
|
||||
Q value for reaction in MeV
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, total_mass, n_particles, atomic_weight_ratio, q_value):
|
||||
self.total_mass = total_mass
|
||||
self.n_particles = n_particles
|
||||
self.atomic_weight_ratio = atomic_weight_ratio
|
||||
self.q_value = q_value
|
||||
|
||||
@property
|
||||
def total_mass(self):
|
||||
return self._total_mass
|
||||
|
||||
@property
|
||||
def n_particles(self):
|
||||
return self._n_particles
|
||||
|
||||
@property
|
||||
def atomic_weight_ratio(self):
|
||||
return self._atomic_weight_ratio
|
||||
|
||||
@property
|
||||
def q_value(self):
|
||||
return self._q_value
|
||||
|
||||
@total_mass.setter
|
||||
def total_mass(self, total_mass):
|
||||
name = 'N-body phase space total mass'
|
||||
cv.check_type(name, total_mass, Real)
|
||||
cv.check_greater_than(name, total_mass, 0.)
|
||||
self._total_mass = total_mass
|
||||
|
||||
@n_particles.setter
|
||||
def n_particles(self, n_particles):
|
||||
name = 'N-body phase space number of particles'
|
||||
cv.check_type(name, n_particles, Integral)
|
||||
cv.check_greater_than(name, n_particles, 0)
|
||||
self._n_particles = n_particles
|
||||
|
||||
@atomic_weight_ratio.setter
|
||||
def atomic_weight_ratio(self, atomic_weight_ratio):
|
||||
name = 'N-body phase space atomic weight ratio'
|
||||
cv.check_type(name, atomic_weight_ratio, Real)
|
||||
cv.check_greater_than(name, atomic_weight_ratio, 0.0)
|
||||
self._atomic_weight_ratio = atomic_weight_ratio
|
||||
|
||||
@q_value.setter
|
||||
def q_value(self, q_value):
|
||||
name = 'N-body phase space Q value'
|
||||
cv.check_type(name, q_value, Real)
|
||||
self._q_value = q_value
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['type'] = np.string_('nbody')
|
||||
group.attrs['total_mass'] = self.total_mass
|
||||
group.attrs['n_particles'] = self.n_particles
|
||||
group.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio
|
||||
group.attrs['q_value'] = self.q_value
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate N-body phase space distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.NBodyPhaseSpace
|
||||
N-body phase space distribution
|
||||
|
||||
"""
|
||||
total_mass = group.attrs['total_mass']
|
||||
n_particles = group.attrs['n_particles']
|
||||
awr = group.attrs['atomic_weight_ratio']
|
||||
q_value = group.attrs['q_value']
|
||||
return cls(total_mass, n_particles, awr, q_value)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, idx, q_value):
|
||||
"""Generate N-body phase space distribution from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
idx : int
|
||||
Index in XSS array of the start of the energy distribution data
|
||||
(LDIS + LOCC - 1)
|
||||
q_value : float
|
||||
Q-value for reaction in MeV
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.NBodyPhaseSpace
|
||||
N-body phase space distribution
|
||||
|
||||
"""
|
||||
n_particles = int(ace.xss[idx])
|
||||
total_mass = ace.xss[idx + 1]
|
||||
return cls(total_mass, n_particles, ace.atomic_weight_ratio, q_value)
|
||||
460
openmc/data/neutron.py
Normal file
460
openmc/data/neutron.py
Normal file
|
|
@ -0,0 +1,460 @@
|
|||
from __future__ import division, unicode_literals
|
||||
import sys
|
||||
from collections import OrderedDict, Iterable, Mapping
|
||||
from numbers import Integral, Real
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
import h5py
|
||||
|
||||
from .data import ATOMIC_SYMBOL, SUM_RULES
|
||||
from .ace import Table, get_table
|
||||
from .function import Tabulated1D, Sum
|
||||
from .product import Product
|
||||
from .reaction import Reaction, _get_photon_products
|
||||
from .urr import ProbabilityTables
|
||||
import openmc.checkvalue as cv
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
|
||||
class IncidentNeutron(object):
|
||||
"""Continuous-energy neutron interaction data.
|
||||
|
||||
Instances of this class are not normally instantiated by the user but rather
|
||||
created using the factory methods :meth:`IncidentNeutron.from_hdf5` and
|
||||
:meth:`IncidentNeutron.from_ace`.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
Name of the table
|
||||
atomic_number : int
|
||||
Number of protons in the nucleus
|
||||
mass_number : int
|
||||
Number of nucleons in the nucleus
|
||||
metastable : int
|
||||
Metastable state of the nucleus. A value of zero indicates ground state.
|
||||
atomic_weight_ratio : float
|
||||
Atomic mass ratio of the target nuclide.
|
||||
temperature : float
|
||||
Temperature of the target nuclide in MeV.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
atomic_number : int
|
||||
Number of protons in the nucleus
|
||||
atomic_symbol : str
|
||||
Atomic symbol of the nuclide, e.g., 'Zr'
|
||||
atomic_weight_ratio : float
|
||||
Atomic weight ratio of the target nuclide.
|
||||
energy : numpy.ndarray
|
||||
The energy values (MeV) at which reaction cross-sections are tabulated.
|
||||
mass_number : int
|
||||
Number of nucleons in the nucleus
|
||||
metastable : int
|
||||
Metastable state of the nucleus. A value of zero indicates ground state.
|
||||
name : str
|
||||
ZAID identifier of the table, e.g. 92235.70c.
|
||||
reactions : collections.OrderedDict
|
||||
Contains the cross sections, secondary angle and energy distributions,
|
||||
and other associated data for each reaction. The keys are the MT values
|
||||
and the values are Reaction objects.
|
||||
summed_reactions : collections.OrderedDict
|
||||
Contains summed cross sections, e.g., the total cross section. The keys
|
||||
are the MT values and the values are Reaction objects.
|
||||
temperature : float
|
||||
Temperature of the target nuclide in MeV.
|
||||
urr : None or openmc.data.ProbabilityTables
|
||||
Unresolved resonance region probability tables
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, name, atomic_number, mass_number, metastable,
|
||||
atomic_weight_ratio, temperature):
|
||||
self.name = name
|
||||
self.atomic_number = atomic_number
|
||||
self.mass_number = mass_number
|
||||
self.metastable = metastable
|
||||
self.atomic_weight_ratio = atomic_weight_ratio
|
||||
self.temperature = temperature
|
||||
|
||||
self._energy = None
|
||||
self.reactions = OrderedDict()
|
||||
self.summed_reactions = OrderedDict()
|
||||
self.urr = None
|
||||
|
||||
def __contains__(self, mt):
|
||||
return mt in self.reactions or mt in self.summed_reactions
|
||||
|
||||
def __getitem__(self, mt):
|
||||
if mt in self.reactions:
|
||||
return self.reactions[mt]
|
||||
elif mt in self.summed_reactions:
|
||||
return self.summed_reactions[mt]
|
||||
else:
|
||||
raise KeyError('No reaction with MT={}.'.format(mt))
|
||||
|
||||
def __repr__(self):
|
||||
return "<IncidentNeutron: {}>".format(self.name)
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.reactions.values())
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def atomic_number(self):
|
||||
return self._atomic_number
|
||||
|
||||
@property
|
||||
def mass_number(self):
|
||||
return self._mass_number
|
||||
|
||||
@property
|
||||
def metastable(self):
|
||||
return self._metastable
|
||||
|
||||
@property
|
||||
def atomic_weight_ratio(self):
|
||||
return self._atomic_weight_ratio
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@property
|
||||
def temperature(self):
|
||||
return self._temperature
|
||||
|
||||
@property
|
||||
def reactions(self):
|
||||
return self._reactions
|
||||
|
||||
@property
|
||||
def summed_reactions(self):
|
||||
return self._summed_reactions
|
||||
|
||||
@property
|
||||
def urr(self):
|
||||
return self._urr
|
||||
|
||||
@name.setter
|
||||
def name(self, name):
|
||||
cv.check_type('name', name, basestring)
|
||||
self._name = name
|
||||
|
||||
@property
|
||||
def atomic_symbol(self):
|
||||
return atomic_symbol[self.atomic_number]
|
||||
|
||||
@atomic_number.setter
|
||||
def atomic_number(self, atomic_number):
|
||||
cv.check_type('atomic number', atomic_number, Integral)
|
||||
cv.check_greater_than('atomic number', atomic_number, 0)
|
||||
self._atomic_number = atomic_number
|
||||
|
||||
@mass_number.setter
|
||||
def mass_number(self, mass_number):
|
||||
cv.check_type('mass number', mass_number, Integral)
|
||||
cv.check_greater_than('mass number', mass_number, 0, True)
|
||||
self._mass_number = mass_number
|
||||
|
||||
@metastable.setter
|
||||
def metastable(self, metastable):
|
||||
cv.check_type('metastable', metastable, Integral)
|
||||
cv.check_greater_than('metastable', metastable, 0, True)
|
||||
self._metastable = metastable
|
||||
|
||||
@atomic_weight_ratio.setter
|
||||
def atomic_weight_ratio(self, atomic_weight_ratio):
|
||||
cv.check_type('atomic weight ratio', atomic_weight_ratio, Real)
|
||||
cv.check_greater_than('atomic weight ratio', atomic_weight_ratio, 0.0)
|
||||
self._atomic_weight_ratio = atomic_weight_ratio
|
||||
|
||||
@temperature.setter
|
||||
def temperature(self, temperature):
|
||||
cv.check_type('temperature', temperature, Real)
|
||||
cv.check_greater_than('temperature', temperature, 0.0)
|
||||
self._temperature = temperature
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('energy grid', energy, Iterable, Real)
|
||||
self._energy = energy
|
||||
|
||||
@reactions.setter
|
||||
def reactions(self, reactions):
|
||||
cv.check_type('reactions', reactions, Mapping)
|
||||
self._reactions = reactions
|
||||
|
||||
@summed_reactions.setter
|
||||
def summed_reactions(self, summed_reactions):
|
||||
cv.check_type('summed reactions', summed_reactions, Mapping)
|
||||
self._summed_reactions = summed_reactions
|
||||
|
||||
@urr.setter
|
||||
def urr(self, urr):
|
||||
cv.check_type('probability tables', urr,
|
||||
(ProbabilityTables, type(None)))
|
||||
self._urr = urr
|
||||
|
||||
def get_reaction_components(self, mt):
|
||||
"""Determine what reactions make up summed reaction.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
mt : int
|
||||
ENDF MT number of the reaction to find components of.
|
||||
|
||||
Returns
|
||||
-------
|
||||
mts : list of int
|
||||
ENDF MT numbers of reactions that make up the summed reaction and
|
||||
have cross sections provided.
|
||||
|
||||
"""
|
||||
if mt in self.reactions:
|
||||
return [mt]
|
||||
elif mt in SUM_RULES:
|
||||
mts = SUM_RULES[mt]
|
||||
complete = False
|
||||
while not complete:
|
||||
new_mts = []
|
||||
complete = True
|
||||
for i, mt_i in enumerate(mts):
|
||||
if mt_i in self.reactions:
|
||||
new_mts.append(mt_i)
|
||||
elif mt_i in SUM_RULES:
|
||||
new_mts += SUM_RULES[mt_i]
|
||||
complete = False
|
||||
mts = new_mts
|
||||
return mts
|
||||
|
||||
def export_to_hdf5(self, path, mode='a'):
|
||||
"""Export table to an HDF5 file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
path : str
|
||||
Path to write HDF5 file to
|
||||
mode : {'r', r+', 'w', 'x', 'a'}
|
||||
Mode that is used to open the HDF5 file. This is the second argument
|
||||
to the :class:`h5py.File` constructor.
|
||||
|
||||
"""
|
||||
|
||||
f = h5py.File(path, mode, libver='latest')
|
||||
|
||||
# Write basic data
|
||||
g = f.create_group(self.name)
|
||||
g.attrs['Z'] = self.atomic_number
|
||||
g.attrs['A'] = self.mass_number
|
||||
g.attrs['metastable'] = self.metastable
|
||||
g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio
|
||||
g.attrs['temperature'] = self.temperature
|
||||
|
||||
# Write energy grid
|
||||
g.create_dataset('energy', data=self.energy)
|
||||
|
||||
# Write reaction data
|
||||
rxs_group = g.create_group('reactions')
|
||||
for rx in self.reactions.values():
|
||||
rx_group = rxs_group.create_group('reaction_{:03}'.format(rx.mt))
|
||||
rx.to_hdf5(rx_group)
|
||||
|
||||
# Write total nu data if available
|
||||
if len(rx.derived_products) > 0 and 'total_nu' not in g:
|
||||
tgroup = g.create_group('total_nu')
|
||||
rx.derived_products[0].to_hdf5(tgroup)
|
||||
|
||||
# Write unresolved resonance probability tables
|
||||
if self.urr is not None:
|
||||
urr_group = g.create_group('urr')
|
||||
self.urr.to_hdf5(urr_group)
|
||||
|
||||
f.close()
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group_or_filename):
|
||||
"""Generate continuous-energy neutron interaction data from HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group_or_filename : h5py.Group or str
|
||||
HDF5 group containing interaction data. If given as a string, it is
|
||||
assumed to be the filename for the HDF5 file, and the first group is
|
||||
used to read from.
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.IncidentNeutron
|
||||
Continuous-energy neutron interaction data
|
||||
|
||||
"""
|
||||
if isinstance(group_or_filename, h5py.Group):
|
||||
group = group_or_filename
|
||||
else:
|
||||
h5file = h5py.File(group_or_filename, 'r')
|
||||
group = list(h5file.values())[0]
|
||||
|
||||
name = group.name[1:]
|
||||
atomic_number = group.attrs['Z']
|
||||
mass_number = group.attrs['A']
|
||||
metastable = group.attrs['metastable']
|
||||
atomic_weight_ratio = group.attrs['atomic_weight_ratio']
|
||||
temperature = group.attrs['temperature']
|
||||
|
||||
data = cls(name, atomic_number, mass_number, metastable,
|
||||
atomic_weight_ratio, temperature)
|
||||
|
||||
# Read energy grid
|
||||
data.energy = group['energy'].value
|
||||
|
||||
# Read reaction data
|
||||
rxs_group = group['reactions']
|
||||
for name, obj in sorted(rxs_group.items()):
|
||||
if name.startswith('reaction_'):
|
||||
rx = Reaction.from_hdf5(obj, data.energy)
|
||||
data.reactions[rx.mt] = rx
|
||||
|
||||
# Read total nu data if available
|
||||
if rx.mt in (18, 19, 20, 21, 38) and 'total_nu' in group:
|
||||
tgroup = group['total_nu']
|
||||
rx.derived_products.append(Product.from_hdf5(tgroup))
|
||||
|
||||
# Build summed reactions. Start from the highest MT number because high
|
||||
# MTs never depend on lower MTs.
|
||||
for mt_sum in sorted(SUM_RULES, reverse=True):
|
||||
if mt_sum not in data:
|
||||
xs_components = [data[mt].xs for mt in SUM_RULES[mt_sum]
|
||||
if mt in data]
|
||||
if len(xs_components) > 0:
|
||||
rxn = Reaction(mt_sum)
|
||||
rxn.xs = Sum(xs_components)
|
||||
data.summed_reactions[mt_sum] = rxn
|
||||
|
||||
# Read unresolved resonance probability tables
|
||||
if 'urr' in group:
|
||||
urr_group = group['urr']
|
||||
data.urr = ProbabilityTables.from_hdf5(urr_group)
|
||||
|
||||
return data
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace_or_filename, metastable_scheme='nndc'):
|
||||
"""Generate incident neutron continuous-energy data from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table or str
|
||||
ACE table to read from. If given as a string, it is assumed to be
|
||||
the filename for the ACE file.
|
||||
metastable_scheme : {'nndc', 'mcnp'}
|
||||
Determine how ZAID identifiers are to be interpreted in the case of
|
||||
a metastable nuclide. Because the normal ZAID (=1000*Z + A) does not
|
||||
encode metastable information, different conventions are used among
|
||||
different libraries. In MCNP libraries, the convention is to add 400
|
||||
for a metastable nuclide except for Am242m, for which 95242 is
|
||||
metastable and 95642 (or 1095242 in newer libraries) is the ground
|
||||
state. For NNDC libraries, ZAID is given as 1000*Z + A + 100*m.
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.IncidentNeutron
|
||||
Incident neutron continuous-energy data
|
||||
|
||||
"""
|
||||
if isinstance(ace_or_filename, Table):
|
||||
ace = ace_or_filename
|
||||
else:
|
||||
ace = get_table(ace_or_filename)
|
||||
|
||||
# If mass number hasn't been specified, make an educated guess
|
||||
zaid, xs = ace.name.split('.')
|
||||
zaid = int(zaid)
|
||||
Z = zaid // 1000
|
||||
mass_number = zaid % 1000
|
||||
|
||||
if metastable_scheme == 'mcnp':
|
||||
if zaid > 1000000:
|
||||
# New SZA format
|
||||
Z = Z % 1000
|
||||
if zaid == 1095242:
|
||||
metastable = 0
|
||||
else:
|
||||
metastable = zaid // 1000000
|
||||
else:
|
||||
if zaid == 95242:
|
||||
metastable = 1
|
||||
elif zaid == 95642:
|
||||
metastable = 0
|
||||
else:
|
||||
metastable = 1 if mass_number > 300 else 0
|
||||
elif metastable_scheme == 'nndc':
|
||||
metastable = 1 if mass_number > 300 else 0
|
||||
|
||||
while mass_number > 3*Z:
|
||||
mass_number -= 100
|
||||
|
||||
# Determine name for group
|
||||
element = ATOMIC_SYMBOL[Z]
|
||||
if metastable > 0:
|
||||
name = '{}{}_m{}.{}'.format(element, mass_number, metastable, xs)
|
||||
else:
|
||||
name = '{}{}.{}'.format(element, mass_number, xs)
|
||||
|
||||
data = cls(name, Z, mass_number, metastable,
|
||||
ace.atomic_weight_ratio, ace.temperature)
|
||||
|
||||
# Read energy grid
|
||||
n_energy = ace.nxs[3]
|
||||
energy = ace.xss[ace.jxs[1]:ace.jxs[1] + n_energy]
|
||||
data.energy = energy
|
||||
total_xs = ace.xss[ace.jxs[1] + n_energy:ace.jxs[1] + 2*n_energy]
|
||||
absorption_xs = ace.xss[ace.jxs[1] + 2*n_energy:ace.jxs[1] + 3*n_energy]
|
||||
|
||||
# Create summed reactions (total and absorption)
|
||||
total = Reaction(1)
|
||||
total.xs = Tabulated1D(energy, total_xs)
|
||||
data.summed_reactions[1] = total
|
||||
absorption = Reaction(27)
|
||||
absorption.xs = Tabulated1D(energy, absorption_xs)
|
||||
data.summed_reactions[27] = absorption
|
||||
|
||||
# Read each reaction
|
||||
n_reaction = ace.nxs[4] + 1
|
||||
for i in range(n_reaction):
|
||||
rx = Reaction.from_ace(ace, i)
|
||||
data.reactions[rx.mt] = rx
|
||||
|
||||
# Some photon production reactions may be assigned to MTs that don't
|
||||
# exist, usually MT=4. In this case, we create a new reaction and add
|
||||
# them
|
||||
n_photon_reactions = ace.nxs[6]
|
||||
photon_mts = ace.xss[ace.jxs[13]:ace.jxs[13] +
|
||||
n_photon_reactions].astype(int)
|
||||
|
||||
for mt in np.unique(photon_mts // 1000):
|
||||
if mt not in data:
|
||||
if mt not in SUM_RULES:
|
||||
warn('Photon production is present for MT={} but no '
|
||||
'cross section is given.'.format(mt))
|
||||
continue
|
||||
|
||||
# Create summed reaction with appropriate cross section
|
||||
rx = Reaction(mt)
|
||||
mts = data.get_reaction_components(mt)
|
||||
rx.xs = Sum([data.reactions[mt_i].xs for mt_i in mts])
|
||||
|
||||
# Determine summed cross section
|
||||
rx.products += _get_photon_products(ace, rx)
|
||||
data.summed_reactions[mt] = rx
|
||||
|
||||
# Read unresolved resonance probability tables
|
||||
data.urr = ProbabilityTables.from_ace(ace)
|
||||
|
||||
return data
|
||||
205
openmc/data/product.py
Normal file
205
openmc/data/product.py
Normal file
|
|
@ -0,0 +1,205 @@
|
|||
from collections import Iterable
|
||||
from numbers import Real
|
||||
import sys
|
||||
|
||||
import numpy as np
|
||||
from numpy.polynomial.polynomial import Polynomial
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from .function import Tabulated1D
|
||||
from .angle_energy import AngleEnergy
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
|
||||
class Product(object):
|
||||
"""Secondary particle emitted in a nuclear reaction
|
||||
|
||||
Parameters
|
||||
----------
|
||||
particle : str, optional
|
||||
What particle the reaction product is. Defaults to 'neutron'.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
applicability : Iterable of openmc.data.Tabulated1D
|
||||
Probability of sampling a given distribution for this product.
|
||||
decay_rate : float
|
||||
Decay rate in inverse seconds
|
||||
distribution : Iterable of openmc.data.AngleEnergy
|
||||
Distributions of energy and angle of product.
|
||||
emission_mode : {'prompt', 'delayed', 'total'}
|
||||
Indicate whether the particle is emitted immediately or whether it
|
||||
results from the decay of reaction product (e.g., neutron emitted from a
|
||||
delayed neutron precursor). A special value of 'total' is used when the
|
||||
yield represents particles from prompt and delayed sources.
|
||||
particle : str
|
||||
What particle the reaction product is.
|
||||
yield_ : float or openmc.data.Tabulated1D or numpy.polynomial.Polynomial
|
||||
Yield of secondary particle in the reaction.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, particle='neutron'):
|
||||
self.particle = particle
|
||||
self.decay_rate = 0.0
|
||||
self.emission_mode = 'prompt'
|
||||
self.distribution = []
|
||||
self.applicability = []
|
||||
self.yield_ = 1
|
||||
|
||||
def __repr__(self):
|
||||
if isinstance(self.yield_, Real):
|
||||
return "<Product: {}, emission={}, yield={}>".format(
|
||||
self.particle, self.emission_mode, self.yield_)
|
||||
elif isinstance(self.yield_, Tabulated1D):
|
||||
if np.all(self.yield_.y == self.yield_.y[0]):
|
||||
return "<Product: {}, emission={}, yield={}>".format(
|
||||
self.particle, self.emission_mode, self.yield_.y[0])
|
||||
else:
|
||||
return "<Product: {}, emission={}, yield=tabulated>".format(
|
||||
self.particle, self.emission_mode)
|
||||
else:
|
||||
return "<Product: {}, emission={}, yield=polynomial>".format(
|
||||
self.particle, self.emission_mode)
|
||||
|
||||
@property
|
||||
def applicability(self):
|
||||
return self._applicability
|
||||
|
||||
@property
|
||||
def decay_rate(self):
|
||||
return self._decay_rate
|
||||
|
||||
@property
|
||||
def distribution(self):
|
||||
return self._distribution
|
||||
|
||||
@property
|
||||
def emission_mode(self):
|
||||
return self._emission_mode
|
||||
|
||||
@property
|
||||
def particle(self):
|
||||
return self._particle
|
||||
|
||||
@property
|
||||
def yield_(self):
|
||||
return self._yield
|
||||
|
||||
@applicability.setter
|
||||
def applicability(self, applicability):
|
||||
cv.check_type('product distribution applicability', applicability,
|
||||
Iterable, Tabulated1D)
|
||||
self._applicability = applicability
|
||||
|
||||
@decay_rate.setter
|
||||
def decay_rate(self, decay_rate):
|
||||
cv.check_type('product decay rate', decay_rate, Real)
|
||||
cv.check_greater_than('product decay rate', decay_rate, 0.0, True)
|
||||
self._decay_rate = decay_rate
|
||||
|
||||
@distribution.setter
|
||||
def distribution(self, distribution):
|
||||
cv.check_type('product angle-energy distribution', distribution,
|
||||
Iterable, AngleEnergy)
|
||||
self._distribution = distribution
|
||||
|
||||
@emission_mode.setter
|
||||
def emission_mode(self, emission_mode):
|
||||
cv.check_value('product emission mode', emission_mode,
|
||||
('prompt', 'delayed', 'total'))
|
||||
self._emission_mode = emission_mode
|
||||
|
||||
@particle.setter
|
||||
def particle(self, particle):
|
||||
cv.check_type('product particle type', particle, basestring)
|
||||
self._particle = particle
|
||||
|
||||
@yield_.setter
|
||||
def yield_(self, yield_):
|
||||
cv.check_type('product yield', yield_,
|
||||
(Real, Tabulated1D, Polynomial))
|
||||
self._yield = yield_
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write product to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['particle'] = np.string_(self.particle)
|
||||
group.attrs['emission_mode'] = np.string_(self.emission_mode)
|
||||
if self.decay_rate > 0.0:
|
||||
group.attrs['decay_rate'] = self.decay_rate
|
||||
|
||||
# Write yield
|
||||
if isinstance(self.yield_, Tabulated1D):
|
||||
self.yield_.to_hdf5(group, 'yield')
|
||||
dset = group['yield']
|
||||
dset.attrs['type'] = np.string_('tabulated')
|
||||
elif isinstance(self.yield_, Polynomial):
|
||||
dset = group.create_dataset('yield', data=self.yield_.coef)
|
||||
dset.attrs['type'] = np.string_('polynomial')
|
||||
else:
|
||||
dset = group.create_dataset('yield', data=float(self.yield_))
|
||||
dset.attrs['type'] = np.string_('constant')
|
||||
|
||||
# Write applicability/distribution
|
||||
group.attrs['n_distribution'] = len(self.distribution)
|
||||
for i, d in enumerate(self.distribution):
|
||||
dgroup = group.create_group('distribution_{}'.format(i))
|
||||
if self.applicability:
|
||||
self.applicability[i].to_hdf5(dgroup, 'applicability')
|
||||
d.to_hdf5(dgroup)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate reaction product from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.Product
|
||||
Reaction product
|
||||
|
||||
"""
|
||||
particle = group.attrs['particle'].decode()
|
||||
p = cls(particle)
|
||||
|
||||
p.emission_mode = group.attrs['emission_mode'].decode()
|
||||
if 'decay_rate' in group.attrs:
|
||||
p.decay_rate = group.attrs['decay_rate']
|
||||
|
||||
# Read yield
|
||||
yield_type = group['yield'].attrs['type'].decode()
|
||||
if yield_type == 'constant':
|
||||
p.yield_ = group['yield'].value
|
||||
elif yield_type == 'polynomial':
|
||||
p.yield_ = Polynomial(group['yield'].value)
|
||||
elif yield_type == 'tabulated':
|
||||
p.yield_ = Tabulated1D.from_hdf5(group['yield'])
|
||||
|
||||
# Read applicability/distribution
|
||||
n_distribution = group.attrs['n_distribution']
|
||||
distribution = []
|
||||
applicability = []
|
||||
for i in range(n_distribution):
|
||||
dgroup = group['distribution_{}'.format(i)]
|
||||
if 'applicability' in dgroup:
|
||||
applicability.append(Tabulated1D.from_hdf5(
|
||||
dgroup['applicability']))
|
||||
distribution.append(AngleEnergy.from_hdf5(dgroup))
|
||||
|
||||
p.distribution = distribution
|
||||
p.applicability = applicability
|
||||
|
||||
return p
|
||||
543
openmc/data/reaction.py
Normal file
543
openmc/data/reaction.py
Normal file
|
|
@ -0,0 +1,543 @@
|
|||
from __future__ import division, unicode_literals
|
||||
from collections import Iterable, Callable
|
||||
from copy import deepcopy
|
||||
from numbers import Real
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
from numpy.polynomial import Polynomial
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.stats import Uniform
|
||||
from .angle_distribution import AngleDistribution
|
||||
from .angle_energy import AngleEnergy
|
||||
from .function import Tabulated1D
|
||||
from .data import REACTION_NAME
|
||||
from .product import Product
|
||||
from .uncorrelated import UncorrelatedAngleEnergy
|
||||
|
||||
|
||||
def _get_fission_products(ace):
|
||||
"""Generate fission products from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
products : list of openmc.data.Product
|
||||
Prompt and delayed fission neutrons
|
||||
derived_products : list of openmc.data.Product
|
||||
"Total" fission neutron
|
||||
|
||||
"""
|
||||
# No NU block
|
||||
if ace.jxs[2] == 0:
|
||||
return None, None
|
||||
|
||||
products = []
|
||||
derived_products = []
|
||||
|
||||
# Either prompt nu or total nu is given
|
||||
if ace.xss[ace.jxs[2]] > 0:
|
||||
whichnu = 'prompt' if ace.jxs[24] > 0 else 'total'
|
||||
|
||||
neutron = Product('neutron')
|
||||
neutron.emission_mode = whichnu
|
||||
|
||||
idx = ace.jxs[2]
|
||||
LNU = int(ace.xss[idx])
|
||||
if LNU == 1:
|
||||
# Polynomial function form of nu
|
||||
NC = int(ace.xss[idx+1])
|
||||
coefficients = ace.xss[idx+2 : idx+2+NC]
|
||||
neutron.yield_ = Polynomial(coefficients)
|
||||
elif LNU == 2:
|
||||
# Tabular data form of nu
|
||||
neutron.yield_ = Tabulated1D.from_ace(ace, idx + 1)
|
||||
|
||||
products.append(neutron)
|
||||
|
||||
# Both prompt nu and total nu
|
||||
elif ace.xss[ace.jxs[2]] < 0:
|
||||
# Read prompt neutron yield
|
||||
prompt_neutron = Product('neutron')
|
||||
prompt_neutron.emission_mode = 'prompt'
|
||||
|
||||
idx = ace.jxs[2] + 1
|
||||
LNU = int(ace.xss[idx])
|
||||
if LNU == 1:
|
||||
# Polynomial function form of nu
|
||||
NC = int(ace.xss[idx+1])
|
||||
coefficients = ace.xss[idx+2 : idx+2+NC]
|
||||
prompt_neutron.yield_ = Polynomial(coefficients)
|
||||
elif LNU == 2:
|
||||
# Tabular data form of nu
|
||||
prompt_neutron.yield_ = Tabulated1D.from_ace(ace, idx + 1)
|
||||
|
||||
# Read total neutron yield
|
||||
total_neutron = Product('neutron')
|
||||
total_neutron.emission_mode = 'total'
|
||||
|
||||
idx = ace.jxs[2] + int(abs(ace.xss[ace.jxs[2]])) + 1
|
||||
LNU = int(ace.xss[idx])
|
||||
|
||||
if LNU == 1:
|
||||
# Polynomial function form of nu
|
||||
NC = int(ace.xss[idx+1])
|
||||
coefficients = ace.xss[idx+2 : idx+2+NC]
|
||||
total_neutron.yield_ = Polynomial(coefficients)
|
||||
elif LNU == 2:
|
||||
# Tabular data form of nu
|
||||
total_neutron.yield_ = Tabulated1D.from_ace(ace, idx + 1)
|
||||
|
||||
products.append(prompt_neutron)
|
||||
derived_products.append(total_neutron)
|
||||
|
||||
# Check for delayed nu data
|
||||
if ace.jxs[24] > 0:
|
||||
yield_delayed = Tabulated1D.from_ace(ace, ace.jxs[24] + 1)
|
||||
|
||||
# Delayed neutron precursor distribution
|
||||
idx = ace.jxs[25]
|
||||
n_group = ace.nxs[8]
|
||||
total_group_probability = 0.
|
||||
for group in range(n_group):
|
||||
delayed_neutron = Product('neutron')
|
||||
delayed_neutron.emission_mode = 'delayed'
|
||||
delayed_neutron.decay_rate = ace.xss[idx]
|
||||
|
||||
group_probability = Tabulated1D.from_ace(ace, idx + 1)
|
||||
if np.all(group_probability.y == group_probability.y[0]):
|
||||
delayed_neutron.yield_ = deepcopy(yield_delayed)
|
||||
delayed_neutron.yield_.y *= group_probability.y[0]
|
||||
total_group_probability += group_probability.y[0]
|
||||
else:
|
||||
# Get union energy grid and ensure energies are within
|
||||
# interpolable range of both functions
|
||||
max_energy = min(yield_delayed.x[-1], group_probability.x[-1])
|
||||
energy = np.union1d(yield_delayed.x, group_probability.x)
|
||||
energy = energy[energy <= max_energy]
|
||||
|
||||
# Calculate group yield
|
||||
group_yield = yield_delayed(energy) * group_probability(energy)
|
||||
delayed_neutron.yield_ = Tabulated1D(energy, group_yield)
|
||||
|
||||
# Advance position
|
||||
nr = int(ace.xss[idx + 1])
|
||||
ne = int(ace.xss[idx + 2 + 2*nr])
|
||||
idx += 3 + 2*nr + 2*ne
|
||||
|
||||
# Energy distribution for delayed fission neutrons
|
||||
location_start = int(ace.xss[ace.jxs[26] + group])
|
||||
delayed_neutron.distribution.append(
|
||||
AngleEnergy.from_ace(ace, ace.jxs[27], location_start))
|
||||
|
||||
products.append(delayed_neutron)
|
||||
|
||||
# Renormalize delayed neutron yields to reflect fact that in ACE
|
||||
# file, the sum of the group probabilities is not exactly one
|
||||
for product in products[1:]:
|
||||
if total_group_probability > 0.:
|
||||
product.yield_.y /= total_group_probability
|
||||
|
||||
return products, derived_products
|
||||
|
||||
|
||||
def _get_photon_products(ace, rx):
|
||||
"""Generate photon products from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
rx : openmc.data.Reaction
|
||||
Reaction that generates photons
|
||||
|
||||
Returns
|
||||
-------
|
||||
photons : list of openmc.Products
|
||||
Photons produced from reaction with given MT
|
||||
|
||||
"""
|
||||
n_photon_reactions = ace.nxs[6]
|
||||
photon_mts = ace.xss[ace.jxs[13]:ace.jxs[13] +
|
||||
n_photon_reactions].astype(int)
|
||||
|
||||
photons = []
|
||||
for i in range(n_photon_reactions):
|
||||
# Determine corresponding reaction
|
||||
neutron_mt = photon_mts[i] // 1000
|
||||
|
||||
# Restrict to photons that match the requested MT. Note that if the
|
||||
# photon is assigned to MT=18 but the file splits fission into
|
||||
# MT=19,20,21,38, we assign the photon product to each of the individual
|
||||
# reactions
|
||||
if neutron_mt == 18:
|
||||
if rx.mt not in (18, 19, 20, 21, 38):
|
||||
continue
|
||||
elif neutron_mt != rx.mt:
|
||||
continue
|
||||
|
||||
# Create photon product and assign to reactions
|
||||
photon = Product('photon')
|
||||
|
||||
# ==================================================================
|
||||
# Photon yield / production cross section
|
||||
|
||||
loca = int(ace.xss[ace.jxs[14] + i])
|
||||
idx = ace.jxs[15] + loca - 1
|
||||
mftype = int(ace.xss[idx])
|
||||
idx += 1
|
||||
|
||||
if mftype in (12, 16):
|
||||
# Yield data taken from ENDF File 12 or 6
|
||||
mtmult = int(ace.xss[idx])
|
||||
assert mtmult == neutron_mt
|
||||
|
||||
# Read photon yield as function of energy
|
||||
photon.yield_ = Tabulated1D.from_ace(ace, idx + 1)
|
||||
|
||||
elif mftype == 13:
|
||||
# Cross section data from ENDF File 13
|
||||
|
||||
# Energy grid index at which data starts
|
||||
threshold_idx = int(ace.xss[idx]) - 1
|
||||
n_energy = int(ace.xss[idx + 1])
|
||||
energy = ace.xss[ace.jxs[1] + threshold_idx:
|
||||
ace.jxs[1] + threshold_idx + n_energy]
|
||||
|
||||
# Get photon production cross section
|
||||
photon_prod_xs = ace.xss[idx + 2:idx + 2 + n_energy]
|
||||
neutron_xs = rx.xs(energy)
|
||||
idx = np.where(neutron_xs > 0.)
|
||||
|
||||
# Calculate photon yield
|
||||
yield_ = np.zeros_like(photon_prod_xs)
|
||||
yield_[idx] = photon_prod_xs[idx] / neutron_xs[idx]
|
||||
photon.yield_ = Tabulated1D(energy, yield_)
|
||||
|
||||
else:
|
||||
raise ValueError("MFTYPE must be 12, 13, 16. Got {0}".format(
|
||||
mftype))
|
||||
|
||||
# ==================================================================
|
||||
# Photon energy distribution
|
||||
|
||||
location_start = int(ace.xss[ace.jxs[18] + i])
|
||||
distribution = AngleEnergy.from_ace(ace, ace.jxs[19], location_start)
|
||||
assert isinstance(distribution, UncorrelatedAngleEnergy)
|
||||
|
||||
# ==================================================================
|
||||
# Photon angular distribution
|
||||
loc = int(ace.xss[ace.jxs[16] + i])
|
||||
|
||||
if loc == 0:
|
||||
# No angular distribution data are given for this reaction,
|
||||
# isotropic scattering is asssumed in LAB
|
||||
energy = np.array([photon.yield_.x[0], photon.yield_.x[-1]])
|
||||
mu_isotropic = Uniform(-1., 1.)
|
||||
distribution.angle = AngleDistribution(
|
||||
energy, [mu_isotropic, mu_isotropic])
|
||||
else:
|
||||
distribution.angle = AngleDistribution.from_ace(ace, ace.jxs[17], loc)
|
||||
|
||||
# Add to list of distributions
|
||||
photon.distribution.append(distribution)
|
||||
photons.append(photon)
|
||||
|
||||
return photons
|
||||
|
||||
|
||||
class Reaction(object):
|
||||
"""A nuclear reaction
|
||||
|
||||
A Reaction object represents a single reaction channel for a nuclide with
|
||||
an associated cross section and, if present, a secondary angle and energy
|
||||
distribution.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
mt : int
|
||||
The ENDF MT number for this reaction. On occasion, MCNP uses MT numbers
|
||||
that don't correspond exactly to the ENDF specification.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
center_of_mass : bool
|
||||
Indicates whether scattering kinematics should be performed in the
|
||||
center-of-mass or laboratory reference frame.
|
||||
grid above the threshold value in barns.
|
||||
mt : int
|
||||
The ENDF MT number for this reaction.
|
||||
q_value : float
|
||||
The Q-value of this reaction in MeV.
|
||||
table : openmc.data.ace.Table
|
||||
The ACE table which contains this reaction.
|
||||
threshold : float
|
||||
Threshold of the reaction in MeV
|
||||
threshold_idx : int
|
||||
The index on the energy grid corresponding to the threshold of this
|
||||
reaction.
|
||||
xs : callable
|
||||
Microscopic cross section for this reaction as a function of incident
|
||||
energy
|
||||
products : Iterable of openmc.data.Product
|
||||
Reaction products
|
||||
derived_products : Iterable of openmc.data.Product
|
||||
Derived reaction products. Used for 'total' fission neutron data when
|
||||
prompt/delayed data also exists.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, mt):
|
||||
self.center_of_mass = True
|
||||
self.mt = mt
|
||||
self.q_value = 0.
|
||||
self.threshold_idx = 0
|
||||
self._xs = None
|
||||
self.products = []
|
||||
self.derived_products = []
|
||||
|
||||
def __repr__(self):
|
||||
if self.mt in REACTION_NAME:
|
||||
return "<Reaction: MT={} {}>".format(self.mt, REACTION_NAME[self.mt])
|
||||
else:
|
||||
return "<Reaction: MT={}>".format(self.mt)
|
||||
|
||||
@property
|
||||
def center_of_mass(self):
|
||||
return self._center_of_mass
|
||||
|
||||
@property
|
||||
def q_value(self):
|
||||
return self._q_value
|
||||
|
||||
@property
|
||||
def products(self):
|
||||
return self._products
|
||||
|
||||
@property
|
||||
def threshold(self):
|
||||
return self.xs.x[0]
|
||||
|
||||
@property
|
||||
def xs(self):
|
||||
return self._xs
|
||||
|
||||
@center_of_mass.setter
|
||||
def center_of_mass(self, center_of_mass):
|
||||
cv.check_type('center of mass', center_of_mass, (bool, np.bool_))
|
||||
self._center_of_mass = center_of_mass
|
||||
|
||||
@q_value.setter
|
||||
def q_value(self, q_value):
|
||||
cv.check_type('Q value', q_value, Real)
|
||||
self._q_value = q_value
|
||||
|
||||
@products.setter
|
||||
def products(self, products):
|
||||
cv.check_type('reaction products', products, Iterable, Product)
|
||||
self._products = products
|
||||
|
||||
@xs.setter
|
||||
def xs(self, xs):
|
||||
cv.check_type('reaction cross section', xs, Callable)
|
||||
if isinstance(xs, Tabulated1D):
|
||||
for y in xs.y:
|
||||
cv.check_greater_than('reaction cross section', y, 0.0, True)
|
||||
self._xs = xs
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write reaction to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
|
||||
group.attrs['mt'] = self.mt
|
||||
if self.mt in REACTION_NAME:
|
||||
group.attrs['label'] = np.string_(REACTION_NAME[self.mt])
|
||||
else:
|
||||
group.attrs['label'] = np.string_(self.mt)
|
||||
group.attrs['Q_value'] = self.q_value
|
||||
group.attrs['threshold_idx'] = self.threshold_idx + 1
|
||||
group.attrs['center_of_mass'] = 1 if self.center_of_mass else 0
|
||||
if self.xs is not None:
|
||||
group.create_dataset('xs', data=self.xs.y)
|
||||
for i, p in enumerate(self.products):
|
||||
pgroup = group.create_group('product_{}'.format(i))
|
||||
p.to_hdf5(pgroup)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group, energy):
|
||||
"""Generate reaction from an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
energy : Iterable of float
|
||||
Array of energies at which cross sections are tabulated at
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ace.Reaction
|
||||
Reaction data
|
||||
|
||||
"""
|
||||
mt = group.attrs['mt']
|
||||
rx = cls(mt)
|
||||
rx.q_value = group.attrs['Q_value']
|
||||
rx.threshold_idx = group.attrs['threshold_idx'] - 1
|
||||
rx.center_of_mass = bool(group.attrs['center_of_mass'])
|
||||
|
||||
# Read cross section
|
||||
if 'xs' in group:
|
||||
xs = group['xs'].value
|
||||
rx.xs = Tabulated1D(energy[rx.threshold_idx:], xs)
|
||||
|
||||
# Determine number of products
|
||||
n_product = 0
|
||||
for name in group:
|
||||
if name.startswith('product_'):
|
||||
n_product += 1
|
||||
|
||||
# Read reaction products
|
||||
for i in range(n_product):
|
||||
pgroup = group['product_{}'.format(i)]
|
||||
rx.products.append(Product.from_hdf5(pgroup))
|
||||
|
||||
return rx
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, i_reaction):
|
||||
# Get nuclide energy grid
|
||||
n_grid = ace.nxs[3]
|
||||
grid = ace.xss[ace.jxs[1]:ace.jxs[1] + n_grid]
|
||||
|
||||
if i_reaction > 0:
|
||||
mt = int(ace.xss[ace.jxs[3] + i_reaction - 1])
|
||||
rx = cls(mt)
|
||||
|
||||
# Get Q-value of reaction
|
||||
rx.q_value = ace.xss[ace.jxs[4] + i_reaction - 1]
|
||||
|
||||
# ==================================================================
|
||||
# CROSS SECTION
|
||||
|
||||
# Get locator for cross-section data
|
||||
loc = int(ace.xss[ace.jxs[6] + i_reaction - 1])
|
||||
|
||||
# Determine starting index on energy grid
|
||||
rx.threshold_idx = int(ace.xss[ace.jxs[7] + loc - 1]) - 1
|
||||
|
||||
# Determine number of energies in reaction
|
||||
n_energy = int(ace.xss[ace.jxs[7] + loc])
|
||||
energy = grid[rx.threshold_idx:rx.threshold_idx + n_energy]
|
||||
|
||||
# Read reaction cross section
|
||||
xs = ace.xss[ace.jxs[7] + loc + 1:ace.jxs[7] + loc + 1 + n_energy]
|
||||
|
||||
# Fix negatives -- known issue for Y89 in JEFF 3.2
|
||||
if np.any(xs < 0.0):
|
||||
warn("Negative cross sections found for MT={} in {}. Setting "
|
||||
"to zero.".format(rx.mt, ace.name))
|
||||
xs[xs < 0.0] = 0.0
|
||||
|
||||
rx.xs = Tabulated1D(energy, xs)
|
||||
|
||||
# ==================================================================
|
||||
# YIELD AND ANGLE-ENERGY DISTRIBUTION
|
||||
|
||||
# Determine multiplicity
|
||||
ty = int(ace.xss[ace.jxs[5] + i_reaction - 1])
|
||||
rx.center_of_mass = (ty < 0)
|
||||
if i_reaction < ace.nxs[5] + 1:
|
||||
if ty != 19:
|
||||
if abs(ty) > 100:
|
||||
# Energy-dependent neutron yield
|
||||
idx = ace.jxs[11] + abs(ty) - 101
|
||||
yield_ = Tabulated1D.from_ace(ace, idx)
|
||||
else:
|
||||
yield_ = abs(ty)
|
||||
|
||||
neutron = Product('neutron')
|
||||
neutron.yield_ = yield_
|
||||
rx.products.append(neutron)
|
||||
else:
|
||||
assert mt in (18, 19, 20, 21, 38)
|
||||
rx.products, rx.derived_products = _get_fission_products(ace)
|
||||
|
||||
for p in rx.products:
|
||||
if p.emission_mode in ('prompt', 'total'):
|
||||
neutron = p
|
||||
break
|
||||
else:
|
||||
raise Exception("Couldn't find prompt/total fission neutron")
|
||||
|
||||
# Determine locator for ith energy distribution
|
||||
lnw = int(ace.xss[ace.jxs[10] + i_reaction - 1])
|
||||
while lnw > 0:
|
||||
# Applicability of this distribution
|
||||
neutron.applicability.append(Tabulated1D.from_ace(
|
||||
ace, ace.jxs[11] + lnw + 2))
|
||||
|
||||
# Read energy distribution data
|
||||
neutron.distribution.append(AngleEnergy.from_ace(
|
||||
ace, ace.jxs[11], lnw, rx))
|
||||
|
||||
lnw = int(ace.xss[ace.jxs[11] + lnw - 1])
|
||||
|
||||
else:
|
||||
# Elastic scattering
|
||||
mt = 2
|
||||
rx = cls(mt)
|
||||
|
||||
# Get elastic cross section values
|
||||
elastic_xs = ace.xss[ace.jxs[1] + 3*n_grid:ace.jxs[1] + 4*n_grid]
|
||||
|
||||
# Fix negatives -- known issue for Ti46,49,50 in JEFF 3.2
|
||||
if np.any(elastic_xs < 0.0):
|
||||
warn("Negative elastic scattering cross section found for {}. "
|
||||
"Setting to zero.".format(ace.name))
|
||||
elastic_xs[elastic_xs < 0.0] = 0.0
|
||||
|
||||
rx.xs = Tabulated1D(grid, elastic_xs)
|
||||
|
||||
# No energy distribution for elastic scattering
|
||||
neutron = Product('neutron')
|
||||
neutron.distribution.append(UncorrelatedAngleEnergy())
|
||||
rx.products.append(neutron)
|
||||
|
||||
# ======================================================================
|
||||
# ANGLE DISTRIBUTION (FOR UNCORRELATED)
|
||||
|
||||
if i_reaction < ace.nxs[5] + 1:
|
||||
# Check if angular distribution data exist
|
||||
loc = int(ace.xss[ace.jxs[8] + i_reaction])
|
||||
if loc <= 0:
|
||||
# Angular distribution is either given as part of a product
|
||||
# angle-energy distribution or is not given at all (in which
|
||||
# case isotropic scattering is assumed)
|
||||
angle_dist = None
|
||||
else:
|
||||
angle_dist = AngleDistribution.from_ace(ace, ace.jxs[9], loc)
|
||||
|
||||
# Apply angular distribution to each uncorrelated angle-energy
|
||||
# distribution
|
||||
if angle_dist is not None:
|
||||
for d in neutron.distribution:
|
||||
d.angle = angle_dist
|
||||
|
||||
# ======================================================================
|
||||
# PHOTON PRODUCTION
|
||||
|
||||
rx.products += _get_photon_products(ace, rx)
|
||||
|
||||
return rx
|
||||
396
openmc/data/thermal.py
Normal file
396
openmc/data/thermal.py
Normal file
|
|
@ -0,0 +1,396 @@
|
|||
from collections import Iterable
|
||||
from difflib import get_close_matches
|
||||
from numbers import Real
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
import h5py
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from .ace import Table, get_table
|
||||
from .angle_energy import AngleEnergy
|
||||
from .function import Tabulated1D
|
||||
from .correlated import CorrelatedAngleEnergy
|
||||
from openmc.stats import Discrete, Tabular
|
||||
|
||||
|
||||
_THERMAL_NAMES = {'al': 'c_Al27', 'al27': 'c_Al27',
|
||||
'be': 'c_Be',
|
||||
'bebeo': 'c_Be_in_BeO', 'be-o': 'c_Be_in_BeO',
|
||||
'benz': 'c_Benzine',
|
||||
'cah': 'c_Ca_in_CaH2',
|
||||
'dd2o': 'c_D_in_D2O', 'hwtr': 'c_D_in_D2O',
|
||||
'fe': 'c_Fe56', 'fe56': 'c_Fe56',
|
||||
'graph': 'c_Graphite', 'grph': 'c_Graphite',
|
||||
'hca': 'c_H_in_CaH2',
|
||||
'hch2': 'c_H_in_CH2', 'poly': 'c_H_in_CH2',
|
||||
'hh2o': 'c_H_in_H2O', 'lwtr': 'c_H_in_H2O',
|
||||
'hzrh': 'c_H_in_ZrH', 'h-zr': 'c_H_in_ZrH',
|
||||
'lch4': 'c_liquid_CH4', 'lmeth': 'c_liquid_CH4',
|
||||
'mg': 'c_Mg24',
|
||||
'obeo': 'c_O_in_BeO', 'o-be': 'c_O_in_BeO',
|
||||
'orthod': 'c_ortho_D', 'dortho': 'c_ortho_D',
|
||||
'orthoh': 'c_ortho_H', 'hortho': 'c_ortho_H',
|
||||
'ouo2': 'c_O_in_UO2', 'o2-u': 'c_O_in_UO2',
|
||||
'parad': 'c_para_D', 'dpara': 'c_para_D',
|
||||
'parah': 'c_para_H', 'hpara': 'c_para_H',
|
||||
'sch4': 'c_solid_CH4', 'smeth': 'c_solid_CH4',
|
||||
'uuo2': 'c_U_in_UO2', 'u-o2': 'c_U_in_UO2',
|
||||
'zrzrh': 'c_Zr_in_ZrH', 'zr-h': 'c_Zr_in_ZrH'}
|
||||
|
||||
|
||||
class CoherentElastic(object):
|
||||
r"""Coherent elastic scattering data from a crystalline material
|
||||
|
||||
Parameters
|
||||
----------
|
||||
bragg_edges : Iterable of float
|
||||
Bragg edge energies in MeV
|
||||
factors : Iterable of float
|
||||
Partial sum of structure factors, :math:`\sum\limits_{i=1}^{E_i<E} S_i`
|
||||
|
||||
Attributes
|
||||
----------
|
||||
bragg_edges : Iterable of float
|
||||
Bragg edge energies in MeV
|
||||
factors : Iterable of float
|
||||
Partial sum of structure factors, :math:`\sum\limits_{i=1}^{E_i<E} S_i`
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, bragg_edges, factors):
|
||||
self.bragg_edges = bragg_edges
|
||||
self.factors = factors
|
||||
|
||||
def __call__(self, E):
|
||||
if isinstance(E, Iterable):
|
||||
E = np.asarray(E)
|
||||
idx = np.searchsorted(self.bragg_edges, E)
|
||||
return self.factors[idx]/E
|
||||
|
||||
def __len__(self):
|
||||
return len(self.bragg_edges)
|
||||
|
||||
@property
|
||||
def bragg_edges(self):
|
||||
return self._bragg_edges
|
||||
|
||||
@property
|
||||
def factors(self):
|
||||
return self._factors
|
||||
|
||||
@bragg_edges.setter
|
||||
def bragg_edges(self, bragg_edges):
|
||||
cv.check_type('Bragg edges', bragg_edges, Iterable, Real)
|
||||
self._bragg_edges = np.asarray(bragg_edges)
|
||||
|
||||
@factors.setter
|
||||
def factors(self, factors):
|
||||
cv.check_type('structure factor cumulative sums', factors,
|
||||
Iterable, Real)
|
||||
self._factors = np.asarray(factors)
|
||||
|
||||
def to_hdf5(self, group, name):
|
||||
"""Write coherent elastic scattering to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
name : str
|
||||
Name of the dataset to create
|
||||
|
||||
"""
|
||||
dataset = group.create_dataset(name, data=np.vstack(
|
||||
[self.bragg_edges, self.factors]))
|
||||
dataset.attrs['type'] = np.string_('bragg')
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, dataset):
|
||||
"""Read coherent elastic scattering from an HDF5 dataset
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Dataset
|
||||
HDF5 group to write to
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.CoherentElastic
|
||||
Coherent elastic scattering cross section
|
||||
|
||||
"""
|
||||
bragg_edges = dataset.value[0, :]
|
||||
factors = dataset.value[1, :]
|
||||
return cls(bragg_edges, factors)
|
||||
|
||||
|
||||
class ThermalScattering(object):
|
||||
"""A ThermalScattering object contains thermal scattering data as represented by
|
||||
an S(alpha, beta) table.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
ZAID identifier of the table, e.g. lwtr.10t.
|
||||
atomic_weight_ratio : float
|
||||
Atomic mass ratio of the target nuclide.
|
||||
temperature : float
|
||||
Temperature of the target nuclide in eV.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
atomic_weight_ratio : float
|
||||
Atomic mass ratio of the target nuclide.
|
||||
elastic_xs : openmc.data.Tabulated1D or openmc.data.CoherentElastic
|
||||
Elastic scattering cross section derived in the coherent or incoherent
|
||||
approximation
|
||||
inelastic_xs : openmc.data.Tabulated1D
|
||||
Inelastic scattering cross section derived in the incoherent
|
||||
approximation
|
||||
name : str
|
||||
Name of the table, e.g. lwtr.20t.
|
||||
temperature : float
|
||||
Temperature of the target nuclide in eV.
|
||||
zaids : Iterable of int
|
||||
ZAID identifiers that the thermal scattering data applies to
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, name, atomic_weight_ratio, temperature):
|
||||
self.name = name
|
||||
self.atomic_weight_ratio = atomic_weight_ratio
|
||||
self.temperature = temperature
|
||||
self.elastic_xs = None
|
||||
self.elastic_mu_out = None
|
||||
self.inelastic_xs = None
|
||||
self.inelastic_e_out = None
|
||||
self.inelastic_mu_out = None
|
||||
self.secondary_mode = None
|
||||
self.zaids = []
|
||||
|
||||
def __repr__(self):
|
||||
if hasattr(self, 'name'):
|
||||
return "<Thermal Scattering Data: {0}>".format(self.name)
|
||||
else:
|
||||
return "<Thermal Scattering Data>"
|
||||
|
||||
def export_to_hdf5(self, path, mode='a'):
|
||||
"""Export table to an HDF5 file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
path : str
|
||||
Path to write HDF5 file to
|
||||
mode : {'r', r+', 'w', 'x', 'a'}
|
||||
Mode that is used to open the HDF5 file. This is the second argument
|
||||
to the :class:`h5py.File` constructor.
|
||||
|
||||
"""
|
||||
|
||||
f = h5py.File(path, mode, libver='latest')
|
||||
|
||||
# Write basic data
|
||||
g = f.create_group(self.name)
|
||||
g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio
|
||||
g.attrs['temperature'] = self.temperature
|
||||
g.attrs['zaids'] = self.zaids
|
||||
|
||||
# Write thermal elastic scattering
|
||||
if self.elastic_xs is not None:
|
||||
elastic_group = g.create_group('elastic')
|
||||
self.elastic_xs.to_hdf5(elastic_group, 'xs')
|
||||
if self.elastic_mu_out is not None:
|
||||
elastic_group.create_dataset('mu_out', data=self.elastic_mu_out)
|
||||
|
||||
# Write thermal inelastic scattering
|
||||
if self.inelastic_xs is not None:
|
||||
inelastic_group = g.create_group('inelastic')
|
||||
self.inelastic_xs.to_hdf5(inelastic_group, 'xs')
|
||||
inelastic_group.attrs['secondary_mode'] = np.string_(self.secondary_mode)
|
||||
if self.secondary_mode in ('equal', 'skewed'):
|
||||
inelastic_group.create_dataset('energy_out', data=self.inelastic_e_out)
|
||||
inelastic_group.create_dataset('mu_out', data=self.inelastic_mu_out)
|
||||
elif self.secondary_mode == 'continuous':
|
||||
self.inelastic_dist.to_hdf5(inelastic_group)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate thermal scattering data from HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ThermalScattering
|
||||
Neutron thermal scattering data
|
||||
|
||||
"""
|
||||
name = group.name[1:]
|
||||
atomic_weight_ratio = group.attrs['atomic_weight_ratio']
|
||||
temperature = group.attrs['temperature']
|
||||
table = cls(name, atomic_weight_ratio, temperature)
|
||||
table.zaids = group.attrs['zaids']
|
||||
|
||||
# Read thermal elastic scattering
|
||||
if 'elastic' in group:
|
||||
elastic_group = group['elastic']
|
||||
|
||||
# Cross section
|
||||
elastic_xs_type = elastic_group['xs'].attrs['type'].decode()
|
||||
if elastic_xs_type == 'tab1':
|
||||
table.elastic_xs = Tabulated1D.from_hdf5(elastic_group['xs'])
|
||||
elif elastic_xs_type == 'bragg':
|
||||
table.elastic_xs = CoherentElastic.from_hdf5(elastic_group['xs'])
|
||||
|
||||
# Angular distribution
|
||||
if 'mu_out' in elastic_group:
|
||||
table.elastic_mu_out = elastic_group['mu_out'].value
|
||||
|
||||
# Read thermal inelastic scattering
|
||||
if 'inelastic' in group:
|
||||
inelastic_group = group['inelastic']
|
||||
table.secondary_mode = inelastic_group.attrs['secondary_mode'].decode()
|
||||
table.inelastic_xs = Tabulated1D.from_hdf5(inelastic_group['xs'])
|
||||
if table.secondary_mode in ('equal', 'skewed'):
|
||||
table.inelastic_e_out = inelastic_group['energy_out']
|
||||
table.inelastic_mu_out = inelastic_group['mu_out']
|
||||
elif table.secondary_mode == 'continuous':
|
||||
table.inelastic_dist = AngleEnergy.from_hdf5(inelastic_group)
|
||||
|
||||
return table
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace_or_filename, name=None):
|
||||
"""Generate thermal scattering data from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table or str
|
||||
ACE table to read from. If given as a string, it is assumed to be
|
||||
the filename for the ACE file.
|
||||
name : str
|
||||
GND-conforming name of the material, e.g. c_H_in_H2O. If none is
|
||||
passed, the appropriate name is guessed based on the name of the ACE
|
||||
table.
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ThermalScattering
|
||||
Thermal scattering data
|
||||
|
||||
"""
|
||||
if isinstance(ace_or_filename, Table):
|
||||
ace = ace_or_filename
|
||||
else:
|
||||
ace = get_table(ace_or_filename)
|
||||
|
||||
# Get new name that is GND-consistent
|
||||
ace_name, xs = ace.name.split('.')
|
||||
if name is None:
|
||||
if ace_name.lower() in _THERMAL_NAMES:
|
||||
name = _THERMAL_NAMES[ace_name.lower()] + '.' + xs
|
||||
else:
|
||||
# Make an educated guess?? This actually works well for JEFF-3.2
|
||||
# which stupidly uses names like lw00.32t, lw01.32t, etc. for
|
||||
# different temperatures
|
||||
matches = get_close_matches(
|
||||
ace_name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5)
|
||||
if len(matches) > 0:
|
||||
name = _THERMAL_NAMES[matches[0]] + '.' + xs
|
||||
else:
|
||||
# OK, we give up. Just use the ACE name.
|
||||
name = 'c_' + ace.name
|
||||
warn('Thermal scattering material "{}" is not recognized. '
|
||||
'Assigning a name of {}.'.format(ace.name, name))
|
||||
|
||||
table = cls(name, ace.atomic_weight_ratio, ace.temperature)
|
||||
|
||||
# Incoherent inelastic scattering cross section
|
||||
idx = ace.jxs[1]
|
||||
n_energy = int(ace.xss[idx])
|
||||
energy = ace.xss[idx+1 : idx+1+n_energy]
|
||||
xs = ace.xss[idx+1+n_energy : idx+1+2*n_energy]
|
||||
table.inelastic_xs = Tabulated1D(energy, xs)
|
||||
|
||||
if ace.nxs[7] == 0:
|
||||
table.secondary_mode = 'equal'
|
||||
elif ace.nxs[7] == 1:
|
||||
table.secondary_mode = 'skewed'
|
||||
elif ace.nxs[7] == 2:
|
||||
table.secondary_mode = 'continuous'
|
||||
|
||||
n_energy_out = ace.nxs[4]
|
||||
if table.secondary_mode in ('equal', 'skewed'):
|
||||
n_mu = ace.nxs[3]
|
||||
idx = ace.jxs[3]
|
||||
table.inelastic_e_out = ace.xss[idx:idx+n_energy*n_energy_out*(n_mu+2):n_mu+2]
|
||||
table.inelastic_e_out.shape = (n_energy, n_energy_out)
|
||||
|
||||
table.inelastic_mu_out = ace.xss[idx:idx+n_energy*n_energy_out*(n_mu+2)]
|
||||
table.inelastic_mu_out.shape = (n_energy, n_energy_out, n_mu+2)
|
||||
table.inelastic_mu_out = table.inelastic_mu_out[:, :, 1:]
|
||||
else:
|
||||
n_mu = ace.nxs[3] - 1
|
||||
idx = ace.jxs[3]
|
||||
locc = ace.xss[idx:idx + n_energy].astype(int)
|
||||
n_energy_out = ace.xss[idx + n_energy:idx + 2*n_energy].astype(int)
|
||||
energy_out = []
|
||||
mu_out = []
|
||||
for i in range(n_energy):
|
||||
idx = locc[i]
|
||||
|
||||
# Outgoing energy distribution for incoming energy i
|
||||
e = ace.xss[idx + 1:idx + 1 + n_energy_out[i]*(n_mu + 3):n_mu + 3]
|
||||
p = ace.xss[idx + 2:idx + 2 + n_energy_out[i]*(n_mu + 3):n_mu + 3]
|
||||
c = ace.xss[idx + 3:idx + 3 + n_energy_out[i]*(n_mu + 3):n_mu + 3]
|
||||
eout_i = Tabular(e, p, 'linear-linear', ignore_negative=True)
|
||||
eout_i.c = c
|
||||
|
||||
# Outgoing angle distribution for each (incoming, outgoing) energy pair
|
||||
mu_i = []
|
||||
for j in range(n_energy_out[i]):
|
||||
mu = ace.xss[idx + 4:idx + 4 + n_mu]
|
||||
p_mu = 1./n_mu*np.ones(n_mu)
|
||||
mu_ij = Discrete(mu, p_mu)
|
||||
mu_ij.c = np.cumsum(p_mu)
|
||||
mu_i.append(mu_ij)
|
||||
idx += 3 + n_mu
|
||||
|
||||
energy_out.append(eout_i)
|
||||
mu_out.append(mu_i)
|
||||
|
||||
# Create correlated angle-energy distribution
|
||||
breakpoints = [n_energy]
|
||||
interpolation = [2]
|
||||
energy = table.inelastic_xs.x
|
||||
table.inelastic_dist = CorrelatedAngleEnergy(
|
||||
breakpoints, interpolation, energy, energy_out, mu_out)
|
||||
|
||||
# Incoherent/coherent elastic scattering cross section
|
||||
idx = ace.jxs[4]
|
||||
if idx != 0:
|
||||
n_energy = int(ace.xss[idx])
|
||||
energy = ace.xss[idx+1 : idx+1+n_energy]
|
||||
P = ace.xss[idx+1+n_energy : idx+1+2*n_energy]
|
||||
|
||||
if ace.nxs[5] == 4:
|
||||
table.elastic_xs = CoherentElastic(energy, P)
|
||||
else:
|
||||
table.elastic_xs = Tabulated1D(energy, P)
|
||||
|
||||
# Angular distribution
|
||||
n_mu = ace.nxs[6]
|
||||
if n_mu != -1:
|
||||
idx = ace.jxs[6]
|
||||
table.elastic_mu_out = ace.xss[idx:idx + n_energy*n_mu]
|
||||
table.elastic_mu_out.shape = (n_energy, n_mu)
|
||||
|
||||
# Get relevant ZAIDs
|
||||
pairs = np.fromiter(map(lambda p: p[0], ace.pairs), int)
|
||||
table.zaids = pairs[np.nonzero(pairs)]
|
||||
|
||||
return table
|
||||
95
openmc/data/uncorrelated.py
Normal file
95
openmc/data/uncorrelated.py
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from .angle_energy import AngleEnergy
|
||||
from .energy_distribution import EnergyDistribution
|
||||
from .angle_distribution import AngleDistribution
|
||||
|
||||
|
||||
class UncorrelatedAngleEnergy(AngleEnergy):
|
||||
"""Uncorrelated angle-energy distribution
|
||||
|
||||
Parameters
|
||||
----------
|
||||
angle : openmc.data.AngleDistribution
|
||||
Distribution of outgoing angles represented as scattering cosines
|
||||
energy : openmc.data.EnergyDistribution
|
||||
Distribution of outgoing energies
|
||||
|
||||
Attributes
|
||||
----------
|
||||
angle : openmc.data.AngleDistribution
|
||||
Distribution of outgoing angles represented as scattering cosines
|
||||
energy : openmc.data.EnergyDistribution
|
||||
Distribution of outgoing energies
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, angle=None, energy=None):
|
||||
self._angle = None
|
||||
self._energy = None
|
||||
|
||||
if angle is not None:
|
||||
self.angle = angle
|
||||
if energy is not None:
|
||||
self.energy = energy
|
||||
|
||||
@property
|
||||
def angle(self):
|
||||
return self._angle
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@angle.setter
|
||||
def angle(self, angle):
|
||||
cv.check_type('uncorrelated angle distribution', angle,
|
||||
AngleDistribution)
|
||||
self._angle = angle
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('uncorrelated energy distribution', energy,
|
||||
EnergyDistribution)
|
||||
self._energy = energy
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['type'] = np.string_('uncorrelated')
|
||||
if self.angle is not None:
|
||||
angle_group = group.create_group('angle')
|
||||
self.angle.to_hdf5(angle_group)
|
||||
|
||||
if self.energy is not None:
|
||||
energy_group = group.create_group('energy')
|
||||
self.energy.to_hdf5(energy_group)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate uncorrelated angle-energy distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.UncorrelatedAngleEnergy
|
||||
Uncorrelated angle-energy distribution
|
||||
|
||||
"""
|
||||
dist = cls()
|
||||
if 'angle' in group:
|
||||
dist.angle = AngleDistribution.from_hdf5(group['angle'])
|
||||
if 'energy' in group:
|
||||
dist.energy = EnergyDistribution.from_hdf5(group['energy'])
|
||||
return dist
|
||||
210
openmc/data/urr.py
Normal file
210
openmc/data/urr.py
Normal file
|
|
@ -0,0 +1,210 @@
|
|||
from collections import Iterable
|
||||
from numbers import Integral, Real
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
|
||||
|
||||
class ProbabilityTables(object):
|
||||
r"""Unresolved resonance region probability tables.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
energy : Iterable of float
|
||||
Energies in MeV at which probability tables exist
|
||||
table : numpy.ndarray
|
||||
Probability tables for each energy. This array is of shape (N, 6, M)
|
||||
where N is the number of energies and M is the number of bands. The
|
||||
second dimension indicates whether the value is for the cumulative
|
||||
probability (0), total (1), elastic (2), fission (3), :math:`(n,\gamma)`
|
||||
(4), or heating number (5).
|
||||
interpolation : {2, 5}
|
||||
Interpolation scheme between tables
|
||||
inelastic_flag : int
|
||||
A value less than zero indicates that the inelastic cross section is
|
||||
zero within the unresolved energy range. A value greater than zero
|
||||
indicates the MT number for a reaction whose cross section is to be used
|
||||
in the unresolved range.
|
||||
absorption_flag : int
|
||||
A value less than zero indicates that the "other absorption" cross
|
||||
section is zero within the unresolved energy range. A value greater than
|
||||
zero indicates the MT number for a reaction whose cross section is to be
|
||||
used in the unresolved range.
|
||||
multiply_smooth : bool
|
||||
Indicate whether probability table values are cross sections (False) or
|
||||
whether they must be multiply by the corresponding "smooth" cross
|
||||
sections (True).
|
||||
|
||||
Attributes
|
||||
----------
|
||||
energy : Iterable of float
|
||||
Energies in MeV at which probability tables exist
|
||||
table : numpy.ndarray
|
||||
Probability tables for each energy. This array is of shape (N, 6, M)
|
||||
where N is the number of energies and M is the number of bands. The
|
||||
second dimension indicates whether the value is for the cumulative
|
||||
probability (0), total (1), elastic (2), fission (3), :math:`(n,\gamma)`
|
||||
(4), or heating number (5).
|
||||
interpolation : {2, 5}
|
||||
Interpolation scheme between tables
|
||||
inelastic_flag : int
|
||||
A value less than zero indicates that the inelastic cross section is
|
||||
zero within the unresolved energy range. A value greater than zero
|
||||
indicates the MT number for a reaction whose cross section is to be used
|
||||
in the unresolved range.
|
||||
absorption_flag : int
|
||||
A value less than zero indicates that the "other absorption" cross
|
||||
section is zero within the unresolved energy range. A value greater than
|
||||
zero indicates the MT number for a reaction whose cross section is to be
|
||||
used in the unresolved range.
|
||||
multiply_smooth : bool
|
||||
Indicate whether probability table values are cross sections (False) or
|
||||
whether they must be multiply by the corresponding "smooth" cross
|
||||
sections (True).
|
||||
"""
|
||||
|
||||
def __init__(self, energy, table, interpolation, inelastic_flag=-1,
|
||||
absorption_flag=-1, multiply_smooth=False):
|
||||
self.energy = energy
|
||||
self.table = table
|
||||
self.interpolation = interpolation
|
||||
self.inelastic_flag = inelastic_flag
|
||||
self.absorption_flag = absorption_flag
|
||||
self.multiply_smooth = multiply_smooth
|
||||
|
||||
@property
|
||||
def absorption_flag(self):
|
||||
return self._absorption_flag
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@property
|
||||
def inelastic_flag(self):
|
||||
return self._inelastic_flag
|
||||
|
||||
@property
|
||||
def interpolation(self):
|
||||
return self._interpolation
|
||||
|
||||
@property
|
||||
def multiply_smooth(self):
|
||||
return self._multiply_smooth
|
||||
|
||||
@property
|
||||
def table(self):
|
||||
return self._table
|
||||
|
||||
@absorption_flag.setter
|
||||
def absorption_flag(self, absorption_flag):
|
||||
cv.check_type('absorption flag', absorption_flag, Integral)
|
||||
self._absorption_flag = absorption_flag
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('probability table energies', energy, Iterable, Real)
|
||||
self._energy = energy
|
||||
|
||||
@inelastic_flag.setter
|
||||
def inelastic_flag(self, inelastic_flag):
|
||||
cv.check_type('inelastic flag', inelastic_flag, Integral)
|
||||
self._inelastic_flag = inelastic_flag
|
||||
|
||||
@interpolation.setter
|
||||
def interpolation(self, interpolation):
|
||||
cv.check_value('interpolation', interpolation, [2, 5])
|
||||
self._interpolation = interpolation
|
||||
|
||||
@multiply_smooth.setter
|
||||
def multiply_smooth(self, multiply_smooth):
|
||||
cv.check_type('multiply by smooth', multiply_smooth, bool)
|
||||
self._multiply_smooth = multiply_smooth
|
||||
|
||||
@table.setter
|
||||
def table(self, table):
|
||||
cv.check_type('probability tables', table, np.ndarray)
|
||||
self._table = table
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write probability tables to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['interpolation'] = self.interpolation
|
||||
group.attrs['inelastic'] = self.inelastic_flag
|
||||
group.attrs['absorption'] = self.absorption_flag
|
||||
group.attrs['multiply_smooth'] = int(self.multiply_smooth)
|
||||
|
||||
group.create_dataset('energy', data=self.energy)
|
||||
group.create_dataset('table', data=self.table)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate probability tables from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ProbabilityTables
|
||||
Probability tables
|
||||
|
||||
"""
|
||||
interpolation = group.attrs['interpolation']
|
||||
inelastic_flag = group.attrs['inelastic']
|
||||
absorption_flag = group.attrs['absorption']
|
||||
multiply_smooth = bool(group.attrs['multiply_smooth'])
|
||||
|
||||
energy = group['energy'].value
|
||||
table = group['table'].value
|
||||
|
||||
return cls(energy, table, interpolation, inelastic_flag,
|
||||
absorption_flag, multiply_smooth)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace):
|
||||
"""Generate probability tables from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ProbabilityTables
|
||||
Unresolved resonance region probability tables
|
||||
|
||||
"""
|
||||
# Check if URR probability tables are present
|
||||
idx = ace.jxs[23]
|
||||
if idx == 0:
|
||||
return None
|
||||
|
||||
N = int(ace.xss[idx]) # Number of incident energies
|
||||
M = int(ace.xss[idx+1]) # Length of probability table
|
||||
interpolation = int(ace.xss[idx+2])
|
||||
inelastic_flag = int(ace.xss[idx+3])
|
||||
absorption_flag = int(ace.xss[idx+4])
|
||||
multiply_smooth = (int(ace.xss[idx+5]) == 1)
|
||||
idx += 6
|
||||
|
||||
# Get energies at which tables exist
|
||||
energy = ace.xss[idx : idx+N]
|
||||
idx += N
|
||||
|
||||
# Get probability tables
|
||||
table = ace.xss[idx : idx+N*6*M]
|
||||
table.shape = (N, 6, M)
|
||||
|
||||
return cls(energy, table, interpolation, inelastic_flag,
|
||||
absorption_flag, multiply_smooth)
|
||||
|
|
@ -1,13 +1,15 @@
|
|||
import re
|
||||
import sys
|
||||
|
||||
import openmc
|
||||
from openmc.checkvalue import check_type, check_length
|
||||
from openmc.data import natural_abundance
|
||||
from openmc.data import NATURAL_ABUNDANCE
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
|
||||
|
||||
class Element(object):
|
||||
"""A natural element used in a material via <element>. Internally, OpenMC will
|
||||
expand the natural element into isotopes based on the known natural
|
||||
|
|
@ -123,8 +125,8 @@ class Element(object):
|
|||
"""
|
||||
|
||||
isotopes = []
|
||||
for isotope, abundance in sorted(natural_abundance.items()):
|
||||
if isotope.startswith(self.name + '-'):
|
||||
for isotope, abundance in sorted(NATURAL_ABUNDANCE.items()):
|
||||
if re.match(r'{}\d+'.format(self.name), isotope):
|
||||
nuc = openmc.Nuclide(isotope, self.xs)
|
||||
isotopes.append((nuc, abundance))
|
||||
return isotopes
|
||||
|
|
|
|||
|
|
@ -625,7 +625,7 @@ class Library(object):
|
|||
in the report. Defaults to 'all'.
|
||||
nuclides : {'all', 'sum'}
|
||||
The nuclides of the cross-sections to include in the report. This
|
||||
may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
|
||||
may be a list of nuclide name strings (e.g., ['U235', 'U238']).
|
||||
The special string 'all' will report the cross sections for all
|
||||
nuclides in the spatial domain. The special string 'sum' will report
|
||||
the cross sections summed over all nuclides. Defaults to 'all'.
|
||||
|
|
@ -758,7 +758,7 @@ class Library(object):
|
|||
xsdata_name : str
|
||||
Name to apply to the "xsdata" entry produced by this method
|
||||
nuclide : str
|
||||
A nuclide name string (e.g., 'U-235'). Defaults to 'total' to
|
||||
A nuclide name string (e.g., 'U235'). Defaults to 'total' to
|
||||
obtain a material-wise macroscopic cross section.
|
||||
xs_type: {'macro', 'micro'}
|
||||
Provide the macro or micro cross section in units of cm^-1 or
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ class MGXS(object):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -514,7 +514,7 @@ class MGXS(object):
|
|||
-------
|
||||
list of str
|
||||
A list of the string names for each nuclide in the spatial domain
|
||||
(e.g., ['U-235', 'U-238', 'O-16'])
|
||||
(e.g., ['U235', 'U238', 'O16'])
|
||||
|
||||
Raises
|
||||
------
|
||||
|
|
@ -542,7 +542,7 @@ class MGXS(object):
|
|||
Parameters
|
||||
----------
|
||||
nuclide : str
|
||||
A nuclide name string (e.g., 'U-235')
|
||||
A nuclide name string (e.g., 'U235')
|
||||
|
||||
Returns
|
||||
-------
|
||||
|
|
@ -577,7 +577,7 @@ class MGXS(object):
|
|||
Parameters
|
||||
----------
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
A list of nuclide name strings (e.g., ['U-235', 'U-238']). The
|
||||
A list of nuclide name strings (e.g., ['U235', 'U238']). The
|
||||
special string 'all' will return the atom densities for all nuclides
|
||||
in the spatial domain. The special string 'sum' will return the atom
|
||||
density summed across all nuclides in the spatial domain. Defaults
|
||||
|
|
@ -742,7 +742,7 @@ class MGXS(object):
|
|||
subdomains : Iterable of Integral or 'all'
|
||||
Subdomain IDs of interest. Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
A list of nuclide name strings (e.g., ['U-235', 'U-238']). The
|
||||
A list of nuclide name strings (e.g., ['U235', 'U238']). The
|
||||
special string 'all' will return the cross sections for all nuclides
|
||||
in the spatial domain. The special string 'sum' will return the
|
||||
cross section summed over all nuclides. Defaults to 'all'.
|
||||
|
|
@ -980,7 +980,7 @@ class MGXS(object):
|
|||
----------
|
||||
nuclides : list of str
|
||||
A list of nuclide name strings
|
||||
(e.g., ['U-235', 'U-238']; default is [])
|
||||
(e.g., ['U235', 'U238']; default is [])
|
||||
groups : list of int
|
||||
A list of energy group indices starting at 1 for the high energies
|
||||
(e.g., [1, 2, 3]; default is [])
|
||||
|
|
@ -1137,7 +1137,7 @@ class MGXS(object):
|
|||
Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
The nuclides of the cross-sections to include in the report. This
|
||||
may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
|
||||
may be a list of nuclide name strings (e.g., ['U235', 'U238']).
|
||||
The special string 'all' will report the cross sections for all
|
||||
nuclides in the spatial domain. The special string 'sum' will report
|
||||
the cross sections summed over all nuclides. Defaults to 'all'.
|
||||
|
|
@ -1243,7 +1243,7 @@ class MGXS(object):
|
|||
Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
The nuclides of the cross-sections to include in the report. This
|
||||
may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
|
||||
may be a list of nuclide name strings (e.g., ['U235', 'U238']).
|
||||
The special string 'all' will report the cross sections for all
|
||||
nuclides in the spatial domain. The special string 'sum' will report
|
||||
the cross sections summed over all nuclides. Defaults to 'all'.
|
||||
|
|
@ -1441,7 +1441,7 @@ class MGXS(object):
|
|||
Energy groups of interest. Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
The nuclides of the cross-sections to include in the dataframe. This
|
||||
may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
|
||||
may be a list of nuclide name strings (e.g., ['U235', 'U238']).
|
||||
The special string 'all' will include the cross sections for all
|
||||
nuclides in the spatial domain. The special string 'sum' will
|
||||
include the cross sections summed over all nuclides. Defaults
|
||||
|
|
@ -1659,7 +1659,7 @@ class MatrixMGXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -1708,7 +1708,7 @@ class MatrixMGXS(MGXS):
|
|||
subdomains : Iterable of Integral or 'all'
|
||||
Subdomain IDs of interest. Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
A list of nuclide name strings (e.g., ['U-235', 'U-238']). The
|
||||
A list of nuclide name strings (e.g., ['U235', 'U238']). The
|
||||
special string 'all' will return the cross sections for all
|
||||
nuclides in the spatial domain. The special string 'sum' will
|
||||
return the cross section summed over all nuclides. Defaults to
|
||||
|
|
@ -1846,7 +1846,7 @@ class MatrixMGXS(MGXS):
|
|||
----------
|
||||
nuclides : list of str
|
||||
A list of nuclide name strings
|
||||
(e.g., ['U-235', 'U-238']; default is [])
|
||||
(e.g., ['U235', 'U238']; default is [])
|
||||
in_groups : list of int
|
||||
A list of incoming energy group indices starting at 1 for the high
|
||||
energies (e.g., [1, 2, 3]; default is [])
|
||||
|
|
@ -1896,7 +1896,7 @@ class MatrixMGXS(MGXS):
|
|||
Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
The nuclides of the cross-sections to include in the report. This
|
||||
may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
|
||||
may be a list of nuclide name strings (e.g., ['U235', 'U238']).
|
||||
The special string 'all' will report the cross sections for all
|
||||
nuclides in the spatial domain. The special string 'sum' will
|
||||
report the cross sections summed over all nuclides. Defaults to
|
||||
|
|
@ -2082,7 +2082,7 @@ class TotalXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -2200,7 +2200,7 @@ class TransportXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -2330,7 +2330,7 @@ class NuTransportXS(TransportXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -2451,7 +2451,7 @@ class AbsorptionXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -2567,7 +2567,7 @@ class CaptureXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -2689,7 +2689,7 @@ class FissionXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -2800,7 +2800,7 @@ class NuFissionXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -2916,7 +2916,7 @@ class KappaFissionXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -3029,7 +3029,7 @@ class ScatterXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -3144,7 +3144,7 @@ class NuScatterXS(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -3278,7 +3278,7 @@ class ScatterMatrixXS(MatrixMGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -3441,7 +3441,7 @@ class ScatterMatrixXS(MatrixMGXS):
|
|||
----------
|
||||
nuclides : list of str
|
||||
A list of nuclide name strings
|
||||
(e.g., ['U-235', 'U-238']; default is [])
|
||||
(e.g., ['U235', 'U238']; default is [])
|
||||
in_groups : list of int
|
||||
A list of incoming energy group indices starting at 1 for the high
|
||||
energies (e.g., [1, 2, 3]; default is [])
|
||||
|
|
@ -3523,7 +3523,7 @@ class ScatterMatrixXS(MatrixMGXS):
|
|||
subdomains : Iterable of Integral or 'all'
|
||||
Subdomain IDs of interest. Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
A list of nuclide name strings (e.g., ['U-235', 'U-238']). The
|
||||
A list of nuclide name strings (e.g., ['U235', 'U238']). The
|
||||
special string 'all' will return the cross sections for all nuclides
|
||||
in the spatial domain. The special string 'sum' will return the
|
||||
cross section summed over all nuclides. Defaults to 'all'.
|
||||
|
|
@ -3670,7 +3670,7 @@ class ScatterMatrixXS(MatrixMGXS):
|
|||
Energy groups of interest. Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
The nuclides of the cross-sections to include in the dataframe. This
|
||||
may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
|
||||
may be a list of nuclide name strings (e.g., ['U235', 'U238']).
|
||||
The special string 'all' will include the cross sections for all
|
||||
nuclides in the spatial domain. The special string 'sum' will
|
||||
include the cross sections summed over all nuclides. Defaults
|
||||
|
|
@ -3737,7 +3737,7 @@ class ScatterMatrixXS(MatrixMGXS):
|
|||
Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
The nuclides of the cross-sections to include in the report. This
|
||||
may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
|
||||
may be a list of nuclide name strings (e.g., ['U235', 'U238']).
|
||||
The special string 'all' will report the cross sections for all
|
||||
nuclides in the spatial domain. The special string 'sum' will report
|
||||
the cross sections summed over all nuclides. Defaults to 'all'.
|
||||
|
|
@ -3929,7 +3929,7 @@ class NuScatterMatrixXS(ScatterMatrixXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -4051,7 +4051,7 @@ class MultiplicityMatrixXS(MatrixMGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -4198,7 +4198,7 @@ class NuFissionMatrixXS(MatrixMGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -4313,7 +4313,7 @@ class Chi(MGXS):
|
|||
being tracked. This is unity if the by_nuclide attribute is False.
|
||||
nuclides : Iterable of str or 'sum'
|
||||
The optional user-specified nuclides for which to compute cross
|
||||
sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides
|
||||
sections (e.g., 'U238', 'O16'). If by_nuclide is True but nuclides
|
||||
are not specified by the user, all nuclides in the spatial domain
|
||||
are included. This attribute is 'sum' if by_nuclide is false.
|
||||
sparse : bool
|
||||
|
|
@ -4391,7 +4391,7 @@ class Chi(MGXS):
|
|||
----------
|
||||
nuclides : list of str
|
||||
A list of nuclide name strings
|
||||
(e.g., ['U-235', 'U-238']; default is [])
|
||||
(e.g., ['U235', 'U238']; default is [])
|
||||
groups : list of Integral
|
||||
A list of energy group indices starting at 1 for the high energies
|
||||
(e.g., [1, 2, 3]; default is [])
|
||||
|
|
@ -4502,7 +4502,7 @@ class Chi(MGXS):
|
|||
subdomains : Iterable of Integral or 'all'
|
||||
Subdomain IDs of interest. Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
A list of nuclide name strings (e.g., ['U-235', 'U-238']). The
|
||||
A list of nuclide name strings (e.g., ['U235', 'U238']). The
|
||||
special string 'all' will return the cross sections for all nuclides
|
||||
in the spatial domain. The special string 'sum' will return the
|
||||
cross section summed over all nuclides. Defaults to 'all'.
|
||||
|
|
@ -4635,7 +4635,7 @@ class Chi(MGXS):
|
|||
Energy groups of interest. Defaults to 'all'.
|
||||
nuclides : Iterable of str or 'all' or 'sum'
|
||||
The nuclides of the cross-sections to include in the dataframe. This
|
||||
may be a list of nuclide name strings (e.g., ['U-235', 'U-238']).
|
||||
may be a list of nuclide name strings (e.g., ['U235', 'U238']).
|
||||
The special string 'all' will include the cross sections for all
|
||||
nuclides in the spatial domain. The special string 'sum' will
|
||||
include the cross sections summed over all nuclides. Defaults to
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ class XSdata(object):
|
|||
alias : str
|
||||
Separate unique identifier for the xsdata object
|
||||
zaid : int
|
||||
1000*(atomic number) + mass number. As an example, the zaid of U-235
|
||||
1000*(atomic number) + mass number. As an example, the zaid of U235
|
||||
would be 92235.
|
||||
awr : float
|
||||
Atomic weight ratio of an isotope. That is, the ratio of the mass
|
||||
|
|
|
|||
|
|
@ -13,18 +13,18 @@ class Nuclide(object):
|
|||
Parameters
|
||||
----------
|
||||
name : str
|
||||
Name of the nuclide, e.g. U-235
|
||||
Name of the nuclide, e.g. U235
|
||||
xs : str
|
||||
Cross section identifier, e.g. 71c
|
||||
|
||||
Attributes
|
||||
----------
|
||||
name : str
|
||||
Name of the nuclide, e.g. U-235
|
||||
Name of the nuclide, e.g. U235
|
||||
xs : str
|
||||
Cross section identifier, e.g. 71c
|
||||
zaid : int
|
||||
1000*(atomic number) + mass number. As an example, the zaid of U-235
|
||||
1000*(atomic number) + mass number. As an example, the zaid of U235
|
||||
would be 92235.
|
||||
scattering : 'data' or 'iso-in-lab' or None
|
||||
The type of angular scattering distribution to use
|
||||
|
|
|
|||
|
|
@ -820,7 +820,7 @@ def get_opencg_lattice(openmc_lattice):
|
|||
|
||||
# Create an OpenCG Lattice to represent this OpenMC Lattice
|
||||
name = openmc_lattice.name
|
||||
dimension = openmc_lattice.dimension
|
||||
dimension = openmc_lattice.shape
|
||||
pitch = openmc_lattice.pitch
|
||||
lower_left = openmc_lattice.lower_left
|
||||
universes = openmc_lattice.universes
|
||||
|
|
|
|||
|
|
@ -1217,17 +1217,11 @@ class ResonanceScattering(object):
|
|||
@nuclide.setter
|
||||
def nuclide(self, nuc):
|
||||
check_type('nuclide', nuc, Nuclide)
|
||||
if nuc.zaid is None:
|
||||
raise ValueError("The nuclide must have an explicitly defined "
|
||||
"zaid attribute.")
|
||||
self._nuclide = nuc
|
||||
|
||||
@nuclide_0K.setter
|
||||
def nuclide_0K(self, nuc):
|
||||
check_type('nuclide_0K', nuc, Nuclide)
|
||||
if nuc.zaid is None:
|
||||
raise ValueError("The nuclide_0K must have an explicitly defined "
|
||||
"zaid attribute.")
|
||||
self._nuclide_0K = nuc
|
||||
|
||||
@method.setter
|
||||
|
|
@ -1255,10 +1249,9 @@ class ResonanceScattering(object):
|
|||
subelement = ET.SubElement(scatterer, 'method')
|
||||
subelement.text = self.method
|
||||
subelement = ET.SubElement(scatterer, 'xs_label')
|
||||
subelement.text = str(self.nuclide.zaid) + '.' + str(self.nuclide.xs)
|
||||
subelement.text = '{0.name}.{0.xs}'.format(self.nuclide)
|
||||
subelement = ET.SubElement(scatterer, 'xs_label_0K')
|
||||
subelement.text = str(self.nuclide_0K.zaid) + '.' \
|
||||
+ str(self.nuclide_0K.xs)
|
||||
subelement.text = '{0.name}.{0.xs}'.format(self.nuclide_0K)
|
||||
if self.E_min is not None:
|
||||
subelement = ET.SubElement(scatterer, 'E_min')
|
||||
subelement.text = str(self.E_min)
|
||||
|
|
|
|||
|
|
@ -4,11 +4,16 @@ from numbers import Real
|
|||
import sys
|
||||
from xml.etree import ElementTree as ET
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
_INTERPOLATION_SCHEMES = ['histogram', 'linear-linear', 'linear-log',
|
||||
'log-linear', 'log-log']
|
||||
|
||||
|
||||
class Univariate(object):
|
||||
"""Probability distribution of a single random variable.
|
||||
|
|
@ -27,6 +32,10 @@ class Univariate(object):
|
|||
def to_xml(self, element_name):
|
||||
return ''
|
||||
|
||||
@abstractmethod
|
||||
def __len__(self):
|
||||
return 0
|
||||
|
||||
|
||||
class Discrete(Univariate):
|
||||
"""Distribution characterized by a probability mass function.
|
||||
|
|
@ -56,6 +65,9 @@ class Discrete(Univariate):
|
|||
self.x = x
|
||||
self.p = p
|
||||
|
||||
def __len__(self):
|
||||
return len(self.x)
|
||||
|
||||
@property
|
||||
def x(self):
|
||||
return self._x
|
||||
|
|
@ -114,6 +126,9 @@ class Uniform(Univariate):
|
|||
self.a = a
|
||||
self.b = b
|
||||
|
||||
def __len__(self):
|
||||
return 2
|
||||
|
||||
@property
|
||||
def a(self):
|
||||
return self._a
|
||||
|
|
@ -132,6 +147,12 @@ class Uniform(Univariate):
|
|||
cv.check_type('Uniform b', b, Real)
|
||||
self._b = b
|
||||
|
||||
def to_tabular(self):
|
||||
prob = 1./(self.b - self.a)
|
||||
t = Tabular([self.a, self.b], [prob, prob], 'histogram')
|
||||
t.c = [0., 1.]
|
||||
return t
|
||||
|
||||
def to_xml(self, element_name):
|
||||
element = ET.Element(element_name)
|
||||
element.set("type", "uniform")
|
||||
|
|
@ -162,6 +183,9 @@ class Maxwell(Univariate):
|
|||
super(Maxwell, self).__init__()
|
||||
self.theta = theta
|
||||
|
||||
def __len__(self):
|
||||
return 1
|
||||
|
||||
@property
|
||||
def theta(self):
|
||||
return self._theta
|
||||
|
|
@ -207,6 +231,9 @@ class Watt(Univariate):
|
|||
self.a = a
|
||||
self.b = b
|
||||
|
||||
def __len__(self):
|
||||
return 2
|
||||
|
||||
@property
|
||||
def a(self):
|
||||
return self._a
|
||||
|
|
@ -238,8 +265,8 @@ class Tabular(Univariate):
|
|||
"""Piecewise continuous probability distribution.
|
||||
|
||||
This class is used to represent a probability distribution whose density
|
||||
function is tabulated at specific values and is either histogram or linearly
|
||||
interpolated between points.
|
||||
function is tabulated at specific values with a specified interpolation
|
||||
scheme.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
|
|
@ -247,9 +274,11 @@ class Tabular(Univariate):
|
|||
Tabulated values of the random variable
|
||||
p : Iterable of float
|
||||
Tabulated probabilities
|
||||
interpolation : {'histogram', 'linear-linear'}, optional
|
||||
interpolation : {'histogram', 'linear-linear', 'linear-log', 'log-linear', 'log-log'}, optional
|
||||
Indicate whether the density function is constant between tabulated
|
||||
points or linearly-interpolated.
|
||||
points or linearly-interpolated. Defaults to 'linear-linear'.
|
||||
ignore_negative : bool
|
||||
Ignore negative probabilities
|
||||
|
||||
Attributes
|
||||
----------
|
||||
|
|
@ -257,18 +286,23 @@ class Tabular(Univariate):
|
|||
Tabulated values of the random variable
|
||||
p : Iterable of float
|
||||
Tabulated probabilities
|
||||
interpolation : {'histogram', 'linear-linear'}, optional
|
||||
interpolation : {'histogram', 'linear-linear', 'linear-log', 'log-linear', 'log-log'}, optional
|
||||
Indicate whether the density function is constant between tabulated
|
||||
points or linearly-interpolated.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, x, p, interpolation='linear-linear'):
|
||||
def __init__(self, x, p, interpolation='linear-linear',
|
||||
ignore_negative=False):
|
||||
super(Tabular, self).__init__()
|
||||
self._ignore_negative = ignore_negative
|
||||
self.x = x
|
||||
self.p = p
|
||||
self.interpolation = interpolation
|
||||
|
||||
def __len__(self):
|
||||
return len(self.x)
|
||||
|
||||
@property
|
||||
def x(self):
|
||||
return self._x
|
||||
|
|
@ -289,14 +323,14 @@ class Tabular(Univariate):
|
|||
@p.setter
|
||||
def p(self, p):
|
||||
cv.check_type('tabulated probabilities', p, Iterable, Real)
|
||||
for pk in p:
|
||||
cv.check_greater_than('tabulated probability', pk, 0.0, True)
|
||||
if not self._ignore_negative:
|
||||
for pk in p:
|
||||
cv.check_greater_than('tabulated probability', pk, 0.0, True)
|
||||
self._p = p
|
||||
|
||||
@interpolation.setter
|
||||
def interpolation(self, interpolation):
|
||||
cv.check_value('interpolation', interpolation,
|
||||
['linear-linear', 'histogram'])
|
||||
cv.check_value('interpolation', interpolation, _INTERPOLATION_SCHEMES)
|
||||
self._interpolation = interpolation
|
||||
|
||||
def to_xml(self, element_name):
|
||||
|
|
@ -308,3 +342,103 @@ class Tabular(Univariate):
|
|||
params.text = ' '.join(map(str, self.x)) + ' ' + ' '.join(map(str, self.p))
|
||||
|
||||
return element
|
||||
|
||||
|
||||
class Legendre(Univariate):
|
||||
r"""Probability density given by a Legendre polynomial expansion
|
||||
:math:`\sum\limits_{\ell=0}^N \frac{2\ell + 1}{2} a_\ell P_\ell(\mu)`.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
coefficients : Iterable of Real
|
||||
Expansion coefficients :math:`a_\ell`. Note that the :math:`(2\ell +
|
||||
1)/2` factor should not be included.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
coefficients : Iterable of Real
|
||||
Expansion coefficients :math:`a_\ell`. Note that the :math:`(2\ell +
|
||||
1)/2` factor should not be included.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, coefficients):
|
||||
self.coefficients = coefficients
|
||||
|
||||
def __call__(self, x):
|
||||
return self._legendre_polynomial(x)
|
||||
|
||||
def __len__(self):
|
||||
return len(self._legendre_polynomial.coef)
|
||||
|
||||
@property
|
||||
def coefficients(self):
|
||||
poly = self._legendre_polynomial
|
||||
l = np.arange(poly.degree() + 1)
|
||||
return 2./(2.*l + 1.) * poly.coef
|
||||
|
||||
@coefficients.setter
|
||||
def coefficients(self, coefficients):
|
||||
cv.check_type('Legendre expansion coefficients', coefficients,
|
||||
Iterable, Real)
|
||||
for l in range(len(coefficients)):
|
||||
coefficients[l] *= (2.*l + 1.)/2.
|
||||
self._legendre_polynomial = np.polynomial.legendre.Legendre(
|
||||
coefficients)
|
||||
|
||||
def to_xml(self, element_name):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class Mixture(Univariate):
|
||||
"""Probability distribution characterized by a mixture of random variables.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
probability : Iterable of Real
|
||||
Probability of selecting a particular distribution
|
||||
distribution : Iterable of Univariate
|
||||
List of distributions with corresponding probabilities
|
||||
|
||||
Attributes
|
||||
----------
|
||||
probability : Iterable of Real
|
||||
Probability of selecting a particular distribution
|
||||
distribution : Iterable of Univariate
|
||||
List of distributions with corresponding probabilities
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, probability, distribution):
|
||||
super(Mixture, self).__init__()
|
||||
self.probability = probability
|
||||
self.distribution = distribution
|
||||
|
||||
def __len__(self):
|
||||
return sum(len(d) for d in self.distribution)
|
||||
|
||||
@property
|
||||
def probability(self):
|
||||
return self._probability
|
||||
|
||||
@property
|
||||
def distribution(self):
|
||||
return self._distribution
|
||||
|
||||
@probability.setter
|
||||
def probability(self, probability):
|
||||
cv.check_type('mixture distribution probabilities', probability,
|
||||
Iterable, Real)
|
||||
for p in probability:
|
||||
cv.check_greater_than('mixture distribution probabilities',
|
||||
p, 0.0, True)
|
||||
self._probability = probability
|
||||
|
||||
@distribution.setter
|
||||
def distribution(self, distribution):
|
||||
cv.check_type('mixture distribution components', distribution,
|
||||
Iterable, Univariate)
|
||||
self._distribution = distribution
|
||||
|
||||
def to_xml(self, element_name):
|
||||
raise NotImplementedError
|
||||
|
|
|
|||
|
|
@ -520,7 +520,7 @@ class Tally(object):
|
|||
Nuclide to add to the tally. The nuclide should be a Nuclide object
|
||||
when a user is adding nuclides to a Tally for input file generation.
|
||||
The nuclide is a str when a Tally is created from a StatePoint file
|
||||
(e.g., 'H-1', 'U-235') unless a Summary has been linked with the
|
||||
(e.g., 'H1', 'U235') unless a Summary has been linked with the
|
||||
StatePoint. The nuclide may be a CrossNuclide or AggregateNuclide
|
||||
for derived tallies created by tally arithmetic.
|
||||
|
||||
|
|
@ -1166,7 +1166,7 @@ class Tally(object):
|
|||
Parameters
|
||||
----------
|
||||
nuclide : str
|
||||
The name of the Nuclide (e.g., 'H-1', 'U-238')
|
||||
The name of the Nuclide (e.g., 'H1', 'U238')
|
||||
|
||||
Returns
|
||||
-------
|
||||
|
|
@ -1342,7 +1342,7 @@ class Tally(object):
|
|||
----------
|
||||
nuclides : list of str
|
||||
A list of nuclide name strings
|
||||
(e.g., ['U-235', 'U-238']; default is [])
|
||||
(e.g., ['U235', 'U238']; default is [])
|
||||
|
||||
Returns
|
||||
-------
|
||||
|
|
@ -1435,7 +1435,7 @@ class Tally(object):
|
|||
the filter_types parameter.
|
||||
nuclides : list of str
|
||||
A list of nuclide name strings
|
||||
(e.g., ['U-235', 'U-238']; default is [])
|
||||
(e.g., ['U235', 'U238']; default is [])
|
||||
value : str
|
||||
A string for the type of value to return - 'mean' (default),
|
||||
'std_dev', 'rel_err', 'sum', or 'sum_sq' are accepted
|
||||
|
|
@ -2887,7 +2887,7 @@ class Tally(object):
|
|||
correspond to the filter_types parameter.
|
||||
nuclides : list of str
|
||||
A list of nuclide name strings
|
||||
(e.g., ['U-235', 'U-238']; default is [])
|
||||
(e.g., ['U235', 'U238']; default is [])
|
||||
|
||||
Returns
|
||||
-------
|
||||
|
|
@ -3025,7 +3025,7 @@ class Tally(object):
|
|||
interest.
|
||||
nuclides : list of str
|
||||
A list of nuclide name strings to sum across
|
||||
(e.g., ['U-235', 'U-238']; default is [])
|
||||
(e.g., ['U235', 'U238']; default is [])
|
||||
remove_filter : bool
|
||||
If a filter is being summed over, this bool indicates whether to
|
||||
remove that filter in the returned tally. Default is False.
|
||||
|
|
@ -3173,7 +3173,7 @@ class Tally(object):
|
|||
interest.
|
||||
nuclides : list of str
|
||||
A list of nuclide name strings to average across
|
||||
(e.g., ['U-235', 'U-238']; default is [])
|
||||
(e.g., ['U235', 'U238']; default is [])
|
||||
remove_filter : bool
|
||||
If a filter is being averaged over, this bool indicates whether to
|
||||
remove that filter in the returned tally. Default is False.
|
||||
|
|
|
|||
12
readme.rst
12
readme.rst
|
|
@ -10,9 +10,9 @@ transport code based on modern methods. It is a constructive solid geometry,
|
|||
continuous-energy transport code that uses ACE format cross sections. The
|
||||
project started under the Computational Reactor Physics Group at MIT.
|
||||
|
||||
Complete documentation on the usage of OpenMC is hosted on GitHub at
|
||||
http://mit-crpg.github.io/openmc/. If you are interested in the project or would
|
||||
like to help and contribute, please send a message to the OpenMC User's Group
|
||||
Complete documentation on the usage of OpenMC is hosted on Read the Docs at
|
||||
http://openmc.readthedocs.io. If you are interested in the project or would like
|
||||
to help and contribute, please send a message to the OpenMC User's Group
|
||||
`mailing list`_.
|
||||
|
||||
------------
|
||||
|
|
@ -49,7 +49,7 @@ License
|
|||
OpenMC is distributed under the MIT/X license_.
|
||||
|
||||
.. _mailing list: https://groups.google.com/forum/?fromgroups=#!forum/openmc-users
|
||||
.. _installation instructions: http://mit-crpg.github.io/openmc/usersguide/install.html
|
||||
.. _Troubleshooting section: http://mit-crpg.github.io/openmc/usersguide/troubleshoot.html
|
||||
.. _installation instructions: http://openmc.readthedocs.io/en/latest/usersguide/install.html
|
||||
.. _Troubleshooting section: http://openmc.readthedocs.io/en/latest/usersguide/troubleshoot.html
|
||||
.. _Issues: https://github.com/mit-crpg/openmc/issues
|
||||
.. _license: http://mit-crpg.github.io/openmc/license.html
|
||||
.. _license: http://openmc.readthedocs.io/en/latest/license.html
|
||||
|
|
|
|||
139
scripts/openmc-ace-to-hdf5
Executable file
139
scripts/openmc-ace-to-hdf5
Executable file
|
|
@ -0,0 +1,139 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import xml.etree.ElementTree as ET
|
||||
import warnings
|
||||
|
||||
import openmc.data
|
||||
|
||||
description = """
|
||||
This script can be used to create HDF5 nuclear data libraries used by
|
||||
OpenMC. There are four different ways you can specify ACE libraries that are to
|
||||
be converted:
|
||||
|
||||
1. List each ACE library as a positional argument. This is very useful in
|
||||
conjunction with the usual shell utilities (ls, find, etc.).
|
||||
2. Use the --xml option to specify a pre-v0.9 cross_sections.xml file.
|
||||
3. Use the --xsdir option to specify a MCNP xsdir file.
|
||||
4. Use the --xsdata option to specify a Serpent xsdata file.
|
||||
|
||||
The script does not use any extra information from cross_sections.xml/ xsdir/
|
||||
xsdata files to determine whether the nuclide is metastable. Instead, the
|
||||
--metastable argument can be used to specify whether the ZAID naming convention
|
||||
follows the NNDC data convention (1000*Z + A + 300 + 100*m), or the MCNP data
|
||||
convention (essentially the same as NNDC, except that the first metastable state
|
||||
of Am242 is 95242 and the ground state is 95642).
|
||||
|
||||
"""
|
||||
|
||||
class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter,
|
||||
argparse.RawDescriptionHelpFormatter):
|
||||
pass
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description=description,
|
||||
formatter_class=CustomFormatter
|
||||
)
|
||||
parser.add_argument('libraries', nargs='*',
|
||||
help='ACE libraries to convert to HDF5')
|
||||
parser.add_argument('-d', '--destination', default='.',
|
||||
help='Directory to create new library in')
|
||||
parser.add_argument('-m', '--metastable', choices=['mcnp', 'nndc'], default='nndc',
|
||||
help='How to interpret ZAIDs for metastable nuclides')
|
||||
parser.add_argument('--xml', help='Old-style cross_sections.xml that '
|
||||
'lists ACE libraries')
|
||||
parser.add_argument('--xsdir', help='MCNP xsdir file that lists '
|
||||
'ACE libraries')
|
||||
parser.add_argument('--xsdata', help='Serpent xsdata file that lists '
|
||||
'ACE libraries')
|
||||
args = parser.parse_args()
|
||||
|
||||
if not os.path.isdir(args.destination):
|
||||
os.mkdir(args.destination)
|
||||
|
||||
# If the --xml argument was given, get the list of ACE libraries directory from
|
||||
# <ace_table> elements within the specified cross_sections.xml file
|
||||
ace_libraries = []
|
||||
if args.xml is not None:
|
||||
tree = ET.parse(args.xml)
|
||||
root = tree.getroot()
|
||||
if root.find('directory') is not None:
|
||||
directory = root.find('directory').text
|
||||
else:
|
||||
directory = os.path.dirname(args.xml)
|
||||
|
||||
for ace_table in root.findall('ace_table'):
|
||||
ace_libraries.append(os.path.join(directory, ace_table.attrib['path']))
|
||||
|
||||
elif args.xsdir is not None:
|
||||
# Find 'directory' section
|
||||
lines = open(args.xsdir, 'r').readlines()
|
||||
for index, line in enumerate(lines):
|
||||
if line.strip().lower() == 'directory':
|
||||
break
|
||||
else:
|
||||
raise IOError("Could not find 'directory' section in MCNP xsdir file")
|
||||
|
||||
# Create list of ACE libraries
|
||||
for line in lines[index + 1:]:
|
||||
words = line.split()
|
||||
if len(words) < 3:
|
||||
continue
|
||||
|
||||
path = os.path.join(os.path.dirname(args.xsdir), words[2])
|
||||
if path not in ace_libraries:
|
||||
ace_libraries.append(path)
|
||||
|
||||
elif args.xsdata is not None:
|
||||
with open(args.xsdata, 'r') as xsdata:
|
||||
for line in xsdata:
|
||||
words = line.split()
|
||||
if len(words) >= 9:
|
||||
path = os.path.join(os.path.dirname(args.xsdata, words[8]))
|
||||
if path not in ace_libraries:
|
||||
ace_libraries.append(path)
|
||||
|
||||
else:
|
||||
ace_libraries = args.libraries
|
||||
|
||||
library = openmc.data.DataLibrary()
|
||||
|
||||
for filename in ace_libraries:
|
||||
# Check that ACE library exists
|
||||
if not os.path.exists(filename):
|
||||
warnings.warn("ACE library '{}' does not exist.".format(filename))
|
||||
continue
|
||||
|
||||
lib = openmc.data.ace.Library(filename)
|
||||
for table in lib.tables:
|
||||
if table.name.endswith('c'):
|
||||
# Continuous-energy neutron data
|
||||
neutron = openmc.data.IncidentNeutron.from_ace(
|
||||
table, args.metastable)
|
||||
print(neutron.name)
|
||||
|
||||
# Determine filename
|
||||
outfile = os.path.join(args.destination,
|
||||
neutron.name.replace('.', '_') + '.h5')
|
||||
neutron.export_to_hdf5(outfile)
|
||||
|
||||
# Register with library
|
||||
library.register_file(outfile)
|
||||
|
||||
elif table.name.endswith('t'):
|
||||
# Thermal scattering data
|
||||
thermal = openmc.data.ThermalScattering.from_ace(table)
|
||||
print(thermal.name)
|
||||
|
||||
# Determine filename
|
||||
outfile = os.path.join(args.destination,
|
||||
thermal.name.replace('.', '_') + '.h5')
|
||||
thermal.export_to_hdf5(outfile)
|
||||
|
||||
# Register with library
|
||||
library.register_file(outfile, 'thermal')
|
||||
|
||||
# Write cross_sections.xml
|
||||
libpath = os.path.join(args.destination, 'cross_sections.xml')
|
||||
library.export_to_xml(libpath)
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from openmc.ace import ascii_to_binary
|
||||
import sys
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Check for proper number of arguments
|
||||
if len(sys.argv) < 3:
|
||||
sys.exit('Usage: {0} ascii_file binary_file'.format(sys.argv[0]))
|
||||
|
||||
# Convert ASCII file
|
||||
ascii_to_binary(sys.argv[1], sys.argv[2])
|
||||
|
|
@ -22,11 +22,14 @@ optional arguments:
|
|||
from __future__ import print_function
|
||||
|
||||
import argparse
|
||||
from difflib import get_close_matches
|
||||
from itertools import chain
|
||||
from random import randint
|
||||
from shutil import move
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import openmc.data
|
||||
from openmc.data.thermal import _THERMAL_NAMES
|
||||
|
||||
description = "Update OpenMC's input XML files to the latest format."
|
||||
epilog = """\
|
||||
|
|
@ -40,6 +43,11 @@ geometry.xml: Lattices containing 'outside' attributes/tags will be replaced
|
|||
with lattices containing 'outer' attributes, and the appropriate
|
||||
cells/universes will be added. Any 'surfaces' attributes/elements on a cell
|
||||
will be renamed 'region'.
|
||||
|
||||
materials.xml: Nuclide names will be changed from ACE aliases (e.g., Am-242m) to
|
||||
HDF5/GND names (e.g., Am242_m1). Thermal scattering table names will be
|
||||
changed from ACE aliases (e.g., HH2O) to HDF5/GND names (e.g., c_H_in_H2O).
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
|
@ -245,6 +253,62 @@ def update_geometry(geometry_root):
|
|||
|
||||
return was_updated
|
||||
|
||||
def get_thermal_name(name):
|
||||
"""Get proper S(a,b) table name, e.g. 'HH2O' -> 'c_H_in_H2O'"""
|
||||
if name.lower() in _THERMAL_NAMES:
|
||||
return _THERMAL_NAMES[name.lower()]
|
||||
else:
|
||||
# Make an educated guess?? This actually works well for
|
||||
# JEFF-3.2 which stupidly uses names like lw00.32t,
|
||||
# lw01.32t, etc. for different temperatures
|
||||
matches = get_close_matches(
|
||||
name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5)
|
||||
if len(matches) > 0:
|
||||
return _THERMAL_NAMES[matches[0]] + '.' + xs
|
||||
else:
|
||||
# OK, we give up. Just use the ACE name.
|
||||
return 'c_' + name
|
||||
return name
|
||||
|
||||
def update_materials(root):
|
||||
"""Update the given XML materials tree. Return True if changes were made."""
|
||||
was_updated = False
|
||||
|
||||
for material in root.findall('material'):
|
||||
for nuclide in material.findall('nuclide'):
|
||||
if 'name' in nuclide.attrib:
|
||||
nucname = nuclide.attrib['name']
|
||||
nucname = nucname.replace('-', '')
|
||||
nucname = nucname.replace('Nat', '0')
|
||||
if nucname.endswith('m'):
|
||||
nucname = nucname[:-1] + '_m1'
|
||||
nuclide.set('name', nucname)
|
||||
was_updated = True
|
||||
|
||||
elif nuclide.find('name') is not None:
|
||||
name_elem = nuclide.find('name')
|
||||
nucname = name_elem.text
|
||||
nucname = nucname.replace('-', '')
|
||||
nucname = nucname.replace('Nat', '0')
|
||||
if nucname.endswith('m'):
|
||||
nucname = nucname[:-1] + '_m1'
|
||||
name_elem.text = nucname
|
||||
was_updated = True
|
||||
|
||||
for sab in material.findall('sab'):
|
||||
if 'name' in sab.attrib:
|
||||
sabname = sab.attrib['name']
|
||||
sab.set('name', get_thermal_name(sabname))
|
||||
was_updated = True
|
||||
|
||||
elif sab.find('name') is not None:
|
||||
name_elem = sab.find('name')
|
||||
sabname = name_elem.text
|
||||
name_elem.text = get_thermal(sabname)
|
||||
was_updated = True
|
||||
|
||||
return was_updated
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = parse_args()
|
||||
|
|
@ -256,6 +320,8 @@ if __name__ == '__main__':
|
|||
|
||||
if root.tag == 'geometry':
|
||||
was_updated = update_geometry(root)
|
||||
elif root.tag == 'materials':
|
||||
was_updated = update_materials(root)
|
||||
|
||||
if was_updated:
|
||||
# Move the original geometry file to preserve it.
|
||||
|
|
|
|||
|
|
@ -1,148 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import sys
|
||||
from xml.dom.minidom import getDOMImplementation
|
||||
|
||||
types = {1: "neutron", 2: "dosimetry", 3: "thermal"}
|
||||
|
||||
|
||||
class Xsdata(object):
|
||||
|
||||
def __init__(self, filename):
|
||||
self._table_dict = {}
|
||||
self.tables = []
|
||||
|
||||
for line in open(filename, 'r'):
|
||||
words = line.split()
|
||||
|
||||
# If this listing is just an alias listing, only assign the alias
|
||||
# attribute
|
||||
name = words[1]
|
||||
alias = words[0]
|
||||
table = self.find_table(name)
|
||||
if table:
|
||||
if name not in table.alias:
|
||||
table.alias.append(alias)
|
||||
continue
|
||||
|
||||
table = XsdataTable()
|
||||
table.name = name
|
||||
table.type = types[int(words[2])]
|
||||
table.zaid = int(words[3])
|
||||
table.metastable = int(words[4])
|
||||
table.awr = float(words[5])
|
||||
table.temperature = 8.6173423e-11 * float(words[6])
|
||||
table.binary = int(words[7])
|
||||
table.path = words[8]
|
||||
|
||||
self.tables.append(table)
|
||||
self._table_dict[name] = table
|
||||
|
||||
# Check for common directory
|
||||
self.directory = os.path.dirname(self.tables[0].path)
|
||||
for table in self.tables:
|
||||
if not table.path.startswith(self.directory):
|
||||
self.directory = None
|
||||
break
|
||||
|
||||
def to_xml(self):
|
||||
# Create XML document
|
||||
impl = getDOMImplementation()
|
||||
doc = impl.createDocument(None, "cross_sections", None)
|
||||
|
||||
# Get root element
|
||||
root = doc.documentElement
|
||||
|
||||
# Add a directory node
|
||||
if self.directory:
|
||||
directoryNode = doc.createElement("directory")
|
||||
text = doc.createTextNode(self.directory)
|
||||
directoryNode.appendChild(text)
|
||||
root.appendChild(directoryNode)
|
||||
|
||||
for table in self.tables:
|
||||
table.path = os.path.basename(table.path)
|
||||
|
||||
# Add a node for each table
|
||||
for table in self.tables:
|
||||
node = table.to_xml_node(doc)
|
||||
root.appendChild(node)
|
||||
|
||||
return doc
|
||||
|
||||
def find_table(self, name):
|
||||
if name in self._table_dict:
|
||||
return self._table_dict[name]
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
class XsdataTable(object):
|
||||
|
||||
def __init__(self):
|
||||
self.alias = []
|
||||
|
||||
def to_xml_node(self, doc):
|
||||
node = doc.createElement("ace_table")
|
||||
node.setAttribute("name", self.name)
|
||||
for attribute in ["alias", "zaid", "type", "metastable",
|
||||
"awr", "temperature", "binary", "path"]:
|
||||
if hasattr(self, attribute):
|
||||
# Join string for alias attribute
|
||||
if attribute == "alias":
|
||||
if not self.alias:
|
||||
continue
|
||||
string = " ".join(self.alias)
|
||||
else:
|
||||
string = "{0}".format(getattr(self, attribute))
|
||||
|
||||
# Skip metastable and binary if 0
|
||||
if attribute == "metastable" and self.metastable == 0:
|
||||
continue
|
||||
if attribute == "binary" and self.binary == 0:
|
||||
continue
|
||||
|
||||
# Create attribute node
|
||||
# nodeAttr = doc.createElement(attribute)
|
||||
# text = doc.createTextNode(string)
|
||||
# nodeAttr.appendChild(text)
|
||||
# node.appendChild(nodeAttr)
|
||||
node.setAttribute(attribute, string)
|
||||
return node
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Read command line arguments
|
||||
if len(sys.argv) < 3:
|
||||
sys.exit("Usage: convert_xsdata.py xsdataFile xmlFile")
|
||||
xsdataFile = sys.argv[1]
|
||||
xmlFile = sys.argv[2]
|
||||
|
||||
# Read xsdata and create XML document object
|
||||
xsdataObject = Xsdata(xsdataFile)
|
||||
doc = xsdataObject.to_xml()
|
||||
|
||||
# Reduce number of lines
|
||||
lines = doc.toprettyxml(indent=' ')
|
||||
lines = lines.replace('<alias>\n ', '<alias>')
|
||||
lines = lines.replace('\n </alias>', '</alias>')
|
||||
lines = lines.replace('<zaid>\n ', '<zaid>')
|
||||
lines = lines.replace('\n </zaid>', '</zaid>')
|
||||
lines = lines.replace('<type>\n ', '<type>')
|
||||
lines = lines.replace('\n </type>', '</type>')
|
||||
lines = lines.replace('<awr>\n ', '<awr>')
|
||||
lines = lines.replace('\n </awr>', '</awr>')
|
||||
lines = lines.replace('<temperature>\n ', '<temperature>')
|
||||
lines = lines.replace('\n </temperature>', '</temperature>')
|
||||
lines = lines.replace('<path>\n ', '<path>')
|
||||
lines = lines.replace('\n </path>', '</path>')
|
||||
lines = lines.replace('<metastable>\n ', '<metastable>')
|
||||
lines = lines.replace('\n </metastable>', '</metastable>')
|
||||
lines = lines.replace('<binary>\n ', '<binary>')
|
||||
lines = lines.replace('\n </binary>', '</binary>')
|
||||
|
||||
# Write document in pretty XML to specified file
|
||||
f = open(xmlFile, 'w')
|
||||
f.write(lines)
|
||||
f.close()
|
||||
|
|
@ -1,288 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import sys
|
||||
from xml.dom.minidom import getDOMImplementation
|
||||
|
||||
elements = [None, "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na",
|
||||
"Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V",
|
||||
"Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se",
|
||||
"Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh",
|
||||
"Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba",
|
||||
"La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho",
|
||||
"Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt",
|
||||
"Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac",
|
||||
"Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm",
|
||||
"Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg",
|
||||
"Cn"]
|
||||
|
||||
|
||||
class Xsdir(object):
|
||||
|
||||
def __init__(self, filename):
|
||||
self.f = open(filename, 'r')
|
||||
self.filename = os.path.abspath(filename)
|
||||
self.directory = os.path.dirname(filename)
|
||||
self.awr = {}
|
||||
self.tables = []
|
||||
|
||||
self.filetype = set()
|
||||
self.recordlength = set()
|
||||
self.entries = set()
|
||||
|
||||
# Read first section (DATAPATH)
|
||||
line = self.f.readline()
|
||||
words = line.split()
|
||||
if words:
|
||||
if words[0].lower().startswith('datapath'):
|
||||
if '=' in words[0]:
|
||||
index = line.index('=')
|
||||
self.datapath = line[index+1:].strip()
|
||||
else:
|
||||
if len(line.strip()) > 8:
|
||||
self.datapath = line[8:].strip()
|
||||
else:
|
||||
self.f.seek(0)
|
||||
|
||||
# Read second section
|
||||
line = self.f.readline()
|
||||
words = line.split()
|
||||
assert len(words) == 3
|
||||
assert words[0].lower() == 'atomic'
|
||||
assert words[1].lower() == 'weight'
|
||||
assert words[2].lower() == 'ratios'
|
||||
|
||||
while True:
|
||||
line = self.f.readline()
|
||||
words = line.split()
|
||||
|
||||
# Check for end of second section
|
||||
if len(words) % 2 != 0 or words[0] == 'directory':
|
||||
break
|
||||
|
||||
for zaid, awr in zip(words[::2], words[1::2]):
|
||||
self.awr[zaid] = awr
|
||||
|
||||
# Read third section
|
||||
while words[0] != 'directory':
|
||||
words = self.f.readline().split()
|
||||
|
||||
while True:
|
||||
words = self.f.readline().split()
|
||||
if not words:
|
||||
break
|
||||
|
||||
# Handle continuation lines
|
||||
while words[-1] == '+':
|
||||
extraWords = self.f.readline().split()
|
||||
words = words[:-1] + extraWords
|
||||
assert len(words) >= 7
|
||||
|
||||
# Create XsdirTable object and add to line
|
||||
table = XsdirTable(self.directory)
|
||||
self.tables.append(table)
|
||||
|
||||
# All tables have at least 7 attributes
|
||||
table.name = words[0]
|
||||
table.awr = float(words[1])
|
||||
table.filename = words[2]
|
||||
table.access = words[3]
|
||||
table.filetype = int(words[4])
|
||||
table.location = int(words[5])
|
||||
table.length = int(words[6])
|
||||
|
||||
self.filetype.add(table.filetype)
|
||||
|
||||
if len(words) > 7:
|
||||
table.recordlength = int(words[7])
|
||||
self.recordlength.add(table.recordlength)
|
||||
if len(words) > 8:
|
||||
table.entries = int(words[8])
|
||||
self.entries.add(table.entries)
|
||||
if len(words) > 9:
|
||||
table.temperature = float(words[9])
|
||||
if len(words) > 10:
|
||||
table.ptable = (words[10] == 'ptable')
|
||||
|
||||
if len(self.filetype) == 1:
|
||||
if 1 in self.filetype:
|
||||
self.filetype = 'ascii'
|
||||
elif 2 in self.filetype:
|
||||
self.filetype = 'binary'
|
||||
else:
|
||||
self.filetype = None
|
||||
|
||||
if len(self.recordlength) == 1:
|
||||
self.recordlength = list(self.recordlength)[0]
|
||||
else:
|
||||
self.recordlength = None
|
||||
if len(self.entries) == 1:
|
||||
self.entries = list(self.entries)[0]
|
||||
else:
|
||||
self.recordlength = None
|
||||
|
||||
def to_xml(self):
|
||||
# Create XML document
|
||||
impl = getDOMImplementation()
|
||||
doc = impl.createDocument(None, "cross_sections", None)
|
||||
|
||||
# Get root element
|
||||
root = doc.documentElement
|
||||
|
||||
# Add a directory node
|
||||
if self.directory:
|
||||
directoryNode = doc.createElement("directory")
|
||||
text = doc.createTextNode(self.directory)
|
||||
directoryNode.appendChild(text)
|
||||
root.appendChild(directoryNode)
|
||||
|
||||
for table in self.tables:
|
||||
table.path = os.path.basename(table.path)
|
||||
|
||||
# Add filetype, record_length and entries nodes
|
||||
if self.filetype:
|
||||
node = doc.createElement("filetype")
|
||||
text = doc.createTextNode(self.filetype)
|
||||
node.appendChild(text)
|
||||
root.appendChild(node)
|
||||
if self.recordlength:
|
||||
node = doc.createElement("record_length")
|
||||
text = doc.createTextNode(str(self.recordlength))
|
||||
node.appendChild(text)
|
||||
root.appendChild(node)
|
||||
if self.entries:
|
||||
node = doc.createElement("entries")
|
||||
text = doc.createTextNode(str(self.entries))
|
||||
node.appendChild(text)
|
||||
root.appendChild(node)
|
||||
|
||||
# Add a node for each table
|
||||
for table in self.tables:
|
||||
if table.name[-1] in ['e', 'p', 'u', 'h', 'g', 'm', 'd']:
|
||||
continue
|
||||
node = table.to_xml_node(doc)
|
||||
root.appendChild(node)
|
||||
|
||||
return doc
|
||||
|
||||
|
||||
class XsdirTable(object):
|
||||
|
||||
def __init__(self, directory=None):
|
||||
self.directory = None
|
||||
self.name = None
|
||||
self.awr = None
|
||||
self.filename = None
|
||||
self.access = None
|
||||
self.filetype = None
|
||||
self.location = None
|
||||
self.length = None
|
||||
self.recordlength = None
|
||||
self.entries = None
|
||||
self.temperature = None
|
||||
self.ptable = False
|
||||
|
||||
@property
|
||||
def path(self):
|
||||
if self.directory:
|
||||
return os.path.join(self.directory, self.filename)
|
||||
else:
|
||||
return self.filename
|
||||
|
||||
@path.setter
|
||||
def path(self, value):
|
||||
self.diretory = ''
|
||||
self.filename = value
|
||||
|
||||
@property
|
||||
def metastable(self):
|
||||
# Only valid for neutron cross-sections
|
||||
if not self.name.endswith('c'):
|
||||
return
|
||||
|
||||
# Handle special case of Am-242 and Am-242m
|
||||
if self.zaid == '95242':
|
||||
return 1
|
||||
elif self.zaid == '95642':
|
||||
return 0
|
||||
|
||||
# All other cases
|
||||
A = int(self.zaid) % 1000
|
||||
if A > 300:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
@property
|
||||
def alias(self):
|
||||
zaid = self.zaid
|
||||
if zaid:
|
||||
Z = int(zaid[:-3])
|
||||
A = zaid[-3:]
|
||||
|
||||
if A == '000':
|
||||
s = 'Nat'
|
||||
elif zaid == '95242':
|
||||
s = '242m'
|
||||
elif zaid == '95642':
|
||||
s = '242'
|
||||
elif int(A) > 300:
|
||||
s = str(int(A) - 400) + "m"
|
||||
else:
|
||||
s = str(int(A))
|
||||
|
||||
return "{0}-{1}.{2}".format(elements[Z], s, self.xs)
|
||||
else:
|
||||
return None
|
||||
|
||||
@property
|
||||
def zaid(self):
|
||||
if self.name.endswith('c'):
|
||||
return self.name[:self.name.find('.')]
|
||||
else:
|
||||
return 0
|
||||
|
||||
@property
|
||||
def xs(self):
|
||||
return self.name[self.name.find('.')+1:]
|
||||
|
||||
def to_xml_node(self, doc):
|
||||
node = doc.createElement("ace_table")
|
||||
node.setAttribute("name", self.name)
|
||||
for attribute in ["alias", "zaid", "type", "metastable", "awr",
|
||||
"temperature", "path", "location"]:
|
||||
if hasattr(self, attribute):
|
||||
string = str(getattr(self, attribute))
|
||||
|
||||
# Skip metastable and binary if 0
|
||||
if attribute == "metastable" and self.metastable == 0:
|
||||
continue
|
||||
|
||||
# Skip any attribute that is none
|
||||
if getattr(self, attribute) is None:
|
||||
continue
|
||||
|
||||
# Create attribute node
|
||||
node.setAttribute(attribute, string)
|
||||
|
||||
return node
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Read command line arguments
|
||||
if len(sys.argv) < 3:
|
||||
sys.exit("Usage: convert_xsdir.py xsdirFile xmlFile")
|
||||
xsdirFile = sys.argv[1]
|
||||
xmlFile = sys.argv[2]
|
||||
|
||||
# Read xsdata and create XML document object
|
||||
xsdirObject = Xsdir(xsdirFile)
|
||||
doc = xsdirObject.to_xml()
|
||||
|
||||
# Reduce number of lines
|
||||
lines = doc.toprettyxml(indent=' ')
|
||||
|
||||
# Write document in pretty XML to specified file
|
||||
f = open(xmlFile, 'w')
|
||||
f.write(lines)
|
||||
f.close()
|
||||
2
setup.py
2
setup.py
|
|
@ -9,7 +9,7 @@ except ImportError:
|
|||
have_setuptools = False
|
||||
|
||||
kwargs = {'name': 'openmc',
|
||||
'version': '0.7.1',
|
||||
'version': '0.8.0',
|
||||
'packages': ['openmc', 'openmc.data', 'openmc.mgxs', 'openmc.model',
|
||||
'openmc.stats'],
|
||||
'scripts': glob.glob('scripts/openmc-*'),
|
||||
|
|
|
|||
1738
src/ace.F90
1738
src/ace.F90
File diff suppressed because it is too large
Load diff
|
|
@ -1,7 +1,11 @@
|
|||
module angle_distribution
|
||||
|
||||
use constants, only: ZERO, ONE
|
||||
use distribution_univariate, only: DistributionContainer
|
||||
use hdf5, only: HID_T, HSIZE_T
|
||||
|
||||
use constants, only: ZERO, ONE, HISTOGRAM, LINEAR_LINEAR
|
||||
use distribution_univariate, only: DistributionContainer, Tabular
|
||||
use hdf5_interface, only: read_attribute, get_shape, read_dataset, &
|
||||
open_dataset, close_dataset
|
||||
use random_lcg, only: prn
|
||||
use search, only: binary_search
|
||||
|
||||
|
|
@ -21,6 +25,7 @@ module angle_distribution
|
|||
type(DistributionContainer), allocatable :: distribution(:)
|
||||
contains
|
||||
procedure :: sample => angle_sample
|
||||
procedure :: from_hdf5 => angle_from_hdf5
|
||||
end type AngleDistribution
|
||||
|
||||
contains
|
||||
|
|
@ -60,4 +65,68 @@ contains
|
|||
if (abs(mu) > ONE) mu = sign(ONE, mu)
|
||||
end function angle_sample
|
||||
|
||||
subroutine angle_from_hdf5(this, group_id)
|
||||
class(AngleDistribution), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
integer :: i, j
|
||||
integer :: n
|
||||
integer :: n_energy
|
||||
integer(HID_T) :: dset_id
|
||||
integer(HSIZE_T) :: dims(1), dims2(2)
|
||||
integer, allocatable :: offsets(:)
|
||||
integer, allocatable :: interp(:)
|
||||
real(8), allocatable :: temp(:,:)
|
||||
|
||||
! Get incoming energies
|
||||
dset_id = open_dataset(group_id, 'energy')
|
||||
call get_shape(dset_id, dims)
|
||||
n_energy = int(dims(1), 4)
|
||||
allocate(this % energy(n_energy))
|
||||
allocate(this % distribution(n_energy))
|
||||
call read_dataset(this % energy, dset_id)
|
||||
call close_dataset(dset_id)
|
||||
|
||||
! Get outgoing energy distribution data
|
||||
dset_id = open_dataset(group_id, 'mu')
|
||||
call read_attribute(offsets, dset_id, 'offsets')
|
||||
call read_attribute(interp, dset_id, 'interpolation')
|
||||
call get_shape(dset_id, dims2)
|
||||
allocate(temp(dims2(1), dims2(2)))
|
||||
call read_dataset(temp, dset_id)
|
||||
call close_dataset(dset_id)
|
||||
|
||||
do i = 1, n_energy
|
||||
! Determine number of outgoing energies
|
||||
j = offsets(i)
|
||||
if (i < n_energy) then
|
||||
n = offsets(i+1) - j
|
||||
else
|
||||
n = size(temp, 1) - j
|
||||
end if
|
||||
|
||||
! Create and initialize tabular distribution
|
||||
allocate(Tabular :: this % distribution(i) % obj)
|
||||
select type (mudist => this % distribution(i) % obj)
|
||||
type is (Tabular)
|
||||
mudist % interpolation = interp(i)
|
||||
allocate(mudist % x(n), mudist % p(n), mudist % c(n))
|
||||
mudist % x(:) = temp(j+1:j+n, 1)
|
||||
mudist % p(:) = temp(j+1:j+n, 2)
|
||||
|
||||
! To get answers that match ACE data, for now we still use the tabulated
|
||||
! CDF values that were passed through to the HDF5 library. At a later
|
||||
! time, we can remove the CDF values from the HDF5 library and
|
||||
! reconstruct them using the PDF
|
||||
if (.true.) then
|
||||
mudist % c(:) = temp(j+1:j+n, 3)
|
||||
else
|
||||
call mudist % initialize(temp(j+1:j+n, 1), temp(j+1:j+n, 2), interp(i))
|
||||
end if
|
||||
end select
|
||||
|
||||
j = j + n
|
||||
end do
|
||||
end subroutine angle_from_hdf5
|
||||
|
||||
end module angle_distribution
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
module angleenergy_header
|
||||
|
||||
use hdf5, only: HID_T
|
||||
|
||||
!===============================================================================
|
||||
! ANGLEENERGY (abstract) defines a correlated or uncorrelated angle-energy
|
||||
! distribution that is a function of incoming energy. Each derived type must
|
||||
|
|
@ -10,6 +12,7 @@ module angleenergy_header
|
|||
type, abstract :: AngleEnergy
|
||||
contains
|
||||
procedure(angleenergy_sample_), deferred :: sample
|
||||
procedure(angleenergy_from_hdf5_), deferred :: from_hdf5
|
||||
end type AngleEnergy
|
||||
|
||||
abstract interface
|
||||
|
|
@ -20,6 +23,12 @@ module angleenergy_header
|
|||
real(8), intent(out) :: E_out
|
||||
real(8), intent(out) :: mu
|
||||
end subroutine angleenergy_sample_
|
||||
|
||||
subroutine angleenergy_from_hdf5_(this, group_id)
|
||||
import AngleEnergy, HID_T
|
||||
class(AngleEnergy), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
end subroutine angleenergy_from_hdf5_
|
||||
end interface
|
||||
|
||||
type :: AngleEnergyContainer
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@ module constants
|
|||
|
||||
! OpenMC major, minor, and release numbers
|
||||
integer, parameter :: VERSION_MAJOR = 0
|
||||
integer, parameter :: VERSION_MINOR = 7
|
||||
integer, parameter :: VERSION_RELEASE = 1
|
||||
integer, parameter :: VERSION_MINOR = 8
|
||||
integer, parameter :: VERSION_RELEASE = 0
|
||||
|
||||
! Revision numbers for binary files
|
||||
integer, parameter :: REVISION_STATEPOINT = 15
|
||||
|
|
@ -237,6 +237,13 @@ module constants
|
|||
ASCII = 1, & ! ASCII cross section file
|
||||
BINARY = 2 ! Binary cross section file
|
||||
|
||||
! Library types
|
||||
integer, parameter :: &
|
||||
LIBRARY_NEUTRON = 1, &
|
||||
LIBRARY_THERMAL = 2, &
|
||||
LIBRARY_PHOTON = 3, &
|
||||
LIBRARY_MULTIGROUP = 4
|
||||
|
||||
! Probability table parameters
|
||||
integer, parameter :: &
|
||||
URR_CUM_PROB = 1, &
|
||||
|
|
|
|||
|
|
@ -1,14 +1,18 @@
|
|||
module endf_header
|
||||
|
||||
use hdf5, only: HID_T, HSIZE_T
|
||||
|
||||
use constants, only: ZERO, HISTOGRAM, LINEAR_LINEAR, LINEAR_LOG, &
|
||||
LOG_LINEAR, LOG_LOG
|
||||
use hdf5_interface
|
||||
use search, only: binary_search
|
||||
|
||||
implicit none
|
||||
implicit none
|
||||
|
||||
type, abstract :: Function1D
|
||||
contains
|
||||
procedure(function1d_evaluate_), deferred :: evaluate
|
||||
procedure(function1d_from_hdf5_), deferred :: from_hdf5
|
||||
end type Function1D
|
||||
|
||||
abstract interface
|
||||
|
|
@ -18,6 +22,12 @@ implicit none
|
|||
real(8), intent(in) :: x
|
||||
real(8) :: y
|
||||
end function function1d_evaluate_
|
||||
|
||||
subroutine function1d_from_hdf5_(this, dset_id)
|
||||
import Function1D, HID_T
|
||||
class(Function1D), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: dset_id
|
||||
end subroutine function1d_from_hdf5_
|
||||
end interface
|
||||
|
||||
!===============================================================================
|
||||
|
|
@ -27,6 +37,7 @@ implicit none
|
|||
type, extends(Function1D) :: Constant1D
|
||||
real(8) :: y
|
||||
contains
|
||||
procedure :: from_hdf5 => constant1d_from_hdf5
|
||||
procedure :: evaluate => constant1d_evaluate
|
||||
end type Constant1D
|
||||
|
||||
|
|
@ -37,6 +48,7 @@ implicit none
|
|||
type, extends(Function1D) :: Polynomial
|
||||
real(8), allocatable :: coef(:) ! coefficients
|
||||
contains
|
||||
procedure :: from_hdf5 => polynomial_from_hdf5
|
||||
procedure :: evaluate => polynomial_evaluate
|
||||
procedure :: from_ace => polynomial_from_ace
|
||||
end type Polynomial
|
||||
|
|
@ -54,6 +66,7 @@ implicit none
|
|||
real(8), allocatable :: y(:) ! values of ordinate
|
||||
contains
|
||||
procedure :: from_ace => tabulated1d_from_ace
|
||||
procedure :: from_hdf5 => tabulated1d_from_hdf5
|
||||
procedure :: evaluate => tabulated1d_evaluate
|
||||
end type Tabulated1D
|
||||
|
||||
|
|
@ -63,6 +76,13 @@ contains
|
|||
! Constant1D implementation
|
||||
!===============================================================================
|
||||
|
||||
subroutine constant1d_from_hdf5(this, dset_id)
|
||||
class(Constant1D), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: dset_id
|
||||
|
||||
call read_dataset(this % y, dset_id)
|
||||
end subroutine constant1d_from_hdf5
|
||||
|
||||
pure function constant1d_evaluate(this, x) result(y)
|
||||
class(Constant1D), intent(in) :: this
|
||||
real(8), intent(in) :: x
|
||||
|
|
@ -93,6 +113,17 @@ contains
|
|||
this % coef(:) = xss(idx + 1 : idx + nc)
|
||||
end subroutine polynomial_from_ace
|
||||
|
||||
subroutine polynomial_from_hdf5(this, dset_id)
|
||||
class(Polynomial), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: dset_id
|
||||
|
||||
integer(HSIZE_T) :: dims(1)
|
||||
|
||||
call get_shape(dset_id, dims)
|
||||
allocate(this % coef(dims(1)))
|
||||
call read_dataset(this % coef, dset_id)
|
||||
end subroutine polynomial_from_hdf5
|
||||
|
||||
pure function polynomial_evaluate(this, x) result(y)
|
||||
class(Polynomial), intent(in) :: this
|
||||
real(8), intent(in) :: x
|
||||
|
|
@ -127,27 +158,49 @@ contains
|
|||
|
||||
! Determine number of regions
|
||||
nr = nint(xss(idx))
|
||||
this%n_regions = nr
|
||||
this % n_regions = nr
|
||||
|
||||
! Read interpolation region data
|
||||
if (nr > 0) then
|
||||
allocate(this%nbt(nr))
|
||||
allocate(this%int(nr))
|
||||
this%nbt(:) = nint(xss(idx + 1 : idx + nr))
|
||||
this%int(:) = nint(xss(idx + nr + 1 : idx + 2*nr))
|
||||
allocate(this % nbt(nr))
|
||||
allocate(this % int(nr))
|
||||
this % nbt(:) = nint(xss(idx + 1 : idx + nr))
|
||||
this % int(:) = nint(xss(idx + nr + 1 : idx + 2*nr))
|
||||
end if
|
||||
|
||||
! Determine number of pairs
|
||||
ne = int(XSS(idx + 2*nr + 1))
|
||||
this%n_pairs = ne
|
||||
this % n_pairs = ne
|
||||
|
||||
! Read (x,y) pairs
|
||||
allocate(this%x(ne))
|
||||
allocate(this%y(ne))
|
||||
this%x(:) = xss(idx + 2*nr + 2 : idx + 2*nr + 1 + ne)
|
||||
this%y(:) = xss(idx + 2*nr + 2 + ne : idx + 2*nr + 1 + 2*ne)
|
||||
allocate(this % x(ne))
|
||||
allocate(this % y(ne))
|
||||
this % x(:) = xss(idx + 2*nr + 2 : idx + 2*nr + 1 + ne)
|
||||
this % y(:) = xss(idx + 2*nr + 2 + ne : idx + 2*nr + 1 + 2*ne)
|
||||
end subroutine tabulated1d_from_ace
|
||||
|
||||
subroutine tabulated1d_from_hdf5(this, dset_id)
|
||||
class(Tabulated1D), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: dset_id
|
||||
|
||||
real(8), allocatable :: xy(:,:)
|
||||
integer(HSIZE_T) :: dims(2)
|
||||
|
||||
call read_attribute(this % nbt, dset_id, 'breakpoints')
|
||||
call read_attribute(this % int, dset_id, 'interpolation')
|
||||
this % n_regions = size(this % nbt)
|
||||
|
||||
call get_shape(dset_id, dims)
|
||||
this % n_pairs = int(dims(1), 4)
|
||||
allocate(this % x(this % n_pairs))
|
||||
allocate(this % y(this % n_pairs))
|
||||
|
||||
allocate(xy(dims(1), dims(2)))
|
||||
call read_dataset(xy, dset_id)
|
||||
this % x(:) = xy(:,1)
|
||||
this % y(:) = xy(:,2)
|
||||
end subroutine tabulated1d_from_hdf5
|
||||
|
||||
pure function tabulated1d_evaluate(this, x) result(y)
|
||||
class(Tabulated1D), intent(in) :: this
|
||||
real(8), intent(in) :: x ! x value to find y at
|
||||
|
|
|
|||
|
|
@ -1,7 +1,10 @@
|
|||
module energy_distribution
|
||||
|
||||
use constants, only: ZERO, ONE, TWO, PI, HISTOGRAM, LINEAR_LINEAR
|
||||
use hdf5
|
||||
|
||||
use constants, only: ZERO, ONE, HALF, TWO, PI, HISTOGRAM, LINEAR_LINEAR
|
||||
use endf_header, only: Tabulated1D
|
||||
use hdf5_interface
|
||||
use math, only: maxwell_spectrum, watt_spectrum
|
||||
use random_lcg, only: prn
|
||||
use search, only: binary_search
|
||||
|
|
@ -16,6 +19,7 @@ module energy_distribution
|
|||
type, abstract :: EnergyDistribution
|
||||
contains
|
||||
procedure(energy_distribution_sample_), deferred :: sample
|
||||
procedure(energy_distribution_from_hdf5_), deferred :: from_hdf5
|
||||
end type EnergyDistribution
|
||||
|
||||
abstract interface
|
||||
|
|
@ -25,6 +29,13 @@ module energy_distribution
|
|||
real(8), intent(in) :: E_in
|
||||
real(8) :: E_out
|
||||
end function energy_distribution_sample_
|
||||
|
||||
subroutine energy_distribution_from_hdf5_(this, group_id)
|
||||
import EnergyDistribution
|
||||
import HID_T
|
||||
class(EnergyDistribution), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
end subroutine energy_distribution_from_hdf5_
|
||||
end interface
|
||||
|
||||
type :: EnergyDistributionContainer
|
||||
|
|
@ -50,8 +61,23 @@ module energy_distribution
|
|||
! each incoming energy
|
||||
contains
|
||||
procedure :: sample => equiprobable_sample
|
||||
procedure :: from_hdf5 => equiprobable_from_hdf5
|
||||
end type TabularEquiprobable
|
||||
|
||||
!===============================================================================
|
||||
! DISCRETEPHOTON gives the energy distribution for a discrete photon (usually
|
||||
! used for photon production from an incident-neutron reaction)
|
||||
!===============================================================================
|
||||
|
||||
type, extends(EnergyDistribution) :: DiscretePhoton
|
||||
integer :: primary_flag
|
||||
real(8) :: energy
|
||||
real(8) :: A
|
||||
contains
|
||||
procedure :: sample => discrete_photon_sample
|
||||
procedure :: from_hdf5 => discrete_photon_from_hdf5
|
||||
end type DiscretePhoton
|
||||
|
||||
!===============================================================================
|
||||
! LEVELINELASTIC gives the energy distribution for level inelastic scattering by
|
||||
! neutrons as in ENDF MT=51--90.
|
||||
|
|
@ -62,6 +88,7 @@ module energy_distribution
|
|||
real(8) :: mass_ratio
|
||||
contains
|
||||
procedure :: sample => level_inelastic_sample
|
||||
procedure :: from_hdf5 => level_inelastic_from_hdf5
|
||||
end type LevelInelastic
|
||||
|
||||
!===============================================================================
|
||||
|
|
@ -86,6 +113,7 @@ module energy_distribution
|
|||
type(CTTable), allocatable :: distribution(:)
|
||||
contains
|
||||
procedure :: sample => continuous_sample
|
||||
procedure :: from_hdf5 => continuous_from_hdf5
|
||||
end type ContinuousTabular
|
||||
|
||||
!===============================================================================
|
||||
|
|
@ -98,6 +126,7 @@ module energy_distribution
|
|||
real(8) :: u ! restriction energy
|
||||
contains
|
||||
procedure :: sample => maxwellenergy_sample
|
||||
procedure :: from_hdf5 => maxwellenergy_from_hdf5
|
||||
end type MaxwellEnergy
|
||||
|
||||
!===============================================================================
|
||||
|
|
@ -110,6 +139,7 @@ module energy_distribution
|
|||
real(8) :: u
|
||||
contains
|
||||
procedure :: sample => evaporation_sample
|
||||
procedure :: from_hdf5 => evaporation_from_hdf5
|
||||
end type Evaporation
|
||||
|
||||
!===============================================================================
|
||||
|
|
@ -123,6 +153,7 @@ module energy_distribution
|
|||
real(8) :: u
|
||||
contains
|
||||
procedure :: sample => watt_sample
|
||||
procedure :: from_hdf5 => watt_from_hdf5
|
||||
end type WattEnergy
|
||||
|
||||
contains
|
||||
|
|
@ -186,6 +217,31 @@ contains
|
|||
end if
|
||||
end function equiprobable_sample
|
||||
|
||||
subroutine equiprobable_from_hdf5(this, group_id)
|
||||
class(TabularEquiprobable), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
end subroutine equiprobable_from_hdf5
|
||||
|
||||
function discrete_photon_sample(this, E_in) result(E_out)
|
||||
class(DiscretePhoton), intent(in) :: this
|
||||
real(8), intent(in) :: E_in
|
||||
real(8) :: E_out
|
||||
|
||||
if (this % primary_flag == 2) then
|
||||
E_out = this % energy + this % A/(this % A + 1)*E_in
|
||||
else
|
||||
E_out = this % energy
|
||||
end if
|
||||
end function discrete_photon_sample
|
||||
|
||||
subroutine discrete_photon_from_hdf5(this, group_id)
|
||||
class(DiscretePhoton), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
call read_attribute(this % primary_flag, group_id, 'primary_flag')
|
||||
call read_attribute(this % energy, group_id, 'energy')
|
||||
call read_attribute(this % A, group_id, 'atomic_weight_ratio')
|
||||
end subroutine discrete_photon_from_hdf5
|
||||
|
||||
function level_inelastic_sample(this, E_in) result(E_out)
|
||||
class(LevelInelastic), intent(in) :: this
|
||||
|
|
@ -195,6 +251,13 @@ contains
|
|||
E_out = this%mass_ratio*(E_in - this%threshold)
|
||||
end function level_inelastic_sample
|
||||
|
||||
subroutine level_inelastic_from_hdf5(this, group_id)
|
||||
class(LevelInelastic), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
call read_attribute(this%threshold, group_id, 'threshold')
|
||||
call read_attribute(this%mass_ratio, group_id, 'mass_ratio')
|
||||
end subroutine level_inelastic_from_hdf5
|
||||
|
||||
function continuous_sample(this, E_in) result(E_out)
|
||||
class(ContinuousTabular), intent(in) :: this
|
||||
|
|
@ -307,6 +370,111 @@ contains
|
|||
end if
|
||||
end function continuous_sample
|
||||
|
||||
subroutine continuous_from_hdf5(this, group_id)
|
||||
class(ContinuousTabular), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
integer :: i, j, k
|
||||
integer :: n
|
||||
integer :: n_energy
|
||||
integer(HID_T) :: dset_id
|
||||
integer(HSIZE_T) :: dims(1), dims2(2)
|
||||
integer, allocatable :: temp(:,:)
|
||||
integer, allocatable :: offsets(:)
|
||||
integer, allocatable :: interp(:)
|
||||
integer, allocatable :: n_discrete(:)
|
||||
real(8), allocatable :: eout(:,:)
|
||||
|
||||
! Open incoming energy dataset
|
||||
dset_id = open_dataset(group_id, 'energy')
|
||||
|
||||
! Get interpolation parameters
|
||||
call read_attribute(temp, dset_id, 'interpolation')
|
||||
allocate(this%breakpoints(size(temp, 1)))
|
||||
allocate(this%interpolation(size(temp, 1)))
|
||||
this%breakpoints(:) = temp(:, 1)
|
||||
this%interpolation(:) = temp(:, 2)
|
||||
this%n_region = size(this%breakpoints)
|
||||
|
||||
! Get incoming energies
|
||||
call get_shape(dset_id, dims)
|
||||
n_energy = int(dims(1), 4)
|
||||
allocate(this%energy(n_energy))
|
||||
allocate(this%distribution(n_energy))
|
||||
call read_dataset(this%energy, dset_id)
|
||||
call close_dataset(dset_id)
|
||||
|
||||
! Get outgoing energy distribution data
|
||||
dset_id = open_dataset(group_id, 'distribution')
|
||||
call read_attribute(offsets, dset_id, 'offsets')
|
||||
call read_attribute(interp, dset_id, 'interpolation')
|
||||
call read_attribute(n_discrete, dset_id, 'n_discrete_lines')
|
||||
call get_shape(dset_id, dims2)
|
||||
allocate(eout(dims2(1), dims2(2)))
|
||||
call read_dataset(eout, dset_id)
|
||||
call close_dataset(dset_id)
|
||||
|
||||
do i = 1, n_energy
|
||||
! Determine number of outgoing energies
|
||||
j = offsets(i)
|
||||
if (i < n_energy) then
|
||||
n = offsets(i+1) - j
|
||||
else
|
||||
n = size(eout, 1) - j
|
||||
end if
|
||||
|
||||
associate (d => this % distribution(i))
|
||||
! Assign interpolation scheme and number of discrete lines
|
||||
d % interpolation = interp(i)
|
||||
d % n_discrete = n_discrete(i)
|
||||
|
||||
! Allocate arrays for energies and PDF/CDF
|
||||
allocate(d % e_out(n))
|
||||
allocate(d % p(n))
|
||||
allocate(d % c(n))
|
||||
|
||||
! Copy data
|
||||
d % e_out(:) = eout(j+1:j+n, 1)
|
||||
d % p(:) = eout(j+1:j+n, 2)
|
||||
|
||||
! To get answers that match ACE data, for now we still use the tabulated
|
||||
! CDF values that were passed through to the HDF5 library. At a later
|
||||
! time, we can remove the CDF values from the HDF5 library and
|
||||
! reconstruct them using the PDF
|
||||
if (.true.) then
|
||||
d % c(:) = eout(j+1:j+n, 3)
|
||||
else
|
||||
! Calculate cumulative distribution function -- discrete portion
|
||||
do k = 1, n_discrete(i)
|
||||
if (k == 1) then
|
||||
d % c(k) = d % p(k)
|
||||
else
|
||||
d % c(k) = d % c(k-1) + d % p(k)
|
||||
end if
|
||||
end do
|
||||
|
||||
! Continuous portion
|
||||
do k = d % n_discrete + 1, n
|
||||
if (k == d % n_discrete + 1) then
|
||||
d % c(k) = sum(d % p(1:d % n_discrete))
|
||||
else
|
||||
if (d % interpolation == HISTOGRAM) then
|
||||
d % c(k) = d % c(k-1) + d % p(k-1) * &
|
||||
(d % e_out(k) - d % e_out(k-1))
|
||||
elseif (d % interpolation == LINEAR_LINEAR) then
|
||||
d % c(k) = d % c(k-1) + HALF*(d % p(k-1) + d % p(k)) * &
|
||||
(d % e_out(k) - d % e_out(k-1))
|
||||
end if
|
||||
end if
|
||||
end do
|
||||
|
||||
! Normalize density and distribution functions
|
||||
d % p(:) = d % p(:)/d % c(n)
|
||||
d % c(:) = d % c(:)/d % c(n)
|
||||
end if
|
||||
end associate
|
||||
end do
|
||||
end subroutine continuous_from_hdf5
|
||||
|
||||
function maxwellenergy_sample(this, E_in) result(E_out)
|
||||
class(MaxwellEnergy), intent(in) :: this
|
||||
|
|
@ -327,6 +495,18 @@ contains
|
|||
end do
|
||||
end function maxwellenergy_sample
|
||||
|
||||
subroutine maxwellenergy_from_hdf5(this, group_id)
|
||||
class(MaxwellEnergy), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
integer(HID_T) :: dset_id
|
||||
|
||||
call read_attribute(this%u, group_id, 'u')
|
||||
dset_id = open_dataset(group_id, 'theta')
|
||||
call this%theta%from_hdf5(dset_id)
|
||||
call close_dataset(dset_id)
|
||||
end subroutine maxwellenergy_from_hdf5
|
||||
|
||||
function evaporation_sample(this, E_in) result(E_out)
|
||||
class(Evaporation), intent(in) :: this
|
||||
real(8), intent(in) :: E_in ! incoming energy
|
||||
|
|
@ -351,6 +531,18 @@ contains
|
|||
E_out = x*theta
|
||||
end function evaporation_sample
|
||||
|
||||
subroutine evaporation_from_hdf5(this, group_id)
|
||||
class(Evaporation), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
integer(HID_T) :: dset_id
|
||||
|
||||
call read_attribute(this%u, group_id, 'u')
|
||||
dset_id = open_dataset(group_id, 'theta')
|
||||
call this%theta%from_hdf5(dset_id)
|
||||
call close_dataset(dset_id)
|
||||
end subroutine evaporation_from_hdf5
|
||||
|
||||
function watt_sample(this, E_in) result(E_out)
|
||||
class(WattEnergy), intent(in) :: this
|
||||
real(8), intent(in) :: E_in ! incoming energy
|
||||
|
|
@ -373,4 +565,21 @@ contains
|
|||
end do
|
||||
end function watt_sample
|
||||
|
||||
subroutine watt_from_hdf5(this, group_id)
|
||||
class(WattEnergy), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
integer(HID_T) :: dset_id
|
||||
|
||||
call read_attribute(this%u, group_id, 'u')
|
||||
|
||||
dset_id = open_dataset(group_id, 'a')
|
||||
call this%a%from_hdf5(dset_id)
|
||||
call close_dataset(dset_id)
|
||||
|
||||
dset_id = open_dataset(group_id, 'b')
|
||||
call this%b%from_hdf5(dset_id)
|
||||
call close_dataset(dset_id)
|
||||
end subroutine watt_from_hdf5
|
||||
|
||||
end module energy_distribution
|
||||
|
|
|
|||
|
|
@ -65,11 +65,7 @@ module global
|
|||
! ============================================================================
|
||||
! CROSS SECTION RELATED VARIABLES NEEDED REGARDLESS OF CE OR MG
|
||||
|
||||
! Cross section arrays
|
||||
type(XsListing), allocatable, target :: xs_listings(:) ! cross_sections.xml listings
|
||||
|
||||
integer :: n_nuclides_total ! Number of nuclide cross section tables
|
||||
integer :: n_listings ! Number of listings in cross_sections.xml
|
||||
|
||||
! Cross section caches
|
||||
type(NuclideMicroXS), allocatable :: micro_xs(:) ! Cache for each nuclide
|
||||
|
|
@ -77,7 +73,6 @@ module global
|
|||
|
||||
! Dictionaries to look up cross sections and listings
|
||||
type(DictCharInt) :: nuclide_dict
|
||||
type(DictCharInt) :: xs_listing_dict
|
||||
|
||||
! Default xs identifier (e.g. 70c or 300K)
|
||||
character(5):: default_xs
|
||||
|
|
@ -107,7 +102,8 @@ module global
|
|||
! Whether or not windowed multipole cross sections should be used.
|
||||
logical :: multipole_active = .false.
|
||||
|
||||
! Total amount of nuclide ZAID and dictionary of nuclide ZAID and index
|
||||
! Total amount of nuclide ZAID and dictionary of nuclide ZAID and index --
|
||||
! this is used when sampling unresolved resonance probability tables
|
||||
integer(8) :: n_nuc_zaid_total
|
||||
type(DictIntInt) :: nuc_zaid_dict
|
||||
|
||||
|
|
@ -498,7 +494,6 @@ contains
|
|||
end if
|
||||
|
||||
if (allocated(sab_tables)) deallocate(sab_tables)
|
||||
if (allocated(xs_listings)) deallocate(xs_listings)
|
||||
if (allocated(micro_xs)) deallocate(micro_xs)
|
||||
|
||||
! Deallocate external source
|
||||
|
|
@ -553,7 +548,6 @@ contains
|
|||
call plot_dict % clear()
|
||||
call nuclide_dict % clear()
|
||||
call sab_dict % clear()
|
||||
call xs_listing_dict % clear()
|
||||
|
||||
! Clear statepoint and sourcepoint batch set
|
||||
call statepoint_batch % clear()
|
||||
|
|
|
|||
|
|
@ -10,13 +10,13 @@ module hdf5_interface
|
|||
! can be combined into one simply accepting an assumed-shape array.
|
||||
!==============================================================================
|
||||
|
||||
use error, only: fatal_error
|
||||
use tally_header, only: TallyResult
|
||||
use, intrinsic :: ISO_C_BINDING
|
||||
|
||||
use hdf5
|
||||
use h5lt
|
||||
use, intrinsic :: ISO_C_BINDING
|
||||
|
||||
use error, only: fatal_error
|
||||
use tally_header, only: TallyResult
|
||||
#ifdef PHDF5
|
||||
use message_passing, only: MPI_COMM_WORLD, MPI_INFO_NULL
|
||||
#endif
|
||||
|
|
@ -2383,8 +2383,8 @@ contains
|
|||
! Insert the 'r' and 'i' identifiers
|
||||
call h5tcreate_f(H5T_COMPOUND_F, size_double, dtype_real, hdf5_err)
|
||||
call h5tcreate_f(H5T_COMPOUND_F, size_double, dtype_imag, hdf5_err)
|
||||
call h5tinsert_f(dtype_real, "r", 0_8, H5T_NATIVE_DOUBLE, hdf5_err)
|
||||
call h5tinsert_f(dtype_imag, "i", 0_8, H5T_NATIVE_DOUBLE, hdf5_err)
|
||||
call h5tinsert_f(dtype_real, "r", 0_SIZE_T, H5T_NATIVE_DOUBLE, hdf5_err)
|
||||
call h5tinsert_f(dtype_imag, "i", 0_SIZE_T, H5T_NATIVE_DOUBLE, hdf5_err)
|
||||
|
||||
! Set up collective vs. independent I/O
|
||||
data_xfer_mode = H5FD_MPIO_COLLECTIVE_F
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
module initialize
|
||||
|
||||
use ace, only: read_ace_xs
|
||||
use bank_header, only: Bank
|
||||
use constants
|
||||
use dict_header, only: DictIntInt, ElemKeyValueII
|
||||
|
|
@ -109,19 +108,6 @@ contains
|
|||
end if
|
||||
|
||||
if (run_mode /= MODE_PLOTTING) then
|
||||
! With the AWRs from the xs_listings, change all material specifications
|
||||
! so that they contain atom percents summing to 1
|
||||
call normalize_ao()
|
||||
|
||||
! Read ACE-format cross sections
|
||||
call time_read_xs%start()
|
||||
if (run_CE) then
|
||||
call read_ace_xs()
|
||||
else
|
||||
call read_mgxs()
|
||||
end if
|
||||
call time_read_xs%stop()
|
||||
|
||||
! Construct information needed for nuclear data
|
||||
if (run_CE) then
|
||||
! Set undefined cell temperatures to match the material data.
|
||||
|
|
@ -140,7 +126,10 @@ contains
|
|||
end select
|
||||
else
|
||||
! Create material macroscopic data for MGXS
|
||||
call time_read_xs%start()
|
||||
call read_mgxs()
|
||||
call create_macro_xs()
|
||||
call time_read_xs%stop()
|
||||
end if
|
||||
|
||||
! Allocate and setup tally stride, matching_bins, and tally maps
|
||||
|
|
@ -800,71 +789,6 @@ contains
|
|||
|
||||
end subroutine adjust_indices
|
||||
|
||||
!===============================================================================
|
||||
! NORMALIZE_AO normalizes the atom or weight percentages for each material
|
||||
!===============================================================================
|
||||
|
||||
subroutine normalize_ao()
|
||||
|
||||
integer :: index_list ! index in xs_listings array
|
||||
integer :: i ! index in materials array
|
||||
integer :: j ! index over nuclides in material
|
||||
real(8) :: sum_percent ! summation
|
||||
real(8) :: awr ! atomic weight ratio
|
||||
real(8) :: x ! atom percent
|
||||
logical :: percent_in_atom ! nuclides specified in atom percent?
|
||||
logical :: density_in_atom ! density specified in atom/b-cm?
|
||||
type(Material), pointer :: mat => null()
|
||||
|
||||
! first find the index in the xs_listings array for each nuclide in each
|
||||
! material
|
||||
do i = 1, n_materials
|
||||
mat => materials(i)
|
||||
|
||||
percent_in_atom = (mat%atom_density(1) > ZERO)
|
||||
density_in_atom = (mat%density > ZERO)
|
||||
|
||||
sum_percent = ZERO
|
||||
do j = 1, mat%n_nuclides
|
||||
! determine atomic weight ratio
|
||||
index_list = xs_listing_dict%get_key(mat%names(j))
|
||||
awr = xs_listings(index_list)%awr
|
||||
|
||||
! if given weight percent, convert all values so that they are divided
|
||||
! by awr. thus, when a sum is done over the values, it's actually
|
||||
! sum(w/awr)
|
||||
if (.not. percent_in_atom) then
|
||||
mat%atom_density(j) = -mat%atom_density(j) / awr
|
||||
end if
|
||||
end do
|
||||
|
||||
! determine normalized atom percents. if given atom percents, this is
|
||||
! straightforward. if given weight percents, the value is w/awr and is
|
||||
! divided by sum(w/awr)
|
||||
sum_percent = sum(mat%atom_density)
|
||||
mat%atom_density = mat%atom_density / sum_percent
|
||||
|
||||
! Change density in g/cm^3 to atom/b-cm. Since all values are now in atom
|
||||
! percent, the sum needs to be re-evaluated as 1/sum(x*awr)
|
||||
if (.not. density_in_atom) then
|
||||
sum_percent = ZERO
|
||||
do j = 1, mat%n_nuclides
|
||||
index_list = xs_listing_dict%get_key(mat%names(j))
|
||||
awr = xs_listings(index_list)%awr
|
||||
x = mat%atom_density(j)
|
||||
sum_percent = sum_percent + x*awr
|
||||
end do
|
||||
sum_percent = ONE / sum_percent
|
||||
mat%density = -mat%density * N_AVOGADRO &
|
||||
/ MASS_NEUTRON * sum_percent
|
||||
end if
|
||||
|
||||
! Calculate nuclide atom densities
|
||||
mat%atom_density = mat%density * mat%atom_density
|
||||
end do
|
||||
|
||||
end subroutine normalize_ao
|
||||
|
||||
!===============================================================================
|
||||
! CALCULATE_WORK determines how many particles each processor should simulate
|
||||
!===============================================================================
|
||||
|
|
|
|||
2056
src/input_xml.F90
2056
src/input_xml.F90
File diff suppressed because it is too large
Load diff
|
|
@ -27,8 +27,8 @@ module material_header
|
|||
integer, allocatable :: i_sab_tables(:) ! index in sab_tables
|
||||
|
||||
! Temporary names read during initialization
|
||||
character(12), allocatable :: names(:) ! isotope names
|
||||
character(12), allocatable :: sab_names(:) ! name of S(a,b) table
|
||||
character(20), allocatable :: names(:) ! isotope names
|
||||
character(20), allocatable :: sab_names(:) ! name of S(a,b) table
|
||||
|
||||
! Does this material contain fissionable nuclides?
|
||||
logical :: fissionable = .false.
|
||||
|
|
|
|||
|
|
@ -23,10 +23,9 @@ contains
|
|||
|
||||
integer :: i ! index in materials array
|
||||
integer :: j ! index over nuclides in material
|
||||
integer :: i_listing ! index in xs_listings array
|
||||
integer :: i_xsdata ! index in <xsdata> list
|
||||
integer :: i_nuclide ! index in nuclides
|
||||
character(12) :: name ! name of isotope, e.g. 92235.03c
|
||||
character(12) :: alias ! alias of isotope, e.g. U-235.03c
|
||||
character(20) :: name ! name of isotope, e.g. 92235.03c
|
||||
integer :: representation ! Data representation
|
||||
type(Material), pointer :: mat
|
||||
type(SetChar) :: already_read
|
||||
|
|
@ -37,6 +36,7 @@ contains
|
|||
character(MAX_LINE_LEN) :: temp_str
|
||||
logical :: get_kfiss, get_fiss
|
||||
integer :: l
|
||||
type(DictCharInt) :: xsdata_dict
|
||||
|
||||
! Check if cross_sections.xml exists
|
||||
inquire(FILE=path_cross_sections, EXIST=file_exists)
|
||||
|
|
@ -53,7 +53,17 @@ contains
|
|||
|
||||
! Get node list of all <xsdata>
|
||||
call get_node_list(doc, "xsdata", node_xsdata_list)
|
||||
n_listings = get_list_size(node_xsdata_list)
|
||||
|
||||
! Build dictionary mapping nuclide names to an index in the <xsdata> node
|
||||
! list
|
||||
do i = 1, get_list_size(node_xsdata_list)
|
||||
! Get pointer to xsdata table XML node
|
||||
call get_list_item(node_xsdata_list, i, node_xsdata)
|
||||
|
||||
! Get name and create pair (name, i)
|
||||
call get_node_value(node_xsdata, "name", name)
|
||||
call xsdata_dict % add_key(to_lower(name), i)
|
||||
end do
|
||||
|
||||
! allocate arrays for ACE table storage and cross section cache
|
||||
allocate(nuclides_MG(n_nuclides_total))
|
||||
|
|
@ -89,13 +99,11 @@ contains
|
|||
name = mat % names(j)
|
||||
|
||||
if (.not. already_read % contains(name)) then
|
||||
i_listing = xs_listing_dict % get_key(to_lower(name))
|
||||
i_xsdata = xsdata_dict % get_key(to_lower(name))
|
||||
i_nuclide = mat % nuclide(j)
|
||||
name = xs_listings(i_listing) % name
|
||||
alias = xs_listings(i_listing) % alias
|
||||
|
||||
! Get pointer to xsdata table XML node
|
||||
call get_list_item(node_xsdata_list, i_listing, node_xsdata)
|
||||
call get_list_item(node_xsdata_list, i_xsdata, node_xsdata)
|
||||
|
||||
call write_message("Loading " // trim(name) // " Data...", 5)
|
||||
|
||||
|
|
@ -125,11 +133,10 @@ contains
|
|||
|
||||
! Now read in the data specific to the type we just declared
|
||||
call nuclides_MG(i_nuclide) % obj % init_file(node_xsdata, &
|
||||
energy_groups, get_kfiss, get_fiss, max_order, i_listing)
|
||||
energy_groups, get_kfiss, get_fiss, max_order)
|
||||
|
||||
! Add name and alias to dictionary
|
||||
! Add name to dictionary
|
||||
call already_read % add(name)
|
||||
call already_read % add(alias)
|
||||
end if
|
||||
end do NUCLIDE_LOOP
|
||||
end do MATERIAL_LOOP
|
||||
|
|
@ -185,8 +192,8 @@ contains
|
|||
allocate(MgxsAngle :: macro_xs(i_mat) % obj)
|
||||
end select
|
||||
call macro_xs(i_mat) % obj % combine(mat, nuclides_MG, energy_groups, &
|
||||
max_order, scatt_type, i_mat)
|
||||
max_order, scatt_type)
|
||||
end do
|
||||
end subroutine create_macro_xs
|
||||
|
||||
end module mgxs_data
|
||||
end module mgxs_data
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ module mgxs_header
|
|||
character(len=104) :: name ! name of dataset, e.g. 92235.03c
|
||||
integer :: zaid ! Z and A identifier, e.g. 92235
|
||||
real(8) :: awr ! Atomic Weight Ratio
|
||||
integer :: listing ! index in xs_listings
|
||||
real(8) :: kT ! temperature in MeV (k*T)
|
||||
|
||||
! Fission information
|
||||
|
|
@ -54,8 +53,8 @@ module mgxs_header
|
|||
!===============================================================================
|
||||
|
||||
abstract interface
|
||||
subroutine mgxs_init_file_(this,node_xsdata,groups,get_kfiss,get_fiss, &
|
||||
max_order,i_listing)
|
||||
subroutine mgxs_init_file_(this, node_xsdata, groups, get_kfiss, get_fiss, &
|
||||
max_order)
|
||||
import Mgxs, Node
|
||||
class(Mgxs), intent(inout) :: this ! Working Object
|
||||
type(Node), pointer, intent(in) :: node_xsdata ! Data from MGXS xml
|
||||
|
|
@ -63,7 +62,6 @@ module mgxs_header
|
|||
logical, intent(in) :: get_kfiss ! Need Kappa-Fission?
|
||||
logical, intent(in) :: get_fiss ! Should we get fiss data?
|
||||
integer, intent(in) :: max_order ! Maximum requested order
|
||||
integer, intent(in) :: i_listing ! Index of listings array
|
||||
end subroutine mgxs_init_file_
|
||||
|
||||
subroutine mgxs_print_(this, unit)
|
||||
|
|
@ -96,8 +94,7 @@ module mgxs_header
|
|||
|
||||
end function mgxs_calc_f_
|
||||
|
||||
subroutine mgxs_combine_(this,mat,nuclides,groups,max_order,scatt_type, &
|
||||
i_listing)
|
||||
subroutine mgxs_combine_(this, mat, nuclides, groups, max_order, scatt_type)
|
||||
import Mgxs, Material, MgxsContainer
|
||||
class(Mgxs), intent(inout) :: this ! The Mgxs to initialize
|
||||
type(Material), pointer, intent(in) :: mat ! base material
|
||||
|
|
@ -105,7 +102,6 @@ module mgxs_header
|
|||
integer, intent(in) :: groups ! Number of E groups
|
||||
integer, intent(in) :: max_order ! Maximum requested order
|
||||
integer, intent(in) :: scatt_type ! Legendre or Tabular Scatt?
|
||||
integer, intent(in) :: i_listing ! Index in listings
|
||||
end subroutine mgxs_combine_
|
||||
|
||||
function mgxs_sample_fission_(this, gin, uvw) result(gout)
|
||||
|
|
@ -201,10 +197,9 @@ module mgxs_header
|
|||
! the xsdata object node itself.
|
||||
!===============================================================================
|
||||
|
||||
subroutine mgxs_init_file(this, node_xsdata, i_listing)
|
||||
subroutine mgxs_init_file(this, node_xsdata)
|
||||
class(Mgxs), intent(inout) :: this ! Working Object
|
||||
type(Node), pointer, intent(in) :: node_xsdata ! Data from MGXS xml
|
||||
integer, intent(in) :: i_listing ! Index in listings array
|
||||
|
||||
character(MAX_LINE_LEN) :: temp_str
|
||||
|
||||
|
|
@ -254,20 +249,16 @@ module mgxs_header
|
|||
call fatal_error("Fissionable element must be set!")
|
||||
end if
|
||||
|
||||
! Keep track of what listing is associated with this nuclide
|
||||
this % listing = i_listing
|
||||
|
||||
end subroutine mgxs_init_file
|
||||
|
||||
subroutine mgxsiso_init_file(this, node_xsdata, groups, get_kfiss, get_fiss, &
|
||||
max_order, i_listing)
|
||||
max_order)
|
||||
class(MgxsIso), intent(inout) :: this ! Working Object
|
||||
type(Node), pointer, intent(in) :: node_xsdata ! Data from MGXS xml
|
||||
integer, intent(in) :: groups ! Number of Energy groups
|
||||
logical, intent(in) :: get_kfiss ! Need Kappa-Fission?
|
||||
logical, intent(in) :: get_fiss ! Need fiss data?
|
||||
integer, intent(in) :: max_order ! Maximum requested order
|
||||
integer, intent(in) :: i_listing ! Index in listings array
|
||||
|
||||
type(Node), pointer :: node_legendre_mu
|
||||
character(MAX_LINE_LEN) :: temp_str
|
||||
|
|
@ -282,7 +273,7 @@ module mgxs_header
|
|||
integer :: legendre_mu_points, imu
|
||||
|
||||
! Call generic data gathering routine (will populate the metadata)
|
||||
call mgxs_init_file(this, node_xsdata, i_listing)
|
||||
call mgxs_init_file(this, node_xsdata)
|
||||
|
||||
! Load the more specific data
|
||||
allocate(this % nu_fission(groups))
|
||||
|
|
@ -564,14 +555,13 @@ module mgxs_header
|
|||
end subroutine mgxsiso_init_file
|
||||
|
||||
subroutine mgxsang_init_file(this, node_xsdata, groups, get_kfiss, get_fiss, &
|
||||
max_order, i_listing)
|
||||
max_order)
|
||||
class(MgxsAngle), intent(inout) :: this ! Working Object
|
||||
type(Node), pointer, intent(in) :: node_xsdata ! Data from MGXS xml
|
||||
integer, intent(in) :: groups ! Number of Energy groups
|
||||
logical, intent(in) :: get_kfiss ! Need Kappa-Fission?
|
||||
logical, intent(in) :: get_fiss ! Should we get fiss data?
|
||||
integer, intent(in) :: max_order ! Maximum requested order
|
||||
integer, intent(in) :: i_listing ! Index in listings array
|
||||
|
||||
type(Node), pointer :: node_legendre_mu
|
||||
character(MAX_LINE_LEN) :: temp_str
|
||||
|
|
@ -586,7 +576,7 @@ module mgxs_header
|
|||
integer :: legendre_mu_points, imu, ipol, iazi
|
||||
|
||||
! Call generic data gathering routine (will populate the metadata)
|
||||
call mgxs_init_file(this, node_xsdata, i_listing)
|
||||
call mgxs_init_file(this, node_xsdata)
|
||||
|
||||
if (check_for_node(node_xsdata, "num_polar")) then
|
||||
call get_node_value(node_xsdata, "num_polar", this % n_pol)
|
||||
|
|
@ -1318,11 +1308,10 @@ module mgxs_header
|
|||
! objects
|
||||
!===============================================================================
|
||||
|
||||
subroutine mgxs_combine(this, mat, scatt_type, i_listing)
|
||||
subroutine mgxs_combine(this, mat, scatt_type)
|
||||
class(Mgxs), intent(inout) :: this ! The Mgxs to initialize
|
||||
type(Material), pointer, intent(in) :: mat ! base material
|
||||
integer, intent(in) :: scatt_type ! How is data presented
|
||||
integer, intent(in) :: i_listing ! Index in listings
|
||||
|
||||
! Fill in meta-data from material information
|
||||
if (mat % name == "") then
|
||||
|
|
@ -1331,7 +1320,6 @@ module mgxs_header
|
|||
this % name = mat % name
|
||||
end if
|
||||
this % zaid = -mat % id
|
||||
this % listing = i_listing
|
||||
this % fissionable = mat % fissionable
|
||||
this % scatt_type = scatt_type
|
||||
|
||||
|
|
@ -1342,15 +1330,13 @@ module mgxs_header
|
|||
|
||||
end subroutine mgxs_combine
|
||||
|
||||
subroutine mgxsiso_combine(this, mat, nuclides, groups, max_order, scatt_type, &
|
||||
i_listing)
|
||||
subroutine mgxsiso_combine(this, mat, nuclides, groups, max_order, scatt_type)
|
||||
class(MgxsIso), intent(inout) :: this ! The Mgxs to initialize
|
||||
type(Material), pointer, intent(in) :: mat ! base material
|
||||
type(MgxsContainer), intent(in) :: nuclides(:) ! List of nuclides to harvest from
|
||||
integer, intent(in) :: groups ! Number of E groups
|
||||
integer, intent(in) :: max_order ! Maximum requested order
|
||||
integer, intent(in) :: scatt_type ! How is data presented
|
||||
integer, intent(in) :: i_listing ! Index in listings
|
||||
|
||||
integer :: i ! loop index over nuclides
|
||||
integer :: gin, gout ! group indices
|
||||
|
|
@ -1361,7 +1347,7 @@ module mgxs_header
|
|||
real(8), allocatable :: scatt_coeffs(:, :, :)
|
||||
|
||||
! Set the meta-data
|
||||
call mgxs_combine(this, mat, scatt_type, i_listing)
|
||||
call mgxs_combine(this, mat, scatt_type)
|
||||
|
||||
! Determine the scattering type of our data and ensure all scattering orders
|
||||
! are the same.
|
||||
|
|
@ -1538,15 +1524,13 @@ module mgxs_header
|
|||
|
||||
end subroutine mgxsiso_combine
|
||||
|
||||
subroutine mgxsang_combine(this, mat, nuclides, groups, max_order, scatt_type, &
|
||||
i_listing)
|
||||
subroutine mgxsang_combine(this, mat, nuclides, groups, max_order, scatt_type)
|
||||
class(MgxsAngle), intent(inout) :: this ! The Mgxs to initialize
|
||||
type(Material), pointer, intent(in) :: mat ! base material
|
||||
type(MgxsContainer), intent(in) :: nuclides(:) ! List of nuclides to harvest from
|
||||
integer, intent(in) :: groups ! Number of E groups
|
||||
integer, intent(in) :: max_order ! Maximum requested order
|
||||
integer, intent(in) :: scatt_type ! Legendre or Tabular Scatt?
|
||||
integer, intent(in) :: i_listing ! Index in listings
|
||||
|
||||
integer :: i ! loop index over nuclides
|
||||
integer :: gin, gout ! group indices
|
||||
|
|
@ -1558,7 +1542,7 @@ module mgxs_header
|
|||
real(8), allocatable :: mult_denom(:, :, :, :), scatt_coeffs(:, :, :, :, :)
|
||||
|
||||
! Set the meta-data
|
||||
call mgxs_combine(this, mat, scatt_type, i_listing)
|
||||
call mgxs_combine(this, mat, scatt_type)
|
||||
|
||||
! Get the number of each polar and azi angles and make sure all the
|
||||
! NuclideAngle types have the same number of these angles
|
||||
|
|
@ -1939,4 +1923,4 @@ module mgxs_header
|
|||
|
||||
end subroutine find_angle
|
||||
|
||||
end module mgxs_header
|
||||
end module mgxs_header
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ contains
|
|||
accumulated_fission = .true.
|
||||
case default
|
||||
! Search through all of our secondary reactions
|
||||
do j = 1, nuc % n_reaction
|
||||
do j = 1, size(nuc % reactions)
|
||||
if (nuc % reactions(j) % MT == MT(i)) then
|
||||
! Match found
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ module multipole_header
|
|||
logical :: fissionable = .false. ! Is this isotope fissionable?
|
||||
integer :: length ! Number of poles
|
||||
integer, allocatable :: l_value(:) ! The l index of the pole
|
||||
real(8), allocatable :: pseudo_k0RS(:) ! The value (sqrt(2*mass neutron)/reduced planck constant) * AWR/(AWR + 1) * scattering radius for each l
|
||||
real(8), allocatable :: pseudo_k0RS(:) ! The value (sqrt(2*mass neutron)/reduced planck constant)
|
||||
! * AWR/(AWR + 1) * scattering radius for each l
|
||||
complex(8), allocatable :: data(:,:) ! Contains all of the pole-residue data
|
||||
real(8) :: sqrtAWR ! Square root of the atomic weight ratio
|
||||
|
||||
|
|
|
|||
|
|
@ -1,17 +1,25 @@
|
|||
module nuclide_header
|
||||
|
||||
use, intrinsic :: ISO_FORTRAN_ENV
|
||||
use, intrinsic :: ISO_C_BINDING
|
||||
|
||||
use hdf5, only: HID_T, HSIZE_T, SIZE_T, h5iget_name_f, h5gget_info_f, &
|
||||
h5lget_name_by_idx_f, H5_INDEX_NAME_F, H5_ITER_INC_F
|
||||
use h5lt, only: h5ltpath_valid_f
|
||||
|
||||
use constants
|
||||
use dict_header, only: DictIntInt
|
||||
use endf, only: reaction_name, is_fission, is_disappearance
|
||||
use endf_header, only: Function1D
|
||||
use endf_header, only: Function1D, Constant1D, 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
|
||||
use list_header, only: ListInt
|
||||
use math, only: evaluate_legendre
|
||||
use multipole_header, only: MultipoleArray
|
||||
use product_header, only: AngleEnergyContainer
|
||||
use reaction_header, only: Reaction
|
||||
use secondary_uncorrelated, only: UncorrelatedAngleEnergy
|
||||
use stl_vector, only: VectorInt
|
||||
use string
|
||||
use urr_header, only: UrrData
|
||||
|
|
@ -26,14 +34,14 @@ module nuclide_header
|
|||
|
||||
type :: Nuclide
|
||||
! Nuclide meta-data
|
||||
character(12) :: name ! name of nuclide, e.g. 92235.03c
|
||||
character(20) :: name ! name of nuclide, e.g. U235.71c
|
||||
integer :: zaid ! Z and A identifier, e.g. 92235
|
||||
integer :: metastable ! metastable state
|
||||
real(8) :: awr ! Atomic Weight Ratio
|
||||
integer :: listing ! index in xs_listings
|
||||
real(8) :: kT ! temperature in MeV (k*T)
|
||||
|
||||
! Fission information
|
||||
logical :: fissionable ! nuclide is fissionable?
|
||||
logical :: fissionable = .false. ! nuclide is fissionable?
|
||||
|
||||
! Energy grid information
|
||||
integer :: n_grid ! # of nuclide grid points
|
||||
|
|
@ -61,13 +69,13 @@ module nuclide_header
|
|||
|
||||
! Fission information
|
||||
logical :: has_partial_fission = .false. ! nuclide has partial fission reactions?
|
||||
integer :: n_fission ! # of fission reactions
|
||||
integer :: n_fission = 0 ! # of fission reactions
|
||||
integer :: n_precursor = 0 ! # of delayed neutron precursors
|
||||
integer, allocatable :: index_fission(:) ! indices in reactions
|
||||
class(Function1D), allocatable :: total_nu
|
||||
|
||||
! Unresolved resonance data
|
||||
logical :: urr_present
|
||||
logical :: urr_present = .false.
|
||||
integer :: urr_inelastic
|
||||
type(UrrData), pointer :: urr_data => null()
|
||||
|
||||
|
|
@ -76,7 +84,6 @@ module nuclide_header
|
|||
type(MultipoleArray), pointer :: multipole => null()
|
||||
|
||||
! Reactions
|
||||
integer :: n_reaction ! # of reactions
|
||||
type(Reaction), allocatable :: reactions(:)
|
||||
type(DictIntInt) :: reaction_index ! map MT values to index in reactions
|
||||
! array; used at tally-time
|
||||
|
|
@ -84,7 +91,9 @@ module nuclide_header
|
|||
contains
|
||||
procedure :: clear => nuclide_clear
|
||||
procedure :: print => nuclide_print
|
||||
procedure :: from_hdf5 => nuclide_from_hdf5
|
||||
procedure :: nu => nuclide_nu
|
||||
procedure, private :: create_derived => nuclide_create_derived
|
||||
end type Nuclide
|
||||
|
||||
!===============================================================================
|
||||
|
|
@ -144,24 +153,14 @@ module nuclide_header
|
|||
end type MaterialMacroXS
|
||||
|
||||
!===============================================================================
|
||||
! XSLISTING contains data read from a CE or MG cross_sections.xml file
|
||||
! (or equivalent)
|
||||
! LIBRARY contains data read from a cross_sections.xml file
|
||||
!===============================================================================
|
||||
|
||||
type XsListing
|
||||
character(12) :: name ! table name, e.g. 92235.70c
|
||||
character(12) :: alias ! table alias, e.g. U-235.70c
|
||||
integer :: type ! type of table (cont-E neutron, S(A,b), etc)
|
||||
integer :: zaid ! ZAID identifier = 1000*Z + A
|
||||
integer :: filetype ! ASCII or BINARY
|
||||
integer :: location ! location of table within library
|
||||
integer :: recl ! record length for library
|
||||
integer :: entries ! number of entries per record
|
||||
real(8) :: awr ! atomic weight ratio (# of neutron masses)
|
||||
real(8) :: kT ! Boltzmann constant * temperature (MeV)
|
||||
logical :: metastable ! is this nuclide metastable?
|
||||
character(MAX_FILE_LEN) :: path ! path to library containing table
|
||||
end type XsListing
|
||||
type Library
|
||||
integer :: type
|
||||
character(MAX_WORD_LEN), allocatable :: materials(:)
|
||||
character(MAX_FILE_LEN) :: path
|
||||
end type Library
|
||||
|
||||
contains
|
||||
|
||||
|
|
@ -173,18 +172,270 @@ module nuclide_header
|
|||
class(Nuclide), intent(inout) :: this ! The Nuclide object to clear
|
||||
|
||||
if (associated(this % urr_data)) deallocate(this % urr_data)
|
||||
|
||||
call this % reaction_index % clear()
|
||||
|
||||
if (associated(this % multipole)) deallocate(this % multipole)
|
||||
|
||||
end subroutine nuclide_clear
|
||||
|
||||
subroutine nuclide_from_hdf5(this, group_id)
|
||||
class(Nuclide), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
integer :: i
|
||||
integer :: Z
|
||||
integer :: A
|
||||
integer :: storage_type
|
||||
integer :: max_corder
|
||||
integer :: n_links
|
||||
integer :: hdf5_err
|
||||
integer(HID_T) :: urr_group, nu_group
|
||||
integer(HID_T) :: energy_dset
|
||||
integer(HID_T) :: rxs_group
|
||||
integer(HID_T) :: rx_group
|
||||
integer(HID_T) :: total_nu
|
||||
integer(SIZE_T) :: name_len, name_file_len
|
||||
integer(HSIZE_T) :: j
|
||||
integer(HSIZE_T) :: dims(1)
|
||||
character(MAX_WORD_LEN) :: temp
|
||||
type(VectorInt) :: MTs
|
||||
logical :: exists
|
||||
|
||||
! Get name of nuclide 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(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
|
||||
call read_attribute(this % awr, group_id, 'atomic_weight_ratio')
|
||||
call read_attribute(this % kT, group_id, 'temperature')
|
||||
|
||||
! Read energy grid
|
||||
energy_dset = open_dataset(group_id, 'energy')
|
||||
call get_shape(energy_dset, dims)
|
||||
this % n_grid = int(dims(1), 4)
|
||||
allocate(this % energy(this % n_grid))
|
||||
call read_dataset(this % energy, energy_dset)
|
||||
call close_dataset(energy_dset)
|
||||
|
||||
! Get MT values based on group names
|
||||
rxs_group = open_group(group_id, 'reactions')
|
||||
call h5gget_info_f(rxs_group, storage_type, n_links, max_corder, hdf5_err)
|
||||
do j = 0, n_links - 1
|
||||
call h5lget_name_by_idx_f(rxs_group, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, &
|
||||
j, temp, hdf5_err, name_len)
|
||||
if (starts_with(temp, "reaction_")) then
|
||||
call MTs % push_back(int(str_to_int(temp(10:12))))
|
||||
end if
|
||||
end do
|
||||
|
||||
! Read reactions
|
||||
allocate(this % reactions(MTs % size()))
|
||||
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)
|
||||
call close_group(rx_group)
|
||||
end do
|
||||
call close_group(rxs_group)
|
||||
|
||||
! Read unresolved resonance probability tables if present
|
||||
call h5ltpath_valid_f(group_id, 'urr', .true., exists, hdf5_err)
|
||||
if (exists) then
|
||||
this % urr_present = .true.
|
||||
allocate(this % urr_data)
|
||||
urr_group = open_group(group_id, 'urr')
|
||||
call this % urr_data % from_hdf5(urr_group)
|
||||
|
||||
! if the inelastic competition flag indicates that the inelastic cross
|
||||
! section should be determined from a normal reaction cross section, we need
|
||||
! to get the index of the reaction
|
||||
if (this % urr_data % inelastic_flag > 0) then
|
||||
do i = 1, size(this % reactions)
|
||||
if (this % reactions(i) % MT == this % urr_data % inelastic_flag) then
|
||||
this % urr_inelastic = i
|
||||
end if
|
||||
end do
|
||||
|
||||
! Abort if no corresponding inelastic reaction was found
|
||||
if (this % urr_inelastic == NONE) then
|
||||
call fatal_error("Could not find inelastic reaction specified on &
|
||||
&unresolved resonance probability table.")
|
||||
end if
|
||||
end if
|
||||
|
||||
! Check for negative values
|
||||
if (any(this % urr_data % prob < ZERO)) then
|
||||
call warning("Negative value(s) found on probability table &
|
||||
&for nuclide " // this % name)
|
||||
end if
|
||||
end if
|
||||
|
||||
! Check for nu-total
|
||||
call h5ltpath_valid_f(group_id, 'total_nu', .true., exists, hdf5_err)
|
||||
if (exists) then
|
||||
nu_group = open_group(group_id, 'total_nu')
|
||||
|
||||
! Read total nu data
|
||||
total_nu = open_dataset(nu_group, 'yield')
|
||||
call read_attribute(temp, total_nu, 'type')
|
||||
select case (temp)
|
||||
case ('constant')
|
||||
allocate(Constant1D :: this % total_nu)
|
||||
case ('tabulated')
|
||||
allocate(Tabulated1D :: this % total_nu)
|
||||
case ('polynomial')
|
||||
allocate(Polynomial :: this % total_nu)
|
||||
end select
|
||||
call this % total_nu % from_hdf5(total_nu)
|
||||
call close_dataset(total_nu)
|
||||
|
||||
call close_group(nu_group)
|
||||
end if
|
||||
|
||||
! Create derived cross section data
|
||||
call this % create_derived()
|
||||
|
||||
end subroutine nuclide_from_hdf5
|
||||
|
||||
subroutine nuclide_create_derived(this)
|
||||
class(Nuclide), intent(inout) :: this
|
||||
|
||||
integer :: i
|
||||
integer :: j
|
||||
integer :: k
|
||||
integer :: m
|
||||
integer :: n
|
||||
integer :: i_fission
|
||||
type(ListInt) :: MTs
|
||||
|
||||
! Allocate and initialize derived cross sections
|
||||
allocate(this % total(this % n_grid))
|
||||
allocate(this % elastic(this % n_grid))
|
||||
allocate(this % fission(this % n_grid))
|
||||
allocate(this % nu_fission(this % n_grid))
|
||||
allocate(this % absorption(this % n_grid))
|
||||
this % total(:) = ZERO
|
||||
this % elastic(:) = ZERO
|
||||
this % fission(:) = ZERO
|
||||
this % nu_fission(:) = ZERO
|
||||
this % absorption(:) = ZERO
|
||||
|
||||
i_fission = 0
|
||||
|
||||
do i = 1, size(this % reactions)
|
||||
call MTs % append(this % reactions(i) % MT)
|
||||
call this % reaction_index % add_key(this % reactions(i) % MT, i)
|
||||
|
||||
associate (rx => this % reactions(i))
|
||||
j = rx % threshold
|
||||
n = size(rx % sigma)
|
||||
|
||||
! Skip total inelastic level scattering, gas production cross sections
|
||||
! (MT=200+), etc.
|
||||
if (rx % MT == N_LEVEL .or. rx % MT == N_NONELASTIC) cycle
|
||||
if (rx % MT > N_5N2P .and. rx % MT < N_P0) cycle
|
||||
|
||||
! Skip level cross sections if total is available
|
||||
if (rx % MT >= N_P0 .and. rx % MT <= N_PC .and. MTs % contains(N_P)) cycle
|
||||
if (rx % MT >= N_D0 .and. rx % MT <= N_DC .and. MTs % contains(N_D)) cycle
|
||||
if (rx % MT >= N_T0 .and. rx % MT <= N_TC .and. MTs % contains(N_T)) cycle
|
||||
if (rx % MT >= N_3HE0 .and. rx % MT <= N_3HEC .and. MTs % contains(N_3HE)) cycle
|
||||
if (rx % MT >= N_A0 .and. rx % MT <= N_AC .and. MTs % contains(N_A)) cycle
|
||||
if (rx % MT >= N_2N0 .and. rx % MT <= N_2NC .and. MTs % contains(N_2N)) cycle
|
||||
|
||||
! Copy elastic
|
||||
if (rx % MT == ELASTIC) this % elastic(:) = rx % sigma
|
||||
|
||||
! Add contribution to total cross section
|
||||
this % total(j:j+n-1) = this % total(j:j+n-1) + rx % sigma
|
||||
|
||||
! Add contribution to absorption cross section
|
||||
if (is_disappearance(rx % MT)) then
|
||||
this % absorption(j:j+n-1) = this % absorption(j:j+n-1) + rx % sigma
|
||||
end if
|
||||
|
||||
! Information about fission reactions
|
||||
if (rx % MT == N_FISSION) then
|
||||
allocate(this % index_fission(1))
|
||||
elseif (rx % MT == N_F) then
|
||||
allocate(this % index_fission(PARTIAL_FISSION_MAX))
|
||||
this % has_partial_fission = .true.
|
||||
end if
|
||||
|
||||
! Add contribution to fission cross section
|
||||
if (is_fission(rx % MT)) then
|
||||
this % fissionable = .true.
|
||||
this % fission(j:j+n-1) = this % fission(j:j+n-1) + rx % sigma
|
||||
|
||||
! Also need to add fission cross sections to absorption
|
||||
this % absorption(j:j+n-1) = this % absorption(j:j+n-1) + rx % sigma
|
||||
|
||||
! If total fission reaction is present, there's no need to store the
|
||||
! reaction cross-section since it was copied to this % fission
|
||||
if (rx % MT == N_FISSION) deallocate(rx % sigma)
|
||||
|
||||
! Keep track of this reaction for easy searching later
|
||||
i_fission = i_fission + 1
|
||||
this % index_fission(i_fission) = i
|
||||
this % n_fission = this % n_fission + 1
|
||||
|
||||
! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
! Before the secondary distribution refactor, when the angle/energy
|
||||
! distribution was uncorrelated, no angle was actually sampled. With
|
||||
! the refactor, an angle is always sampled for an uncorrelated
|
||||
! distribution even when no angle distribution exists in the ACE file
|
||||
! (isotropic is assumed). To preserve the RNG stream, we explicitly
|
||||
! mark fission reactions so that we avoid the angle sampling.
|
||||
do k = 1, size(rx % products)
|
||||
if (rx % products(k) % particle == NEUTRON) then
|
||||
do m = 1, size(rx % products(k) % distribution)
|
||||
associate (aedist => rx % products(k) % distribution(m) % obj)
|
||||
select type (aedist)
|
||||
type is (UncorrelatedAngleEnergy)
|
||||
aedist % fission = .true.
|
||||
end select
|
||||
end associate
|
||||
end do
|
||||
end if
|
||||
end do
|
||||
! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||||
end if
|
||||
end associate
|
||||
end do
|
||||
|
||||
! Determine number of delayed neutron precursors
|
||||
if (this % fissionable) then
|
||||
do i = 1, size(this % reactions(this % index_fission(1)) % products)
|
||||
if (this % reactions(this % index_fission(1)) % products(i) % &
|
||||
emission_mode == EMISSION_DELAYED) then
|
||||
this % n_precursor = this % n_precursor + 1
|
||||
end if
|
||||
end do
|
||||
end if
|
||||
|
||||
! Calculate nu-fission cross section
|
||||
if (this % fissionable) then
|
||||
do i = 1, size(this % energy)
|
||||
this % nu_fission(i) = this % nu(this % energy(i), EMISSION_TOTAL) * &
|
||||
this % fission(i)
|
||||
end do
|
||||
else
|
||||
this % nu_fission(:) = ZERO
|
||||
end if
|
||||
|
||||
! Clear MTs set
|
||||
call MTs % clear()
|
||||
end subroutine nuclide_create_derived
|
||||
|
||||
!===============================================================================
|
||||
! NUCLIDE_NU is an interface to the number of fission neutrons produced
|
||||
!===============================================================================
|
||||
|
||||
function nuclide_nu(this, E, emission_mode, group) result(nu)
|
||||
pure function nuclide_nu(this, E, emission_mode, group) result(nu)
|
||||
class(Nuclide), intent(in) :: this
|
||||
real(8), intent(in) :: E
|
||||
integer, intent(in) :: emission_mode
|
||||
|
|
@ -237,8 +488,8 @@ module nuclide_header
|
|||
if (allocated(this % total_nu)) then
|
||||
nu = this % total_nu % evaluate(E)
|
||||
else
|
||||
associate (rx => this % reactions(this % index_fission(1)))
|
||||
nu = rx % products(1) % yield % evaluate(E)
|
||||
associate (product => this % reactions(this % index_fission(1)) % products(1))
|
||||
nu = product % yield % evaluate(E)
|
||||
end associate
|
||||
end if
|
||||
end select
|
||||
|
|
@ -279,11 +530,11 @@ module nuclide_header
|
|||
write(unit_,*) ' # of grid points = ' // trim(to_str(this % n_grid))
|
||||
write(unit_,*) ' Fissionable = ', this % fissionable
|
||||
write(unit_,*) ' # of fission reactions = ' // trim(to_str(this % n_fission))
|
||||
write(unit_,*) ' # of reactions = ' // trim(to_str(this % n_reaction))
|
||||
write(unit_,*) ' # of reactions = ' // trim(to_str(size(this % reactions)))
|
||||
|
||||
! Information on each reaction
|
||||
write(unit_,*) ' Reaction Q-value COM IE'
|
||||
do i = 1, this % n_reaction
|
||||
do i = 1, size(this % reactions)
|
||||
associate (rxn => this % reactions(i))
|
||||
write(unit_,'(3X,A11,1X,F8.3,3X,L1,3X,I6)') &
|
||||
reaction_name(rxn % MT), rxn % Q_value, rxn % scatter_in_cm, &
|
||||
|
|
|
|||
|
|
@ -741,7 +741,6 @@ contains
|
|||
integer :: filter_index ! index in results array for filters
|
||||
integer :: score_index ! scoring bin index
|
||||
integer :: i_nuclide ! index in nuclides array
|
||||
integer :: i_listing ! index in xs_listings array
|
||||
integer :: n_order ! loop index for moment orders
|
||||
integer :: nm_order ! loop index for Ynm moment orders
|
||||
integer :: unit_tally ! tallies.out file unit
|
||||
|
|
@ -909,13 +908,8 @@ contains
|
|||
write(UNIT=unit_tally, FMT='(1X,2A,1X,A)') repeat(" ", indent), &
|
||||
"Total Material"
|
||||
else
|
||||
if (run_CE) then
|
||||
i_listing = nuclides(i_nuclide) % listing
|
||||
else
|
||||
i_listing = nuclides_MG(i_nuclide) % obj % listing
|
||||
end if
|
||||
write(UNIT=unit_tally, FMT='(1X,2A,1X,A)') repeat(" ", indent), &
|
||||
trim(xs_listings(i_listing) % alias)
|
||||
trim(nuclides(i_nuclide) % name)
|
||||
end if
|
||||
|
||||
indent = indent + 2
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ contains
|
|||
i = i + 1
|
||||
|
||||
! Check to make sure inelastic scattering reaction sampled
|
||||
if (i > nuc % n_reaction) then
|
||||
if (i > size(nuc % reactions)) then
|
||||
call write_particle_restart(p)
|
||||
call fatal_error("Did not sample any reaction for nuclide " &
|
||||
&// trim(nuc % name))
|
||||
|
|
|
|||
|
|
@ -1,10 +1,19 @@
|
|||
module product_header
|
||||
|
||||
use hdf5, only: HID_T
|
||||
|
||||
use angleenergy_header, only: AngleEnergyContainer
|
||||
use constants, only: ZERO, MAX_WORD_LEN, EMISSION_PROMPT, EMISSION_DELAYED, &
|
||||
EMISSION_TOTAL, NEUTRON, PHOTON
|
||||
use endf_header, only: Tabulated1D, Function1D, Constant1D, Polynomial
|
||||
use hdf5_interface, only: read_attribute, open_group, close_group, &
|
||||
open_dataset, close_dataset, read_dataset
|
||||
use random_lcg, only: prn
|
||||
use secondary_correlated, only: CorrelatedAngleEnergy
|
||||
use secondary_kalbach, only: KalbachMann
|
||||
use secondary_nbody, only: NBodyPhaseSpace
|
||||
use secondary_uncorrelated, only: UncorrelatedAngleEnergy
|
||||
use string, only: to_str
|
||||
|
||||
!===============================================================================
|
||||
! REACTIONPRODUCT stores a data for a reaction product including its yield and
|
||||
|
|
@ -23,6 +32,7 @@ module product_header
|
|||
type(AngleEnergyContainer), allocatable :: distribution(:)
|
||||
contains
|
||||
procedure :: sample => reactionproduct_sample
|
||||
procedure :: from_hdf5 => reactionproduct_from_hdf5
|
||||
end type ReactionProduct
|
||||
|
||||
contains
|
||||
|
|
@ -59,4 +69,89 @@ contains
|
|||
|
||||
end subroutine reactionproduct_sample
|
||||
|
||||
subroutine reactionproduct_from_hdf5(this, group_id)
|
||||
class(ReactionProduct), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
integer :: i
|
||||
integer :: n
|
||||
integer(HID_T) :: dgroup
|
||||
integer(HID_T) :: app
|
||||
integer(HID_T) :: yield
|
||||
character(MAX_WORD_LEN) :: temp
|
||||
|
||||
! Read particle type
|
||||
call read_attribute(temp, group_id, 'particle')
|
||||
select case (temp)
|
||||
case ('neutron')
|
||||
this % particle = NEUTRON
|
||||
case ('photon')
|
||||
this % particle = PHOTON
|
||||
end select
|
||||
|
||||
! Read emission mode and decay rate
|
||||
call read_attribute(temp, group_id, 'emission_mode')
|
||||
select case (temp)
|
||||
case ('prompt')
|
||||
this % emission_mode = EMISSION_PROMPT
|
||||
case ('delayed')
|
||||
this % emission_mode = EMISSION_DELAYED
|
||||
case ('total')
|
||||
this % emission_mode = EMISSION_TOTAL
|
||||
end select
|
||||
|
||||
! Read decay rate for delayed emission
|
||||
if (this % emission_mode == EMISSION_DELAYED) then
|
||||
call read_attribute(this % decay_rate, group_id, 'decay_rate')
|
||||
end if
|
||||
|
||||
! Read secondary particle yield
|
||||
yield = open_dataset(group_id, 'yield')
|
||||
call read_attribute(temp, yield, 'type')
|
||||
select case (temp)
|
||||
case ('constant')
|
||||
allocate(Constant1D :: this % yield)
|
||||
case ('tabulated')
|
||||
allocate(Tabulated1D :: this % yield)
|
||||
case ('polynomial')
|
||||
allocate(Polynomial :: this % yield)
|
||||
end select
|
||||
call this % yield % from_hdf5(yield)
|
||||
call close_dataset(yield)
|
||||
|
||||
call read_attribute(n, group_id, 'n_distribution')
|
||||
allocate(this%applicability(n))
|
||||
allocate(this%distribution(n))
|
||||
|
||||
do i = 1, n
|
||||
dgroup = open_group(group_id, trim('distribution_' // to_str(i - 1)))
|
||||
|
||||
! Read applicability
|
||||
if (n > 1) then
|
||||
app = open_dataset(dgroup, 'applicability')
|
||||
call this%applicability(i)%from_hdf5(app)
|
||||
call close_dataset(app)
|
||||
end if
|
||||
|
||||
! Read type of distribution and allocate accordingly
|
||||
call read_attribute(temp, dgroup, 'type')
|
||||
select case (temp)
|
||||
case ('uncorrelated')
|
||||
allocate(UncorrelatedAngleEnergy :: this%distribution(i)%obj)
|
||||
case ('correlated')
|
||||
allocate(CorrelatedAngleEnergy :: this%distribution(i)%obj)
|
||||
case ('nbody')
|
||||
allocate(NBodyPhaseSpace :: this%distribution(i)%obj)
|
||||
case ('kalbach-mann')
|
||||
allocate(KalbachMann :: this%distribution(i)%obj)
|
||||
end select
|
||||
|
||||
! Read distribution data
|
||||
call this%distribution(i)%obj%from_hdf5(dgroup)
|
||||
|
||||
call close_group(dgroup)
|
||||
end do
|
||||
|
||||
end subroutine reactionproduct_from_hdf5
|
||||
|
||||
end module product_header
|
||||
|
|
|
|||
|
|
@ -1,6 +1,13 @@
|
|||
module reaction_header
|
||||
|
||||
use hdf5, only: HID_T, HSIZE_T, SIZE_T, h5gget_info_f, h5lget_name_by_idx_f, &
|
||||
H5_INDEX_NAME_F, H5_ITER_INC_F
|
||||
|
||||
use constants, only: MAX_WORD_LEN
|
||||
use hdf5_interface, only: read_attribute, open_group, close_group, &
|
||||
open_dataset, read_dataset, close_dataset, get_shape
|
||||
use product_header, only: ReactionProduct
|
||||
use string, only: to_str, starts_with
|
||||
|
||||
implicit none
|
||||
|
||||
|
|
@ -16,6 +23,59 @@ module reaction_header
|
|||
logical :: scatter_in_cm ! scattering system in center-of-mass?
|
||||
real(8), allocatable :: sigma(:) ! Cross section values
|
||||
type(ReactionProduct), allocatable :: products(:)
|
||||
contains
|
||||
procedure :: from_hdf5 => reaction_from_hdf5
|
||||
end type Reaction
|
||||
|
||||
contains
|
||||
|
||||
subroutine reaction_from_hdf5(this, group_id)
|
||||
class(Reaction), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
integer :: i
|
||||
integer :: cm
|
||||
integer :: n_product
|
||||
integer :: storage_type
|
||||
integer :: max_corder
|
||||
integer :: n_links
|
||||
integer :: hdf5_err
|
||||
integer(HID_T) :: pgroup
|
||||
integer(HID_T) :: xs
|
||||
integer(SIZE_T) :: name_len
|
||||
integer(HSIZE_T) :: dims(1)
|
||||
integer(HSIZE_T) :: j
|
||||
character(MAX_WORD_LEN) :: name
|
||||
|
||||
call read_attribute(this % Q_value, group_id, 'Q_value')
|
||||
call read_attribute(this % MT, group_id, 'mt')
|
||||
call read_attribute(this % threshold, group_id, 'threshold_idx')
|
||||
call read_attribute(cm, group_id, 'center_of_mass')
|
||||
this % scatter_in_cm = (cm == 1)
|
||||
|
||||
! Read cross section
|
||||
xs = open_dataset(group_id, 'xs')
|
||||
call get_shape(xs, dims)
|
||||
allocate(this % sigma(dims(1)))
|
||||
call read_dataset(this % sigma, xs)
|
||||
call close_dataset(xs)
|
||||
|
||||
! Determine number of products
|
||||
call h5gget_info_f(group_id, storage_type, n_links, max_corder, hdf5_err)
|
||||
n_product = 0
|
||||
do j = 0, n_links - 1
|
||||
call h5lget_name_by_idx_f(group_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, &
|
||||
j, name, hdf5_err, name_len)
|
||||
if (starts_with(name, "product_")) n_product = n_product + 1
|
||||
end do
|
||||
|
||||
! Read products
|
||||
allocate(this % products(n_product))
|
||||
do i = 1, n_product
|
||||
pgroup = open_group(group_id, 'product_' // trim(to_str(i - 1)))
|
||||
call this % products(i) % from_hdf5(pgroup)
|
||||
call close_group(pgroup)
|
||||
end do
|
||||
end subroutine reaction_from_hdf5
|
||||
|
||||
end module reaction_header
|
||||
|
|
|
|||
|
|
@ -1,25 +1,12 @@
|
|||
element cross_sections {
|
||||
element ace_table {
|
||||
(element name { xsd:string { maxLength = "15" } } |
|
||||
attribute name { xsd:string { maxLength = "15" } }) &
|
||||
(element alias { xsd:string { maxLength = "15" } } |
|
||||
attribute alias { xsd:string { maxLength = "15" } })? &
|
||||
(element zaid { xsd:int } | attribute zaid { xsd:int }) &
|
||||
(element metastable { xsd:int } | attribute metastable { xsd:int })? &
|
||||
(element awr { xsd:double } | attribute awr { xsd:double }) &
|
||||
(element temperature { xsd:double } | attribute temperature { xsd:double }) &
|
||||
(element path { xsd:string { maxLength = "255" } } |
|
||||
attribute path { xsd:string { maxLength = "255" } }) &
|
||||
(element location { xsd:int } | attribute location { xsd:int })? &
|
||||
(element filetype { ( "ascii" | "binary" ) } |
|
||||
attribute filetype { ( "ascii" | "binary" ) })?
|
||||
element library {
|
||||
(element materials { xsd:string } |
|
||||
attribute materials { xsd:string }) &
|
||||
(element type { xsd:string } |
|
||||
attribute type { xsd:string }) &
|
||||
(element path { xsd:string } |
|
||||
attribute path { xsd:string })
|
||||
}* &
|
||||
|
||||
element directory { xsd:string { maxLength = "255" } }? &
|
||||
|
||||
element filetype { ( "ascii" | "binary" ) } &
|
||||
|
||||
element record_length { xsd:int }? &
|
||||
|
||||
element entries { xsd:int }?
|
||||
element directory { xsd:string { maxLength = "255" } }?
|
||||
}
|
||||
|
|
@ -2,106 +2,32 @@
|
|||
<element name="cross_sections" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
|
||||
<interleave>
|
||||
<zeroOrMore>
|
||||
<element name="ace_table">
|
||||
<element name="library">
|
||||
<interleave>
|
||||
<choice>
|
||||
<element name="name">
|
||||
<data type="string">
|
||||
<param name="maxLength">15</param>
|
||||
</data>
|
||||
<element name="materials">
|
||||
<data type="string"/>
|
||||
</element>
|
||||
<attribute name="name">
|
||||
<data type="string">
|
||||
<param name="maxLength">15</param>
|
||||
</data>
|
||||
</attribute>
|
||||
</choice>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="alias">
|
||||
<data type="string">
|
||||
<param name="maxLength">15</param>
|
||||
</data>
|
||||
</element>
|
||||
<attribute name="alias">
|
||||
<data type="string">
|
||||
<param name="maxLength">15</param>
|
||||
</data>
|
||||
</attribute>
|
||||
</choice>
|
||||
</optional>
|
||||
<choice>
|
||||
<element name="zaid">
|
||||
<data type="int"/>
|
||||
</element>
|
||||
<attribute name="zaid">
|
||||
<data type="int"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="metastable">
|
||||
<data type="int"/>
|
||||
</element>
|
||||
<attribute name="metastable">
|
||||
<data type="int"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
</optional>
|
||||
<choice>
|
||||
<element name="awr">
|
||||
<data type="double"/>
|
||||
</element>
|
||||
<attribute name="awr">
|
||||
<data type="double"/>
|
||||
<attribute name="materials">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
<choice>
|
||||
<element name="temperature">
|
||||
<data type="double"/>
|
||||
<element name="type">
|
||||
<data type="string"/>
|
||||
</element>
|
||||
<attribute name="temperature">
|
||||
<data type="double"/>
|
||||
<attribute name="type">
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
<choice>
|
||||
<element name="path">
|
||||
<data type="string">
|
||||
<param name="maxLength">255</param>
|
||||
</data>
|
||||
<data type="string"/>
|
||||
</element>
|
||||
<attribute name="path">
|
||||
<data type="string">
|
||||
<param name="maxLength">255</param>
|
||||
</data>
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="location">
|
||||
<data type="int"/>
|
||||
</element>
|
||||
<attribute name="location">
|
||||
<data type="int"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
</optional>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="filetype">
|
||||
<choice>
|
||||
<value>ascii</value>
|
||||
<value>binary</value>
|
||||
</choice>
|
||||
</element>
|
||||
<attribute name="filetype">
|
||||
<choice>
|
||||
<value>ascii</value>
|
||||
<value>binary</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</choice>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
|
|
@ -112,21 +38,5 @@
|
|||
</data>
|
||||
</element>
|
||||
</optional>
|
||||
<element name="filetype">
|
||||
<choice>
|
||||
<value>ascii</value>
|
||||
<value>binary</value>
|
||||
</choice>
|
||||
</element>
|
||||
<optional>
|
||||
<element name="record_length">
|
||||
<data type="int"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="entries">
|
||||
<data type="int"/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
|
|
|
|||
|
|
@ -11,8 +11,7 @@ element materials {
|
|||
} &
|
||||
|
||||
element nuclide {
|
||||
(element name { xsd:string { maxLength = "7" } } |
|
||||
attribute name { xsd:string { maxLength = "7" } }) &
|
||||
(element name { xsd:string } | attribute name { xsd:string }) &
|
||||
(element xs { xsd:string { maxLength = "5" } } |
|
||||
attribute xs { xsd:string { maxLength = "5" } })? &
|
||||
(element scattering { ( "data" | "iso-in-lab" ) } |
|
||||
|
|
@ -44,8 +43,7 @@ element materials {
|
|||
}* &
|
||||
|
||||
element sab {
|
||||
(element name { xsd:string { maxLength = "7" } } |
|
||||
attribute name { xsd:string { maxLength = "7" } }) &
|
||||
(element name { xsd:string } | attribute name { xsd:string }) &
|
||||
(element xs { xsd:string { maxLength = "5" } } |
|
||||
attribute xs { xsd:string { maxLength = "5" } })?
|
||||
}*
|
||||
|
|
|
|||
|
|
@ -57,26 +57,22 @@
|
|||
<interleave>
|
||||
<choice>
|
||||
<element name="name">
|
||||
<data type="string">
|
||||
<param name="maxLength">7</param>
|
||||
</data>
|
||||
<data type="string"/>
|
||||
</element>
|
||||
<attribute name="name">
|
||||
<data type="string">
|
||||
<param name="maxLength">7</param>
|
||||
</data>
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="xs">
|
||||
<data type="string">
|
||||
<param name="maxLength">3</param>
|
||||
<param name="maxLength">5</param>
|
||||
</data>
|
||||
</element>
|
||||
<attribute name="xs">
|
||||
<data type="string">
|
||||
<param name="maxLength">3</param>
|
||||
<param name="maxLength">5</param>
|
||||
</data>
|
||||
</attribute>
|
||||
</choice>
|
||||
|
|
@ -123,25 +119,21 @@
|
|||
<interleave>
|
||||
<choice>
|
||||
<element name="name">
|
||||
<data type="string">
|
||||
<param name="maxLength">7</param>
|
||||
</data>
|
||||
<data type="string"/>
|
||||
</element>
|
||||
<attribute name="name">
|
||||
<data type="string">
|
||||
<param name="maxLength">7</param>
|
||||
</data>
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
<choice>
|
||||
<element name="xs">
|
||||
<data type="string">
|
||||
<param name="maxLength">3</param>
|
||||
<param name="maxLength">5</param>
|
||||
</data>
|
||||
</element>
|
||||
<attribute name="xs">
|
||||
<data type="string">
|
||||
<param name="maxLength">3</param>
|
||||
<param name="maxLength">5</param>
|
||||
</data>
|
||||
</attribute>
|
||||
</choice>
|
||||
|
|
@ -167,12 +159,12 @@
|
|||
<choice>
|
||||
<element name="xs">
|
||||
<data type="string">
|
||||
<param name="maxLength">3</param>
|
||||
<param name="maxLength">5</param>
|
||||
</data>
|
||||
</element>
|
||||
<attribute name="xs">
|
||||
<data type="string">
|
||||
<param name="maxLength">3</param>
|
||||
<param name="maxLength">5</param>
|
||||
</data>
|
||||
</attribute>
|
||||
</choice>
|
||||
|
|
@ -219,26 +211,22 @@
|
|||
<interleave>
|
||||
<choice>
|
||||
<element name="name">
|
||||
<data type="string">
|
||||
<param name="maxLength">7</param>
|
||||
</data>
|
||||
<data type="string"/>
|
||||
</element>
|
||||
<attribute name="name">
|
||||
<data type="string">
|
||||
<param name="maxLength">7</param>
|
||||
</data>
|
||||
<data type="string"/>
|
||||
</attribute>
|
||||
</choice>
|
||||
<optional>
|
||||
<choice>
|
||||
<element name="xs">
|
||||
<data type="string">
|
||||
<param name="maxLength">3</param>
|
||||
<param name="maxLength">5</param>
|
||||
</data>
|
||||
</element>
|
||||
<attribute name="xs">
|
||||
<data type="string">
|
||||
<param name="maxLength">3</param>
|
||||
<param name="maxLength">5</param>
|
||||
</data>
|
||||
</attribute>
|
||||
</choice>
|
||||
|
|
@ -252,7 +240,7 @@
|
|||
<optional>
|
||||
<element name="default_xs">
|
||||
<data type="string">
|
||||
<param name="maxLength">3</param>
|
||||
<param name="maxLength">5</param>
|
||||
</data>
|
||||
</element>
|
||||
</optional>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,12 @@ module sab_header
|
|||
use, intrinsic :: ISO_FORTRAN_ENV
|
||||
|
||||
use constants
|
||||
use distribution_univariate, only: Tabular
|
||||
use hdf5, only: HID_T, HSIZE_T
|
||||
use h5lt, only: h5ltpath_valid_f
|
||||
use hdf5_interface, only: read_attribute, get_shape, open_group, close_group, &
|
||||
open_dataset, read_dataset, close_dataset
|
||||
use secondary_correlated, only: CorrelatedAngleEnergy
|
||||
use string, only: to_str
|
||||
|
||||
implicit none
|
||||
|
|
@ -27,10 +33,10 @@ module sab_header
|
|||
!===============================================================================
|
||||
|
||||
type SAlphaBeta
|
||||
character(10) :: name ! name of table, e.g. lwtr.10t
|
||||
real(8) :: awr ! weight of nucleus in neutron masses
|
||||
real(8) :: kT ! temperature in MeV (k*T)
|
||||
integer :: n_zaid ! Number of valid zaids
|
||||
character(100) :: name ! name of table, e.g. lwtr.10t
|
||||
real(8) :: awr ! weight of nucleus in neutron masses
|
||||
real(8) :: kT ! temperature in MeV (k*T)
|
||||
integer :: n_zaid ! Number of valid zaids
|
||||
integer, allocatable :: zaid(:) ! List of valid Z and A identifiers, e.g. 6012
|
||||
|
||||
! threshold for S(a,b) treatment (usually ~4 eV)
|
||||
|
|
@ -61,90 +67,247 @@ module sab_header
|
|||
real(8), allocatable :: elastic_P(:)
|
||||
real(8), allocatable :: elastic_mu(:,:)
|
||||
contains
|
||||
procedure :: print => print_sab_table
|
||||
procedure :: print => salphabeta_print
|
||||
procedure :: from_hdf5 => salphabeta_from_hdf5
|
||||
end type SAlphaBeta
|
||||
|
||||
contains
|
||||
contains
|
||||
|
||||
!===============================================================================
|
||||
! PRINT_SAB_TABLE displays information about a S(a,b) table containing data
|
||||
! describing thermal scattering from bound materials such as hydrogen in water.
|
||||
!===============================================================================
|
||||
|
||||
subroutine print_sab_table(this, unit)
|
||||
class(SAlphaBeta), intent(in) :: this
|
||||
integer, intent(in), optional :: unit
|
||||
subroutine salphabeta_print(this, unit)
|
||||
class(SAlphaBeta), intent(in) :: this
|
||||
integer, intent(in), optional :: unit
|
||||
|
||||
integer :: size_sab ! memory used by S(a,b) table
|
||||
integer :: unit_ ! unit to write to
|
||||
integer :: i ! Loop counter for parsing through this % zaid
|
||||
integer :: char_count ! Counter for the number of characters on a line
|
||||
integer :: size_sab ! memory used by S(a,b) table
|
||||
integer :: unit_ ! unit to write to
|
||||
integer :: i ! Loop counter for parsing through this % zaid
|
||||
integer :: char_count ! Counter for the number of characters on a line
|
||||
|
||||
! set default unit for writing information
|
||||
if (present(unit)) then
|
||||
unit_ = unit
|
||||
! set default unit for writing information
|
||||
if (present(unit)) then
|
||||
unit_ = unit
|
||||
else
|
||||
unit_ = OUTPUT_UNIT
|
||||
end if
|
||||
|
||||
! Basic S(a,b) table information
|
||||
write(unit_,*) 'S(a,b) Table ' // trim(this % name)
|
||||
write(unit_,'(A)',advance="no") ' zaids = '
|
||||
! Initialize the counter based on the above string
|
||||
char_count = 11
|
||||
do i = 1, this % n_zaid
|
||||
! Deal with a line thats too long
|
||||
if (char_count >= 73) then ! 73 = 80 - (5 ZAID chars + 1 space + 1 comma)
|
||||
! End the line
|
||||
write(unit_,*) ""
|
||||
! Add 11 leading blanks
|
||||
write(unit_,'(A)', advance="no") " "
|
||||
! reset the counter to 11
|
||||
char_count = 11
|
||||
end if
|
||||
if (i < this % n_zaid) then
|
||||
! Include a comma
|
||||
write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i))) // ", "
|
||||
char_count = char_count + len(trim(to_str(this % zaid(i)))) + 2
|
||||
else
|
||||
unit_ = OUTPUT_UNIT
|
||||
! Don't include a comma, since we are all done
|
||||
write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i)))
|
||||
end if
|
||||
|
||||
! Basic S(a,b) table information
|
||||
write(unit_,*) 'S(a,b) Table ' // trim(this % name)
|
||||
write(unit_,'(A)',advance="no") ' zaids = '
|
||||
! Initialize the counter based on the above string
|
||||
char_count = 11
|
||||
do i = 1, this % n_zaid
|
||||
! Deal with a line thats too long
|
||||
if (char_count >= 73) then ! 73 = 80 - (5 ZAID chars + 1 space + 1 comma)
|
||||
! End the line
|
||||
write(unit_,*) ""
|
||||
! Add 11 leading blanks
|
||||
write(unit_,'(A)', advance="no") " "
|
||||
! reset the counter to 11
|
||||
char_count = 11
|
||||
end if
|
||||
if (i < this % n_zaid) then
|
||||
! Include a comma
|
||||
write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i))) // ", "
|
||||
char_count = char_count + len(trim(to_str(this % zaid(i)))) + 2
|
||||
else
|
||||
! Don't include a comma, since we are all done
|
||||
write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i)))
|
||||
end if
|
||||
end do
|
||||
write(unit_,*) "" ! Move to next line
|
||||
write(unit_,*) ' awr = ' // trim(to_str(this % awr))
|
||||
write(unit_,*) ' kT = ' // trim(to_str(this % kT))
|
||||
|
||||
end do
|
||||
write(unit_,*) "" ! Move to next line
|
||||
write(unit_,*) ' awr = ' // trim(to_str(this % awr))
|
||||
write(unit_,*) ' kT = ' // trim(to_str(this % kT))
|
||||
! Inelastic data
|
||||
write(unit_,*) ' # of Incoming Energies (Inelastic) = ' // &
|
||||
trim(to_str(this % n_inelastic_e_in))
|
||||
write(unit_,*) ' # of Outgoing Energies (Inelastic) = ' // &
|
||||
trim(to_str(this % n_inelastic_e_out))
|
||||
write(unit_,*) ' # of Outgoing Angles (Inelastic) = ' // &
|
||||
trim(to_str(this % n_inelastic_mu))
|
||||
write(unit_,*) ' Threshold for Inelastic = ' // &
|
||||
trim(to_str(this % threshold_inelastic))
|
||||
|
||||
! Inelastic data
|
||||
write(unit_,*) ' # of Incoming Energies (Inelastic) = ' // &
|
||||
trim(to_str(this % n_inelastic_e_in))
|
||||
write(unit_,*) ' # of Outgoing Energies (Inelastic) = ' // &
|
||||
trim(to_str(this % n_inelastic_e_out))
|
||||
write(unit_,*) ' # of Outgoing Angles (Inelastic) = ' // &
|
||||
trim(to_str(this % n_inelastic_mu))
|
||||
write(unit_,*) ' Threshold for Inelastic = ' // &
|
||||
trim(to_str(this % threshold_inelastic))
|
||||
! Elastic data
|
||||
if (this % n_elastic_e_in > 0) then
|
||||
write(unit_,*) ' # of Incoming Energies (Elastic) = ' // &
|
||||
trim(to_str(this % n_elastic_e_in))
|
||||
write(unit_,*) ' # of Outgoing Angles (Elastic) = ' // &
|
||||
trim(to_str(this % n_elastic_mu))
|
||||
write(unit_,*) ' Threshold for Elastic = ' // &
|
||||
trim(to_str(this % threshold_elastic))
|
||||
end if
|
||||
|
||||
! Elastic data
|
||||
if (this % n_elastic_e_in > 0) then
|
||||
write(unit_,*) ' # of Incoming Energies (Elastic) = ' // &
|
||||
trim(to_str(this % n_elastic_e_in))
|
||||
write(unit_,*) ' # of Outgoing Angles (Elastic) = ' // &
|
||||
trim(to_str(this % n_elastic_mu))
|
||||
write(unit_,*) ' Threshold for Elastic = ' // &
|
||||
trim(to_str(this % threshold_elastic))
|
||||
! Determine memory used by S(a,b) table and write out
|
||||
size_sab = 8 * (this % n_inelastic_e_in * (2 + this % n_inelastic_e_out * &
|
||||
(1 + this % n_inelastic_mu)) + this % n_elastic_e_in * &
|
||||
(2 + this % n_elastic_mu))
|
||||
write(unit_,*) ' Memory Used = ' // trim(to_str(size_sab)) // ' bytes'
|
||||
|
||||
! Blank line at end
|
||||
write(unit_,*)
|
||||
|
||||
end subroutine salphabeta_print
|
||||
|
||||
subroutine salphabeta_from_hdf5(this, group_id)
|
||||
class(SAlphaBeta), intent(inout) :: this
|
||||
integer(HID_T), intent(in) :: group_id
|
||||
|
||||
integer :: i, j
|
||||
integer :: n_energy, n_energy_out, n_mu
|
||||
integer :: hdf5_err
|
||||
integer(HID_T) :: elastic_group
|
||||
integer(HID_T) :: inelastic_group
|
||||
integer(HID_T) :: dset_id
|
||||
integer(HSIZE_T) :: dims2(2)
|
||||
integer(HSIZE_T) :: dims3(3)
|
||||
real(8), allocatable :: temp(:,:)
|
||||
character(20) :: type
|
||||
logical :: exists
|
||||
type(CorrelatedAngleEnergy) :: correlated_dist
|
||||
|
||||
call read_attribute(this % awr, group_id, 'atomic_weight_ratio')
|
||||
call read_attribute(this % kT, group_id, 'temperature')
|
||||
call read_attribute(this % zaid, group_id, 'zaids')
|
||||
this % n_zaid = size(this % zaid)
|
||||
|
||||
! Coherent elastic data
|
||||
call h5ltpath_valid_f(group_id, 'elastic', .true., exists, hdf5_err)
|
||||
if (exists) then
|
||||
! Read cross section data
|
||||
elastic_group = open_group(group_id, 'elastic')
|
||||
dset_id = open_dataset(elastic_group, 'xs')
|
||||
call read_attribute(type, dset_id, 'type')
|
||||
call get_shape(dset_id, dims2)
|
||||
allocate(temp(dims2(1), dims2(2)))
|
||||
call read_dataset(temp, dset_id)
|
||||
call close_dataset(dset_id)
|
||||
|
||||
! Set cross section data and type
|
||||
this % n_elastic_e_in = int(dims2(1), 4)
|
||||
allocate(this % elastic_e_in(this % n_elastic_e_in))
|
||||
allocate(this % elastic_P(this % n_elastic_e_in))
|
||||
this % elastic_e_in(:) = temp(:, 1)
|
||||
this % elastic_P(:) = temp(:, 2)
|
||||
select case (type)
|
||||
case ('tab1')
|
||||
this % elastic_mode = SAB_ELASTIC_DISCRETE
|
||||
case ('bragg')
|
||||
this % elastic_mode = SAB_ELASTIC_EXACT
|
||||
end select
|
||||
deallocate(temp)
|
||||
|
||||
! Set elastic threshold
|
||||
this % threshold_elastic = this % elastic_e_in(this % n_elastic_e_in)
|
||||
|
||||
! Read angle distribution
|
||||
if (this % elastic_mode /= SAB_ELASTIC_EXACT) then
|
||||
dset_id = open_dataset(elastic_group, 'mu_out')
|
||||
call get_shape(dset_id, dims2)
|
||||
this % n_elastic_mu = int(dims2(1), 4)
|
||||
allocate(this % elastic_mu(dims2(1), dims2(2)))
|
||||
call read_dataset(this % elastic_mu, dset_id)
|
||||
call close_dataset(dset_id)
|
||||
end if
|
||||
|
||||
! Determine memory used by S(a,b) table and write out
|
||||
size_sab = 8 * (this % n_inelastic_e_in * (2 + this % n_inelastic_e_out * &
|
||||
(1 + this % n_inelastic_mu)) + this % n_elastic_e_in * &
|
||||
(2 + this % n_elastic_mu))
|
||||
write(unit_,*) ' Memory Used = ' // trim(to_str(size_sab)) // ' bytes'
|
||||
call close_group(elastic_group)
|
||||
end if
|
||||
|
||||
! Blank line at end
|
||||
write(unit_,*)
|
||||
! Inelastic data
|
||||
call h5ltpath_valid_f(group_id, 'inelastic', .true., exists, hdf5_err)
|
||||
if (exists) then
|
||||
! Read type of inelastic data
|
||||
inelastic_group = open_group(group_id, 'inelastic')
|
||||
call read_attribute(type, inelastic_group, 'secondary_mode')
|
||||
select case (type)
|
||||
case ('equal')
|
||||
this % secondary_mode = SAB_SECONDARY_EQUAL
|
||||
case ('skewed')
|
||||
this % secondary_mode = SAB_SECONDARY_SKEWED
|
||||
case ('continuous')
|
||||
this % secondary_mode = SAB_SECONDARY_CONT
|
||||
end select
|
||||
|
||||
end subroutine print_sab_table
|
||||
! Read cross section data
|
||||
dset_id = open_dataset(inelastic_group, 'xs')
|
||||
call get_shape(dset_id, dims2)
|
||||
allocate(temp(dims2(1), dims2(2)))
|
||||
call read_dataset(temp, dset_id)
|
||||
call close_dataset(dset_id)
|
||||
|
||||
! Set cross section data
|
||||
this % n_inelastic_e_in = int(dims2(1), 4)
|
||||
allocate(this % inelastic_e_in(this % n_inelastic_e_in))
|
||||
allocate(this % inelastic_sigma(this % n_inelastic_e_in))
|
||||
this % inelastic_e_in(:) = temp(:, 1)
|
||||
this % inelastic_sigma(:) = temp(:, 2)
|
||||
deallocate(temp)
|
||||
|
||||
! Set inelastic threshold
|
||||
this % threshold_inelastic = this % inelastic_e_in(this % n_inelastic_e_in)
|
||||
|
||||
if (this % secondary_mode /= SAB_SECONDARY_CONT) then
|
||||
! Read energy distribution
|
||||
dset_id = open_dataset(inelastic_group, 'energy_out')
|
||||
call get_shape(dset_id, dims2)
|
||||
this % n_inelastic_e_out = int(dims2(1), 4)
|
||||
allocate(this % inelastic_e_out(dims2(1), dims2(2)))
|
||||
call read_dataset(this % inelastic_e_out, dset_id)
|
||||
call close_dataset(dset_id)
|
||||
|
||||
! Read angle distribution
|
||||
dset_id = open_dataset(inelastic_group, 'mu_out')
|
||||
call get_shape(dset_id, dims3)
|
||||
this % n_inelastic_mu = int(dims3(1), 4)
|
||||
allocate(this % inelastic_mu(dims3(1), dims3(2), dims3(3)))
|
||||
call read_dataset(this % inelastic_mu, dset_id)
|
||||
call close_dataset(dset_id)
|
||||
else
|
||||
! Read correlated angle-energy distribution
|
||||
call correlated_dist % from_hdf5(inelastic_group)
|
||||
|
||||
! Convert to S(a,b) native format
|
||||
n_energy = size(correlated_dist % energy)
|
||||
allocate(this % inelastic_data(n_energy))
|
||||
do i = 1, n_energy
|
||||
associate (edist => correlated_dist % distribution(i))
|
||||
! Get number of outgoing energies for incoming energy i
|
||||
n_energy_out = size(edist % e_out)
|
||||
this % inelastic_data(i) % n_e_out = n_energy_out
|
||||
allocate(this % inelastic_data(i) % e_out(n_energy_out))
|
||||
allocate(this % inelastic_data(i) % e_out_pdf(n_energy_out))
|
||||
allocate(this % inelastic_data(i) % e_out_cdf(n_energy_out))
|
||||
|
||||
! Copy outgoing energy distribution
|
||||
this % inelastic_data(i) % e_out(:) = edist % e_out
|
||||
this % inelastic_data(i) % e_out_pdf(:) = edist % p
|
||||
this % inelastic_data(i) % e_out_cdf(:) = edist % c
|
||||
|
||||
do j = 1, n_energy_out
|
||||
select type (adist => edist % angle(j) % obj)
|
||||
type is (Tabular)
|
||||
! On first pass, allocate space for angles
|
||||
if (j == 1) then
|
||||
n_mu = size(adist % x)
|
||||
this % n_inelastic_mu = n_mu
|
||||
allocate(this % inelastic_data(i) % mu(n_mu, n_energy_out))
|
||||
end if
|
||||
|
||||
! Copy outgoing angles
|
||||
this % inelastic_data(i) % mu(:, j) = adist % x
|
||||
end select
|
||||
end do
|
||||
end associate
|
||||
end do
|
||||
end if
|
||||
|
||||
call close_group(inelastic_group)
|
||||
end if
|
||||
end subroutine salphabeta_from_hdf5
|
||||
|
||||
end module sab_header
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue