mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-28 14:15:42 -04:00
merged with upstream/develop
This commit is contained in:
commit
97c665d736
203 changed files with 13174 additions and 14666 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')"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -422,24 +422,22 @@
|
|||
"data": {
|
||||
"text/plain": [
|
||||
"OrderedDict([('flux', Tally\n",
|
||||
"\tID =\t10000\n",
|
||||
"\tName =\t\n",
|
||||
"\tFilters =\t\n",
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
"\tNuclides =\ttotal \n",
|
||||
"\tScores =\t['flux']\n",
|
||||
"\tEstimator =\ttracklength\n",
|
||||
"), ('absorption', Tally\n",
|
||||
"\tID =\t10001\n",
|
||||
"\tName =\t\n",
|
||||
"\tFilters =\t\n",
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
"\tNuclides =\ttotal \n",
|
||||
"\tScores =\t['absorption']\n",
|
||||
"\tEstimator =\ttracklength\n",
|
||||
")])"
|
||||
" \tID =\t10000\n",
|
||||
" \tName =\t\n",
|
||||
" \tFilters =\t\n",
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
" \tNuclides =\ttotal \n",
|
||||
" \tScores =\t['flux']\n",
|
||||
" \tEstimator =\ttracklength), ('absorption', Tally\n",
|
||||
" \tID =\t10001\n",
|
||||
" \tName =\t\n",
|
||||
" \tFilters =\t\n",
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
" \tNuclides =\ttotal \n",
|
||||
" \tScores =\t['absorption']\n",
|
||||
" \tEstimator =\ttracklength)])"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
|
|
@ -516,26 +514,25 @@
|
|||
" Copyright: 2011-2016 Massachusetts Institute of Technology\n",
|
||||
" License: http://openmc.readthedocs.io/en/latest/license.html\n",
|
||||
" Version: 0.7.1\n",
|
||||
" Git SHA1: 19feb55e6d5e8350398627f39fb55ee8e2e63011\n",
|
||||
" Date/Time: 2016-05-13 10:19:16\n",
|
||||
" MPI Processes: 1\n",
|
||||
" Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n",
|
||||
" Date/Time: 2016-07-22 21:03:18\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 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",
|
||||
|
|
@ -603,20 +600,20 @@
|
|||
"\n",
|
||||
" =======================> TIMING STATISTICS <=======================\n",
|
||||
"\n",
|
||||
" Total time for initialization = 4.2300E-01 seconds\n",
|
||||
" Reading cross sections = 9.3000E-02 seconds\n",
|
||||
" Total time in simulation = 1.6549E+01 seconds\n",
|
||||
" Time in transport only = 1.6535E+01 seconds\n",
|
||||
" Time in inactive batches = 2.3650E+00 seconds\n",
|
||||
" Time in active batches = 1.4184E+01 seconds\n",
|
||||
" Time synchronizing fission bank = 5.0000E-03 seconds\n",
|
||||
" Sampling source sites = 3.0000E-03 seconds\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 = 1.6981E+01 seconds\n",
|
||||
" Calculation Rate (inactive) = 10570.8 neutrons/second\n",
|
||||
" Calculation Rate (active) = 7050.20 neutrons/second\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",
|
||||
"\n",
|
||||
" ============================> RESULTS <============================\n",
|
||||
"\n",
|
||||
|
|
@ -1170,14 +1167,14 @@
|
|||
],
|
||||
"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",
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
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
|
||||
|
|
|
|||
|
|
@ -123,7 +123,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
|
||||
|
|
@ -503,7 +503,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
|
||||
------
|
||||
|
|
@ -531,7 +531,7 @@ class MGXS(object):
|
|||
Parameters
|
||||
----------
|
||||
nuclide : str
|
||||
A nuclide name string (e.g., 'U-235')
|
||||
A nuclide name string (e.g., 'U235')
|
||||
|
||||
Returns
|
||||
-------
|
||||
|
|
@ -566,7 +566,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
|
||||
|
|
@ -725,7 +725,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'.
|
||||
|
|
@ -963,7 +963,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 [])
|
||||
|
|
@ -1120,7 +1120,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'.
|
||||
|
|
@ -1223,7 +1223,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'.
|
||||
|
|
@ -1422,7 +1422,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
|
||||
|
|
@ -1631,7 +1631,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
|
||||
|
|
@ -1680,7 +1680,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
|
||||
|
|
@ -1818,7 +1818,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 [])
|
||||
|
|
@ -1868,7 +1868,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
|
||||
|
|
@ -2051,7 +2051,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
|
||||
|
|
@ -2169,7 +2169,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
|
||||
|
|
@ -2299,7 +2299,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
|
||||
|
|
@ -2420,7 +2420,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
|
||||
|
|
@ -2536,7 +2536,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
|
||||
|
|
@ -2658,7 +2658,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
|
||||
|
|
@ -2769,7 +2769,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
|
||||
|
|
@ -2885,7 +2885,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
|
||||
|
|
@ -2998,7 +2998,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
|
||||
|
|
@ -3113,7 +3113,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
|
||||
|
|
@ -3247,7 +3247,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
|
||||
|
|
@ -3410,7 +3410,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 [])
|
||||
|
|
@ -3492,7 +3492,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'.
|
||||
|
|
@ -3639,7 +3639,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
|
||||
|
|
@ -3706,7 +3706,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'.
|
||||
|
|
@ -3895,7 +3895,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
|
||||
|
|
@ -4017,7 +4017,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
|
||||
|
|
@ -4164,7 +4164,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
|
||||
|
|
@ -4279,7 +4279,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
|
||||
|
|
@ -4357,7 +4357,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 [])
|
||||
|
|
@ -4468,7 +4468,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'.
|
||||
|
|
@ -4601,7 +4601,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
|
||||
-------
|
||||
|
|
@ -2979,7 +2979,7 @@ class Tally(object):
|
|||
bin_indices.extend([bin_index])
|
||||
bin_indices.extend([bin_index, bin_index+1])
|
||||
num_bins += 1
|
||||
elif filter_type == 'distribcell':
|
||||
elif filter_type in ['distribcell', 'mesh']:
|
||||
bin_indices = [0]
|
||||
num_bins = find_filter.num_bins
|
||||
else:
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
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