merged develop into cmfd_rbgs

This commit is contained in:
Bryan Herman 2014-09-09 09:36:59 -04:00
commit 9b7744b3a4
436 changed files with 193595 additions and 226238 deletions

3
.gitignore vendored
View file

@ -38,3 +38,6 @@ results_error.dat
# HDF5 files
*.h5
# Data downloaded from NNDC
data/nndc

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "src/xml/fox"]
path = src/xml/fox
url = https://github.com/mit-crpg/fox.git

View file

@ -64,7 +64,7 @@
<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-59.71c" awr="57.4381" location="1" name="27059.71c" path="293.6K/Co_058m1_293.6K.ace" temperature="2.53e-08" zaid="27059"/>
<ace_table alias="Co-58m.71c" awr="57.4381" location="1" metastable="1" name="27059.71c" path="293.6K/Co_058m1_293.6K.ace" temperature="2.53e-08" zaid="27059"/>
<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"/>
@ -157,7 +157,7 @@
<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-119.71c" awr="108.962" location="1" name="47119.71c" path="293.6K/Ag_110m1_293.6K.ace" temperature="2.53e-08" zaid="47119"/>
<ace_table alias="Ag-110m.71c" awr="108.962" location="1" metastable="1" name="47119.71c" path="293.6K/Ag_110m1_293.6K.ace" temperature="2.53e-08" zaid="47119"/>
<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"/>
@ -166,7 +166,7 @@
<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-119.71c" awr="113.918" location="1" name="48119.71c" path="293.6K/Cd_115m1_293.6K.ace" temperature="2.53e-08" zaid="48119"/>
<ace_table alias="Cd-115m.71c" awr="113.918" location="1" metastable="1" name="48119.71c" path="293.6K/Cd_115m1_293.6K.ace" temperature="2.53e-08" zaid="48119"/>
<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"/>
@ -195,9 +195,9 @@
<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-129.71c" awr="125.815" location="1" name="52129.71c" path="293.6K/Te_127m1_293.6K.ace" temperature="2.53e-08" zaid="52129"/>
<ace_table alias="Te-127m.71c" awr="125.815" location="1" metastable="1" name="52129.71c" path="293.6K/Te_127m1_293.6K.ace" temperature="2.53e-08" zaid="52129"/>
<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-129.71c" awr="127.8" location="1" name="52129.71c" path="293.6K/Te_129m1_293.6K.ace" temperature="2.53e-08" zaid="52129"/>
<ace_table alias="Te-129m.71c" awr="127.8" location="1" metastable="1" name="52129.71c" path="293.6K/Te_129m1_293.6K.ace" temperature="2.53e-08" zaid="52129"/>
<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"/>
@ -255,7 +255,7 @@
<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-149.71c" awr="146.65" location="1" name="61149.71c" path="293.6K/Pm_148m1_293.6K.ace" temperature="2.53e-08" zaid="61149"/>
<ace_table alias="Pm-148m.71c" awr="146.65" location="1" metastable="1" name="61149.71c" path="293.6K/Pm_148m1_293.6K.ace" temperature="2.53e-08" zaid="61149"/>
<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"/>
@ -292,7 +292,7 @@
<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-169.71c" awr="164.507" location="1" name="67169.71c" path="293.6K/Ho_166m1_293.6K.ace" temperature="2.53e-08" zaid="67169"/>
<ace_table alias="Ho-166m.71c" awr="164.507" location="1" metastable="1" name="67169.71c" path="293.6K/Ho_166m1_293.6K.ace" temperature="2.53e-08" zaid="67169"/>
<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"/>
@ -387,11 +387,11 @@
<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-242m.71c" awr="239.9801" location="1" metastable="1" name="95242.71c" path="293.6K/Am_242_293.6K.ace" temperature="2.53e-08" zaid="95242"/>
<ace_table alias="Am-249.71c" awr="239.9801" location="1" name="95249.71c" path="293.6K/Am_242m1_293.6K.ace" temperature="2.53e-08" zaid="95249"/>
<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="95249.71c" path="293.6K/Am_242m1_293.6K.ace" temperature="2.53e-08" zaid="95249"/>
<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-249.71c" awr="241.968" location="1" name="95249.71c" path="293.6K/Am_244m1_293.6K.ace" temperature="2.53e-08" zaid="95249"/>
<ace_table alias="Am-244m.71c" awr="241.968" location="1" metastable="1" name="95249.71c" path="293.6K/Am_244m1_293.6K.ace" temperature="2.53e-08" zaid="95249"/>
<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"/>
@ -421,7 +421,7 @@
<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-259.71c" awr="251.905" location="1" name="99259.71c" path="293.6K/Es_254m1_293.6K.ace" temperature="2.53e-08" zaid="99259"/>
<ace_table alias="Es-254m.71c" awr="251.905" location="1" metastable="1" name="99259.71c" path="293.6K/Es_254m1_293.6K.ace" temperature="2.53e-08" zaid="99259"/>
<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"/>
@ -487,7 +487,7 @@
<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-59.72c" awr="57.4381" location="1" name="27059.72c" path="300K/Co_058m1_300K.ace" temperature="2.585e-08" zaid="27059"/>
<ace_table alias="Co-58m.72c" awr="57.4381" location="1" metastable="1" name="27059.72c" path="300K/Co_058m1_300K.ace" temperature="2.585e-08" zaid="27059"/>
<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"/>
@ -580,7 +580,7 @@
<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-119.72c" awr="108.962" location="1" name="47119.72c" path="300K/Ag_110m1_300K.ace" temperature="2.585e-08" zaid="47119"/>
<ace_table alias="Ag-110m.72c" awr="108.962" location="1" metastable="1" name="47119.72c" path="300K/Ag_110m1_300K.ace" temperature="2.585e-08" zaid="47119"/>
<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"/>
@ -589,7 +589,7 @@
<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-119.72c" awr="113.918" location="1" name="48119.72c" path="300K/Cd_115m1_300K.ace" temperature="2.585e-08" zaid="48119"/>
<ace_table alias="Cd-115m.72c" awr="113.918" location="1" metastable="1" name="48119.72c" path="300K/Cd_115m1_300K.ace" temperature="2.585e-08" zaid="48119"/>
<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"/>
@ -618,9 +618,9 @@
<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-129.72c" awr="125.815" location="1" name="52129.72c" path="300K/Te_127m1_300K.ace" temperature="2.585e-08" zaid="52129"/>
<ace_table alias="Te-127m.72c" awr="125.815" location="1" metastable="1" name="52129.72c" path="300K/Te_127m1_300K.ace" temperature="2.585e-08" zaid="52129"/>
<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-129.72c" awr="127.8" location="1" name="52129.72c" path="300K/Te_129m1_300K.ace" temperature="2.585e-08" zaid="52129"/>
<ace_table alias="Te-129m.72c" awr="127.8" location="1" metastable="1" name="52129.72c" path="300K/Te_129m1_300K.ace" temperature="2.585e-08" zaid="52129"/>
<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"/>
@ -678,7 +678,7 @@
<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-149.72c" awr="146.65" location="1" name="61149.72c" path="300K/Pm_148m1_300K.ace" temperature="2.585e-08" zaid="61149"/>
<ace_table alias="Pm-148m.72c" awr="146.65" location="1" metastable="1" name="61149.72c" path="300K/Pm_148m1_300K.ace" temperature="2.585e-08" zaid="61149"/>
<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"/>
@ -715,7 +715,7 @@
<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-169.72c" awr="164.507" location="1" name="67169.72c" path="300K/Ho_166m1_300K.ace" temperature="2.585e-08" zaid="67169"/>
<ace_table alias="Ho-166m.72c" awr="164.507" location="1" metastable="1" name="67169.72c" path="300K/Ho_166m1_300K.ace" temperature="2.585e-08" zaid="67169"/>
<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"/>
@ -810,11 +810,11 @@
<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-242m.72c" awr="239.9801" location="1" metastable="1" name="95242.72c" path="300K/Am_242_300K.ace" temperature="2.585e-08" zaid="95242"/>
<ace_table alias="Am-249.72c" awr="239.9801" location="1" name="95249.72c" path="300K/Am_242m1_300K.ace" temperature="2.585e-08" zaid="95249"/>
<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="95249.72c" path="300K/Am_242m1_300K.ace" temperature="2.585e-08" zaid="95249"/>
<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-249.72c" awr="241.968" location="1" name="95249.72c" path="300K/Am_244m1_300K.ace" temperature="2.585e-08" zaid="95249"/>
<ace_table alias="Am-244m.72c" awr="241.968" location="1" metastable="1" name="95249.72c" path="300K/Am_244m1_300K.ace" temperature="2.585e-08" zaid="95249"/>
<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"/>
@ -844,855 +844,9 @@
<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-259.72c" awr="251.905" location="1" name="99259.72c" path="300K/Es_254m1_300K.ace" temperature="2.585e-08" zaid="99259"/>
<ace_table alias="Es-254m.72c" awr="251.905" location="1" metastable="1" name="99259.72c" path="300K/Es_254m1_300K.ace" temperature="2.585e-08" zaid="99259"/>
<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 alias="H-1.73c" awr="0.999167" location="1" name="1001.73c" path="900K/H_001_900K.ace" temperature="7.756e-08" zaid="1001"/>
<ace_table alias="H-2.73c" awr="1.9968" location="1" name="1002.73c" path="900K/H_002_900K.ace" temperature="7.756e-08" zaid="1002"/>
<ace_table alias="H-3.73c" awr="2.989596" location="1" name="1003.73c" path="900K/H_003_900K.ace" temperature="7.756e-08" zaid="1003"/>
<ace_table alias="He-3.73c" awr="2.989032" location="1" name="2003.73c" path="900K/He_003_900K.ace" temperature="7.756e-08" zaid="2003"/>
<ace_table alias="He-4.73c" awr="3.968219" location="1" name="2004.73c" path="900K/He_004_900K.ace" temperature="7.756e-08" zaid="2004"/>
<ace_table alias="Li-6.73c" awr="5.9634" location="1" name="3006.73c" path="900K/Li_006_900K.ace" temperature="7.756e-08" zaid="3006"/>
<ace_table alias="Li-7.73c" awr="6.955732" location="1" name="3007.73c" path="900K/Li_007_900K.ace" temperature="7.756e-08" zaid="3007"/>
<ace_table alias="Be-7.73c" awr="6.9545" location="1" name="4007.73c" path="900K/Be_007_900K.ace" temperature="7.756e-08" zaid="4007"/>
<ace_table alias="Be-9.73c" awr="8.93478" location="1" name="4009.73c" path="900K/Be_009_900K.ace" temperature="7.756e-08" zaid="4009"/>
<ace_table alias="B-10.73c" awr="9.926921" location="1" name="5010.73c" path="900K/B_010_900K.ace" temperature="7.756e-08" zaid="5010"/>
<ace_table alias="B-11.73c" awr="10.9147" location="1" name="5011.73c" path="900K/B_011_900K.ace" temperature="7.756e-08" zaid="5011"/>
<ace_table alias="C-Nat.73c" awr="11.898" location="1" name="6000.73c" path="900K/C_000_900K.ace" temperature="7.756e-08" zaid="6000"/>
<ace_table alias="N-14.73c" awr="13.88278" location="1" name="7014.73c" path="900K/N_014_900K.ace" temperature="7.756e-08" zaid="7014"/>
<ace_table alias="N-15.73c" awr="14.871" location="1" name="7015.73c" path="900K/N_015_900K.ace" temperature="7.756e-08" zaid="7015"/>
<ace_table alias="O-16.73c" awr="15.85751" location="1" name="8016.73c" path="900K/O_016_900K.ace" temperature="7.756e-08" zaid="8016"/>
<ace_table alias="O-17.73c" awr="16.8531" location="1" name="8017.73c" path="900K/O_017_900K.ace" temperature="7.756e-08" zaid="8017"/>
<ace_table alias="F-19.73c" awr="18.835" location="1" name="9019.73c" path="900K/F_019_900K.ace" temperature="7.756e-08" zaid="9019"/>
<ace_table alias="Na-22.73c" awr="21.8055" location="1" name="11022.73c" path="900K/Na_022_900K.ace" temperature="7.756e-08" zaid="11022"/>
<ace_table alias="Na-23.73c" awr="22.792" location="1" name="11023.73c" path="900K/Na_023_900K.ace" temperature="7.756e-08" zaid="11023"/>
<ace_table alias="Mg-24.73c" awr="23.779" location="1" name="12024.73c" path="900K/Mg_024_900K.ace" temperature="7.756e-08" zaid="12024"/>
<ace_table alias="Mg-25.73c" awr="24.7712" location="1" name="12025.73c" path="900K/Mg_025_900K.ace" temperature="7.756e-08" zaid="12025"/>
<ace_table alias="Mg-26.73c" awr="25.7594" location="1" name="12026.73c" path="900K/Mg_026_900K.ace" temperature="7.756e-08" zaid="12026"/>
<ace_table alias="Al-27.73c" awr="26.74975" location="1" name="13027.73c" path="900K/Al_027_900K.ace" temperature="7.756e-08" zaid="13027"/>
<ace_table alias="Si-28.73c" awr="27.737" location="1" name="14028.73c" path="900K/Si_028_900K.ace" temperature="7.756e-08" zaid="14028"/>
<ace_table alias="Si-29.73c" awr="28.728" location="1" name="14029.73c" path="900K/Si_029_900K.ace" temperature="7.756e-08" zaid="14029"/>
<ace_table alias="Si-30.73c" awr="29.716" location="1" name="14030.73c" path="900K/Si_030_900K.ace" temperature="7.756e-08" zaid="14030"/>
<ace_table alias="P-31.73c" awr="30.708" location="1" name="15031.73c" path="900K/P_031_900K.ace" temperature="7.756e-08" zaid="15031"/>
<ace_table alias="S-32.73c" awr="31.6973" location="1" name="16032.73c" path="900K/S_032_900K.ace" temperature="7.756e-08" zaid="16032"/>
<ace_table alias="S-33.73c" awr="32.6878" location="1" name="16033.73c" path="900K/S_033_900K.ace" temperature="7.756e-08" zaid="16033"/>
<ace_table alias="S-34.73c" awr="33.6762" location="1" name="16034.73c" path="900K/S_034_900K.ace" temperature="7.756e-08" zaid="16034"/>
<ace_table alias="S-36.73c" awr="35.658" location="1" name="16036.73c" path="900K/S_036_900K.ace" temperature="7.756e-08" zaid="16036"/>
<ace_table alias="Cl-35.73c" awr="34.66845" location="1" name="17035.73c" path="900K/Cl_035_900K.ace" temperature="7.756e-08" zaid="17035"/>
<ace_table alias="Cl-37.73c" awr="36.6483" location="1" name="17037.73c" path="900K/Cl_037_900K.ace" temperature="7.756e-08" zaid="17037"/>
<ace_table alias="Ar-36.73c" awr="35.6585" location="1" name="18036.73c" path="900K/Ar_036_900K.ace" temperature="7.756e-08" zaid="18036"/>
<ace_table alias="Ar-38.73c" awr="37.6366" location="1" name="18038.73c" path="900K/Ar_038_900K.ace" temperature="7.756e-08" zaid="18038"/>
<ace_table alias="Ar-40.73c" awr="39.6191" location="1" name="18040.73c" path="900K/Ar_040_900K.ace" temperature="7.756e-08" zaid="18040"/>
<ace_table alias="K-39.73c" awr="38.6293" location="1" name="19039.73c" path="900K/K_039_900K.ace" temperature="7.756e-08" zaid="19039"/>
<ace_table alias="K-40.73c" awr="39.6207" location="1" name="19040.73c" path="900K/K_040_900K.ace" temperature="7.756e-08" zaid="19040"/>
<ace_table alias="K-41.73c" awr="40.6101" location="1" name="19041.73c" path="900K/K_041_900K.ace" temperature="7.756e-08" zaid="19041"/>
<ace_table alias="Ca-40.73c" awr="39.6193" location="1" name="20040.73c" path="900K/Ca_040_900K.ace" temperature="7.756e-08" zaid="20040"/>
<ace_table alias="Ca-42.73c" awr="41.59818" location="1" name="20042.73c" path="900K/Ca_042_900K.ace" temperature="7.756e-08" zaid="20042"/>
<ace_table alias="Ca-43.73c" awr="42.58973" location="1" name="20043.73c" path="900K/Ca_043_900K.ace" temperature="7.756e-08" zaid="20043"/>
<ace_table alias="Ca-44.73c" awr="43.57788" location="1" name="20044.73c" path="900K/Ca_044_900K.ace" temperature="7.756e-08" zaid="20044"/>
<ace_table alias="Ca-46.73c" awr="45.55893" location="1" name="20046.73c" path="900K/Ca_046_900K.ace" temperature="7.756e-08" zaid="20046"/>
<ace_table alias="Ca-48.73c" awr="47.5406" location="1" name="20048.73c" path="900K/Ca_048_900K.ace" temperature="7.756e-08" zaid="20048"/>
<ace_table alias="Sc-45.73c" awr="44.5679" location="1" name="21045.73c" path="900K/Sc_045_900K.ace" temperature="7.756e-08" zaid="21045"/>
<ace_table alias="Ti-46.73c" awr="45.5579" location="1" name="22046.73c" path="900K/Ti_046_900K.ace" temperature="7.756e-08" zaid="22046"/>
<ace_table alias="Ti-47.73c" awr="46.5484" location="1" name="22047.73c" path="900K/Ti_047_900K.ace" temperature="7.756e-08" zaid="22047"/>
<ace_table alias="Ti-48.73c" awr="47.5361" location="1" name="22048.73c" path="900K/Ti_048_900K.ace" temperature="7.756e-08" zaid="22048"/>
<ace_table alias="Ti-49.73c" awr="48.5274" location="1" name="22049.73c" path="900K/Ti_049_900K.ace" temperature="7.756e-08" zaid="22049"/>
<ace_table alias="Ti-50.73c" awr="49.5157" location="1" name="22050.73c" path="900K/Ti_050_900K.ace" temperature="7.756e-08" zaid="22050"/>
<ace_table alias="V-50.73c" awr="49.5181" location="1" name="23050.73c" path="900K/V_050_900K.ace" temperature="7.756e-08" zaid="23050"/>
<ace_table alias="V-51.73c" awr="50.5063" location="1" name="23051.73c" path="900K/V_051_900K.ace" temperature="7.756e-08" zaid="23051"/>
<ace_table alias="Cr-50.73c" awr="49.517" location="1" name="24050.73c" path="900K/Cr_050_900K.ace" temperature="7.756e-08" zaid="24050"/>
<ace_table alias="Cr-52.73c" awr="51.494" location="1" name="24052.73c" path="900K/Cr_052_900K.ace" temperature="7.756e-08" zaid="24052"/>
<ace_table alias="Cr-53.73c" awr="52.486" location="1" name="24053.73c" path="900K/Cr_053_900K.ace" temperature="7.756e-08" zaid="24053"/>
<ace_table alias="Cr-54.73c" awr="53.476" location="1" name="24054.73c" path="900K/Cr_054_900K.ace" temperature="7.756e-08" zaid="24054"/>
<ace_table alias="Mn-55.73c" awr="54.4661" location="1" name="25055.73c" path="900K/Mn_055_900K.ace" temperature="7.756e-08" zaid="25055"/>
<ace_table alias="Fe-54.73c" awr="53.476" location="1" name="26054.73c" path="900K/Fe_054_900K.ace" temperature="7.756e-08" zaid="26054"/>
<ace_table alias="Fe-56.73c" awr="55.454" location="1" name="26056.73c" path="900K/Fe_056_900K.ace" temperature="7.756e-08" zaid="26056"/>
<ace_table alias="Fe-57.73c" awr="56.446" location="1" name="26057.73c" path="900K/Fe_057_900K.ace" temperature="7.756e-08" zaid="26057"/>
<ace_table alias="Fe-58.73c" awr="57.436" location="1" name="26058.73c" path="900K/Fe_058_900K.ace" temperature="7.756e-08" zaid="26058"/>
<ace_table alias="Co-58.73c" awr="57.4381" location="1" name="27058.73c" path="900K/Co_058_900K.ace" temperature="7.756e-08" zaid="27058"/>
<ace_table alias="Co-59.73c" awr="57.4381" location="1" name="27059.73c" path="900K/Co_058m1_900K.ace" temperature="7.756e-08" zaid="27059"/>
<ace_table alias="Co-59.73c" awr="58.4269" location="1" name="27059.73c" path="900K/Co_059_900K.ace" temperature="7.756e-08" zaid="27059"/>
<ace_table alias="Ni-58.73c" awr="57.438" location="1" name="28058.73c" path="900K/Ni_058_900K.ace" temperature="7.756e-08" zaid="28058"/>
<ace_table alias="Ni-59.73c" awr="58.4281" location="1" name="28059.73c" path="900K/Ni_059_900K.ace" temperature="7.756e-08" zaid="28059"/>
<ace_table alias="Ni-60.73c" awr="59.416" location="1" name="28060.73c" path="900K/Ni_060_900K.ace" temperature="7.756e-08" zaid="28060"/>
<ace_table alias="Ni-61.73c" awr="60.408" location="1" name="28061.73c" path="900K/Ni_061_900K.ace" temperature="7.756e-08" zaid="28061"/>
<ace_table alias="Ni-62.73c" awr="61.396" location="1" name="28062.73c" path="900K/Ni_062_900K.ace" temperature="7.756e-08" zaid="28062"/>
<ace_table alias="Ni-64.73c" awr="63.379" location="1" name="28064.73c" path="900K/Ni_064_900K.ace" temperature="7.756e-08" zaid="28064"/>
<ace_table alias="Cu-63.73c" awr="62.389" location="1" name="29063.73c" path="900K/Cu_063_900K.ace" temperature="7.756e-08" zaid="29063"/>
<ace_table alias="Cu-65.73c" awr="64.37" location="1" name="29065.73c" path="900K/Cu_065_900K.ace" temperature="7.756e-08" zaid="29065"/>
<ace_table alias="Zn-64.73c" awr="63.38" location="1" name="30064.73c" path="900K/Zn_064_900K.ace" temperature="7.756e-08" zaid="30064"/>
<ace_table alias="Zn-65.73c" awr="64.3715" location="1" name="30065.73c" path="900K/Zn_065_900K.ace" temperature="7.756e-08" zaid="30065"/>
<ace_table alias="Zn-66.73c" awr="65.3597" location="1" name="30066.73c" path="900K/Zn_066_900K.ace" temperature="7.756e-08" zaid="30066"/>
<ace_table alias="Zn-67.73c" awr="66.3522" location="1" name="30067.73c" path="900K/Zn_067_900K.ace" temperature="7.756e-08" zaid="30067"/>
<ace_table alias="Zn-68.73c" awr="67.3413" location="1" name="30068.73c" path="900K/Zn_068_900K.ace" temperature="7.756e-08" zaid="30068"/>
<ace_table alias="Zn-70.73c" awr="69.3246" location="1" name="30070.73c" path="900K/Zn_070_900K.ace" temperature="7.756e-08" zaid="30070"/>
<ace_table alias="Ga-69.73c" awr="68.3336" location="1" name="31069.73c" path="900K/Ga_069_900K.ace" temperature="7.756e-08" zaid="31069"/>
<ace_table alias="Ga-71.73c" awr="70.315" location="1" name="31071.73c" path="900K/Ga_071_900K.ace" temperature="7.756e-08" zaid="31071"/>
<ace_table alias="Ge-70.73c" awr="69.3236" location="1" name="32070.73c" path="900K/Ge_070_900K.ace" temperature="7.756e-08" zaid="32070"/>
<ace_table alias="Ge-72.73c" awr="71.3042" location="1" name="32072.73c" path="900K/Ge_072_900K.ace" temperature="7.756e-08" zaid="32072"/>
<ace_table alias="Ge-73.73c" awr="72.297" location="1" name="32073.73c" path="900K/Ge_073_900K.ace" temperature="7.756e-08" zaid="32073"/>
<ace_table alias="Ge-74.73c" awr="73.2862" location="1" name="32074.73c" path="900K/Ge_074_900K.ace" temperature="7.756e-08" zaid="32074"/>
<ace_table alias="Ge-76.73c" awr="75.2692" location="1" name="32076.73c" path="900K/Ge_076_900K.ace" temperature="7.756e-08" zaid="32076"/>
<ace_table alias="As-74.73c" awr="73.2889" location="1" name="33074.73c" path="900K/As_074_900K.ace" temperature="7.756e-08" zaid="33074"/>
<ace_table alias="As-75.73c" awr="74.278" location="1" name="33075.73c" path="900K/As_075_900K.ace" temperature="7.756e-08" zaid="33075"/>
<ace_table alias="Se-74.73c" awr="73.2875" location="1" name="34074.73c" path="900K/Se_074_900K.ace" temperature="7.756e-08" zaid="34074"/>
<ace_table alias="Se-76.73c" awr="75.267" location="1" name="34076.73c" path="900K/Se_076_900K.ace" temperature="7.756e-08" zaid="34076"/>
<ace_table alias="Se-77.73c" awr="76.2591" location="1" name="34077.73c" path="900K/Se_077_900K.ace" temperature="7.756e-08" zaid="34077"/>
<ace_table alias="Se-78.73c" awr="77.2479" location="1" name="34078.73c" path="900K/Se_078_900K.ace" temperature="7.756e-08" zaid="34078"/>
<ace_table alias="Se-79.73c" awr="78.2405" location="1" name="34079.73c" path="900K/Se_079_900K.ace" temperature="7.756e-08" zaid="34079"/>
<ace_table alias="Se-80.73c" awr="79.23" location="1" name="34080.73c" path="900K/Se_080_900K.ace" temperature="7.756e-08" zaid="34080"/>
<ace_table alias="Se-82.73c" awr="81.213" location="1" name="34082.73c" path="900K/Se_082_900K.ace" temperature="7.756e-08" zaid="34082"/>
<ace_table alias="Br-79.73c" awr="78.2403" location="1" name="35079.73c" path="900K/Br_079_900K.ace" temperature="7.756e-08" zaid="35079"/>
<ace_table alias="Br-81.73c" awr="80.2212" location="1" name="35081.73c" path="900K/Br_081_900K.ace" temperature="7.756e-08" zaid="35081"/>
<ace_table alias="Kr-78.73c" awr="77.25099" location="1" name="36078.73c" path="900K/Kr_078_900K.ace" temperature="7.756e-08" zaid="36078"/>
<ace_table alias="Kr-80.73c" awr="79.2299" location="1" name="36080.73c" path="900K/Kr_080_900K.ace" temperature="7.756e-08" zaid="36080"/>
<ace_table alias="Kr-82.73c" awr="81.2098" location="1" name="36082.73c" path="900K/Kr_082_900K.ace" temperature="7.756e-08" zaid="36082"/>
<ace_table alias="Kr-83.73c" awr="82.202" location="1" name="36083.73c" path="900K/Kr_083_900K.ace" temperature="7.756e-08" zaid="36083"/>
<ace_table alias="Kr-84.73c" awr="83.1907" location="1" name="36084.73c" path="900K/Kr_084_900K.ace" temperature="7.756e-08" zaid="36084"/>
<ace_table alias="Kr-85.73c" awr="84.1831" location="1" name="36085.73c" path="900K/Kr_085_900K.ace" temperature="7.756e-08" zaid="36085"/>
<ace_table alias="Kr-86.73c" awr="85.1726" location="1" name="36086.73c" path="900K/Kr_086_900K.ace" temperature="7.756e-08" zaid="36086"/>
<ace_table alias="Rb-85.73c" awr="84.1824" location="1" name="37085.73c" path="900K/Rb_085_900K.ace" temperature="7.756e-08" zaid="37085"/>
<ace_table alias="Rb-86.73c" awr="85.1731" location="1" name="37086.73c" path="900K/Rb_086_900K.ace" temperature="7.756e-08" zaid="37086"/>
<ace_table alias="Rb-87.73c" awr="86.1626" location="1" name="37087.73c" path="900K/Rb_087_900K.ace" temperature="7.756e-08" zaid="37087"/>
<ace_table alias="Sr-84.73c" awr="83.1926" location="1" name="38084.73c" path="900K/Sr_084_900K.ace" temperature="7.756e-08" zaid="38084"/>
<ace_table alias="Sr-86.73c" awr="85.1713" location="1" name="38086.73c" path="900K/Sr_086_900K.ace" temperature="7.756e-08" zaid="38086"/>
<ace_table alias="Sr-87.73c" awr="86.1623" location="1" name="38087.73c" path="900K/Sr_087_900K.ace" temperature="7.756e-08" zaid="38087"/>
<ace_table alias="Sr-88.73c" awr="87.15" location="1" name="38088.73c" path="900K/Sr_088_900K.ace" temperature="7.756e-08" zaid="38088"/>
<ace_table alias="Sr-89.73c" awr="88.144" location="1" name="38089.73c" path="900K/Sr_089_900K.ace" temperature="7.756e-08" zaid="38089"/>
<ace_table alias="Sr-90.73c" awr="89.1353" location="1" name="38090.73c" path="900K/Sr_090_900K.ace" temperature="7.756e-08" zaid="38090"/>
<ace_table alias="Y-89.73c" awr="88.1421" location="1" name="39089.73c" path="900K/Y_089_900K.ace" temperature="7.756e-08" zaid="39089"/>
<ace_table alias="Y-90.73c" awr="89.1348" location="1" name="39090.73c" path="900K/Y_090_900K.ace" temperature="7.756e-08" zaid="39090"/>
<ace_table alias="Y-91.73c" awr="90.1264" location="1" name="39091.73c" path="900K/Y_091_900K.ace" temperature="7.756e-08" zaid="39091"/>
<ace_table alias="Zr-90.73c" awr="89.1324" location="1" name="40090.73c" path="900K/Zr_090_900K.ace" temperature="7.756e-08" zaid="40090"/>
<ace_table alias="Zr-91.73c" awr="90.1247" location="1" name="40091.73c" path="900K/Zr_091_900K.ace" temperature="7.756e-08" zaid="40091"/>
<ace_table alias="Zr-92.73c" awr="91.1155" location="1" name="40092.73c" path="900K/Zr_092_900K.ace" temperature="7.756e-08" zaid="40092"/>
<ace_table alias="Zr-93.73c" awr="92.1084" location="1" name="40093.73c" path="900K/Zr_093_900K.ace" temperature="7.756e-08" zaid="40093"/>
<ace_table alias="Zr-94.73c" awr="93.0996" location="1" name="40094.73c" path="900K/Zr_094_900K.ace" temperature="7.756e-08" zaid="40094"/>
<ace_table alias="Zr-95.73c" awr="94.0927" location="1" name="40095.73c" path="900K/Zr_095_900K.ace" temperature="7.756e-08" zaid="40095"/>
<ace_table alias="Zr-96.73c" awr="95.0844" location="1" name="40096.73c" path="900K/Zr_096_900K.ace" temperature="7.756e-08" zaid="40096"/>
<ace_table alias="Nb-93.73c" awr="92.1051" location="1" name="41093.73c" path="900K/Nb_093_900K.ace" temperature="7.756e-08" zaid="41093"/>
<ace_table alias="Nb-94.73c" awr="93.1006" location="1" name="41094.73c" path="900K/Nb_094_900K.ace" temperature="7.756e-08" zaid="41094"/>
<ace_table alias="Nb-95.73c" awr="94.0915" location="1" name="41095.73c" path="900K/Nb_095_900K.ace" temperature="7.756e-08" zaid="41095"/>
<ace_table alias="Mo-92.73c" awr="91.1173" location="1" name="42092.73c" path="900K/Mo_092_900K.ace" temperature="7.756e-08" zaid="42092"/>
<ace_table alias="Mo-94.73c" awr="93.0984" location="1" name="42094.73c" path="900K/Mo_094_900K.ace" temperature="7.756e-08" zaid="42094"/>
<ace_table alias="Mo-95.73c" awr="94.0906" location="1" name="42095.73c" path="900K/Mo_095_900K.ace" temperature="7.756e-08" zaid="42095"/>
<ace_table alias="Mo-96.73c" awr="95.0808" location="1" name="42096.73c" path="900K/Mo_096_900K.ace" temperature="7.756e-08" zaid="42096"/>
<ace_table alias="Mo-97.73c" awr="96.0735" location="1" name="42097.73c" path="900K/Mo_097_900K.ace" temperature="7.756e-08" zaid="42097"/>
<ace_table alias="Mo-98.73c" awr="97.0643" location="1" name="42098.73c" path="900K/Mo_098_900K.ace" temperature="7.756e-08" zaid="42098"/>
<ace_table alias="Mo-99.73c" awr="98.058" location="1" name="42099.73c" path="900K/Mo_099_900K.ace" temperature="7.756e-08" zaid="42099"/>
<ace_table alias="Mo-100.73c" awr="99.049" location="1" name="42100.73c" path="900K/Mo_100_900K.ace" temperature="7.756e-08" zaid="42100"/>
<ace_table alias="Tc-99.73c" awr="98.0566" location="1" name="43099.73c" path="900K/Tc_099_900K.ace" temperature="7.756e-08" zaid="43099"/>
<ace_table alias="Ru-96.73c" awr="95.0837" location="1" name="44096.73c" path="900K/Ru_096_900K.ace" temperature="7.756e-08" zaid="44096"/>
<ace_table alias="Ru-98.73c" awr="97.0642" location="1" name="44098.73c" path="900K/Ru_098_900K.ace" temperature="7.756e-08" zaid="44098"/>
<ace_table alias="Ru-99.73c" awr="98.0562" location="1" name="44099.73c" path="900K/Ru_099_900K.ace" temperature="7.756e-08" zaid="44099"/>
<ace_table alias="Ru-100.73c" awr="99.046" location="1" name="44100.73c" path="900K/Ru_100_900K.ace" temperature="7.756e-08" zaid="44100"/>
<ace_table alias="Ru-101.73c" awr="100.039" location="1" name="44101.73c" path="900K/Ru_101_900K.ace" temperature="7.756e-08" zaid="44101"/>
<ace_table alias="Ru-102.73c" awr="101.03" location="1" name="44102.73c" path="900K/Ru_102_900K.ace" temperature="7.756e-08" zaid="44102"/>
<ace_table alias="Ru-103.73c" awr="102.02" location="1" name="44103.73c" path="900K/Ru_103_900K.ace" temperature="7.756e-08" zaid="44103"/>
<ace_table alias="Ru-104.73c" awr="103.01" location="1" name="44104.73c" path="900K/Ru_104_900K.ace" temperature="7.756e-08" zaid="44104"/>
<ace_table alias="Ru-105.73c" awr="104.01" location="1" name="44105.73c" path="900K/Ru_105_900K.ace" temperature="7.756e-08" zaid="44105"/>
<ace_table alias="Ru-106.73c" awr="104.997" location="1" name="44106.73c" path="900K/Ru_106_900K.ace" temperature="7.756e-08" zaid="44106"/>
<ace_table alias="Rh-103.73c" awr="102.021" location="1" name="45103.73c" path="900K/Rh_103_900K.ace" temperature="7.756e-08" zaid="45103"/>
<ace_table alias="Rh-105.73c" awr="104.0" location="1" name="45105.73c" path="900K/Rh_105_900K.ace" temperature="7.756e-08" zaid="45105"/>
<ace_table alias="Pd-102.73c" awr="101.0302" location="1" name="46102.73c" path="900K/Pd_102_900K.ace" temperature="7.756e-08" zaid="46102"/>
<ace_table alias="Pd-104.73c" awr="103.0114" location="1" name="46104.73c" path="900K/Pd_104_900K.ace" temperature="7.756e-08" zaid="46104"/>
<ace_table alias="Pd-105.73c" awr="104.004" location="1" name="46105.73c" path="900K/Pd_105_900K.ace" temperature="7.756e-08" zaid="46105"/>
<ace_table alias="Pd-106.73c" awr="104.9937" location="1" name="46106.73c" path="900K/Pd_106_900K.ace" temperature="7.756e-08" zaid="46106"/>
<ace_table alias="Pd-107.73c" awr="105.987" location="1" name="46107.73c" path="900K/Pd_107_900K.ace" temperature="7.756e-08" zaid="46107"/>
<ace_table alias="Pd-108.73c" awr="106.9769" location="1" name="46108.73c" path="900K/Pd_108_900K.ace" temperature="7.756e-08" zaid="46108"/>
<ace_table alias="Pd-110.73c" awr="108.961" location="1" name="46110.73c" path="900K/Pd_110_900K.ace" temperature="7.756e-08" zaid="46110"/>
<ace_table alias="Ag-107.73c" awr="105.987" location="1" name="47107.73c" path="900K/Ag_107_900K.ace" temperature="7.756e-08" zaid="47107"/>
<ace_table alias="Ag-109.73c" awr="107.969" location="1" name="47109.73c" path="900K/Ag_109_900K.ace" temperature="7.756e-08" zaid="47109"/>
<ace_table alias="Ag-119.73c" awr="108.962" location="1" name="47119.73c" path="900K/Ag_110m1_900K.ace" temperature="7.756e-08" zaid="47119"/>
<ace_table alias="Ag-111.73c" awr="109.953" location="1" name="47111.73c" path="900K/Ag_111_900K.ace" temperature="7.756e-08" zaid="47111"/>
<ace_table alias="Cd-106.73c" awr="104.996" location="1" name="48106.73c" path="900K/Cd_106_900K.ace" temperature="7.756e-08" zaid="48106"/>
<ace_table alias="Cd-108.73c" awr="106.977" location="1" name="48108.73c" path="900K/Cd_108_900K.ace" temperature="7.756e-08" zaid="48108"/>
<ace_table alias="Cd-110.73c" awr="108.959" location="1" name="48110.73c" path="900K/Cd_110_900K.ace" temperature="7.756e-08" zaid="48110"/>
<ace_table alias="Cd-111.73c" awr="109.951" location="1" name="48111.73c" path="900K/Cd_111_900K.ace" temperature="7.756e-08" zaid="48111"/>
<ace_table alias="Cd-112.73c" awr="110.942" location="1" name="48112.73c" path="900K/Cd_112_900K.ace" temperature="7.756e-08" zaid="48112"/>
<ace_table alias="Cd-113.73c" awr="111.93" location="1" name="48113.73c" path="900K/Cd_113_900K.ace" temperature="7.756e-08" zaid="48113"/>
<ace_table alias="Cd-114.73c" awr="112.925" location="1" name="48114.73c" path="900K/Cd_114_900K.ace" temperature="7.756e-08" zaid="48114"/>
<ace_table alias="Cd-119.73c" awr="113.918" location="1" name="48119.73c" path="900K/Cd_115m1_900K.ace" temperature="7.756e-08" zaid="48119"/>
<ace_table alias="Cd-116.73c" awr="114.909" location="1" name="48116.73c" path="900K/Cd_116_900K.ace" temperature="7.756e-08" zaid="48116"/>
<ace_table alias="In-113.73c" awr="111.934" location="1" name="49113.73c" path="900K/In_113_900K.ace" temperature="7.756e-08" zaid="49113"/>
<ace_table alias="In-115.73c" awr="113.917" location="1" name="49115.73c" path="900K/In_115_900K.ace" temperature="7.756e-08" zaid="49115"/>
<ace_table alias="Sn-112.73c" awr="110.944" location="1" name="50112.73c" path="900K/Sn_112_900K.ace" temperature="7.756e-08" zaid="50112"/>
<ace_table alias="Sn-113.73c" awr="111.935" location="1" name="50113.73c" path="900K/Sn_113_900K.ace" temperature="7.756e-08" zaid="50113"/>
<ace_table alias="Sn-114.73c" awr="112.925" location="1" name="50114.73c" path="900K/Sn_114_900K.ace" temperature="7.756e-08" zaid="50114"/>
<ace_table alias="Sn-115.73c" awr="113.916" location="1" name="50115.73c" path="900K/Sn_115_900K.ace" temperature="7.756e-08" zaid="50115"/>
<ace_table alias="Sn-116.73c" awr="114.906" location="1" name="50116.73c" path="900K/Sn_116_900K.ace" temperature="7.756e-08" zaid="50116"/>
<ace_table alias="Sn-117.73c" awr="115.899" location="1" name="50117.73c" path="900K/Sn_117_900K.ace" temperature="7.756e-08" zaid="50117"/>
<ace_table alias="Sn-118.73c" awr="116.889" location="1" name="50118.73c" path="900K/Sn_118_900K.ace" temperature="7.756e-08" zaid="50118"/>
<ace_table alias="Sn-119.73c" awr="117.882" location="1" name="50119.73c" path="900K/Sn_119_900K.ace" temperature="7.756e-08" zaid="50119"/>
<ace_table alias="Sn-120.73c" awr="118.872" location="1" name="50120.73c" path="900K/Sn_120_900K.ace" temperature="7.756e-08" zaid="50120"/>
<ace_table alias="Sn-122.73c" awr="120.856" location="1" name="50122.73c" path="900K/Sn_122_900K.ace" temperature="7.756e-08" zaid="50122"/>
<ace_table alias="Sn-123.73c" awr="121.85" location="1" name="50123.73c" path="900K/Sn_123_900K.ace" temperature="7.756e-08" zaid="50123"/>
<ace_table alias="Sn-124.73c" awr="122.841" location="1" name="50124.73c" path="900K/Sn_124_900K.ace" temperature="7.756e-08" zaid="50124"/>
<ace_table alias="Sn-125.73c" awr="123.835" location="1" name="50125.73c" path="900K/Sn_125_900K.ace" temperature="7.756e-08" zaid="50125"/>
<ace_table alias="Sn-126.73c" awr="124.826" location="1" name="50126.73c" path="900K/Sn_126_900K.ace" temperature="7.756e-08" zaid="50126"/>
<ace_table alias="Sb-121.73c" awr="119.87" location="1" name="51121.73c" path="900K/Sb_121_900K.ace" temperature="7.756e-08" zaid="51121"/>
<ace_table alias="Sb-123.73c" awr="121.85" location="1" name="51123.73c" path="900K/Sb_123_900K.ace" temperature="7.756e-08" zaid="51123"/>
<ace_table alias="Sb-124.73c" awr="122.842" location="1" name="51124.73c" path="900K/Sb_124_900K.ace" temperature="7.756e-08" zaid="51124"/>
<ace_table alias="Sb-125.73c" awr="123.832" location="1" name="51125.73c" path="900K/Sb_125_900K.ace" temperature="7.756e-08" zaid="51125"/>
<ace_table alias="Sb-126.73c" awr="124.826" location="1" name="51126.73c" path="900K/Sb_126_900K.ace" temperature="7.756e-08" zaid="51126"/>
<ace_table alias="Te-120.73c" awr="118.874" location="1" name="52120.73c" path="900K/Te_120_900K.ace" temperature="7.756e-08" zaid="52120"/>
<ace_table alias="Te-122.73c" awr="120.856" location="1" name="52122.73c" path="900K/Te_122_900K.ace" temperature="7.756e-08" zaid="52122"/>
<ace_table alias="Te-123.73c" awr="121.848" location="1" name="52123.73c" path="900K/Te_123_900K.ace" temperature="7.756e-08" zaid="52123"/>
<ace_table alias="Te-124.73c" awr="122.839" location="1" name="52124.73c" path="900K/Te_124_900K.ace" temperature="7.756e-08" zaid="52124"/>
<ace_table alias="Te-125.73c" awr="123.831" location="1" name="52125.73c" path="900K/Te_125_900K.ace" temperature="7.756e-08" zaid="52125"/>
<ace_table alias="Te-126.73c" awr="124.821" location="1" name="52126.73c" path="900K/Te_126_900K.ace" temperature="7.756e-08" zaid="52126"/>
<ace_table alias="Te-129.73c" awr="125.815" location="1" name="52129.73c" path="900K/Te_127m1_900K.ace" temperature="7.756e-08" zaid="52129"/>
<ace_table alias="Te-128.73c" awr="126.805" location="1" name="52128.73c" path="900K/Te_128_900K.ace" temperature="7.756e-08" zaid="52128"/>
<ace_table alias="Te-129.73c" awr="127.8" location="1" name="52129.73c" path="900K/Te_129m1_900K.ace" temperature="7.756e-08" zaid="52129"/>
<ace_table alias="Te-130.73c" awr="128.79" location="1" name="52130.73c" path="900K/Te_130_900K.ace" temperature="7.756e-08" zaid="52130"/>
<ace_table alias="Te-132.73c" awr="130.775" location="1" name="52132.73c" path="900K/Te_132_900K.ace" temperature="7.756e-08" zaid="52132"/>
<ace_table alias="I-127.73c" awr="125.8143" location="1" name="53127.73c" path="900K/I_127_900K.ace" temperature="7.756e-08" zaid="53127"/>
<ace_table alias="I-129.73c" awr="127.798" location="1" name="53129.73c" path="900K/I_129_900K.ace" temperature="7.756e-08" zaid="53129"/>
<ace_table alias="I-130.73c" awr="128.791" location="1" name="53130.73c" path="900K/I_130_900K.ace" temperature="7.756e-08" zaid="53130"/>
<ace_table alias="I-131.73c" awr="129.781" location="1" name="53131.73c" path="900K/I_131_900K.ace" temperature="7.756e-08" zaid="53131"/>
<ace_table alias="I-135.73c" awr="133.75" location="1" name="53135.73c" path="900K/I_135_900K.ace" temperature="7.756e-08" zaid="53135"/>
<ace_table alias="Xe-123.73c" awr="121.8526" location="1" name="54123.73c" path="900K/Xe_123_900K.ace" temperature="7.756e-08" zaid="54123"/>
<ace_table alias="Xe-124.73c" awr="122.8415" location="1" name="54124.73c" path="900K/Xe_124_900K.ace" temperature="7.756e-08" zaid="54124"/>
<ace_table alias="Xe-126.73c" awr="124.822" location="1" name="54126.73c" path="900K/Xe_126_900K.ace" temperature="7.756e-08" zaid="54126"/>
<ace_table alias="Xe-128.73c" awr="126.804" location="1" name="54128.73c" path="900K/Xe_128_900K.ace" temperature="7.756e-08" zaid="54128"/>
<ace_table alias="Xe-129.73c" awr="127.798" location="1" name="54129.73c" path="900K/Xe_129_900K.ace" temperature="7.756e-08" zaid="54129"/>
<ace_table alias="Xe-130.73c" awr="128.788" location="1" name="54130.73c" path="900K/Xe_130_900K.ace" temperature="7.756e-08" zaid="54130"/>
<ace_table alias="Xe-131.73c" awr="129.781" location="1" name="54131.73c" path="900K/Xe_131_900K.ace" temperature="7.756e-08" zaid="54131"/>
<ace_table alias="Xe-132.73c" awr="130.77" location="1" name="54132.73c" path="900K/Xe_132_900K.ace" temperature="7.756e-08" zaid="54132"/>
<ace_table alias="Xe-133.73c" awr="131.764" location="1" name="54133.73c" path="900K/Xe_133_900K.ace" temperature="7.756e-08" zaid="54133"/>
<ace_table alias="Xe-134.73c" awr="132.76" location="1" name="54134.73c" path="900K/Xe_134_900K.ace" temperature="7.756e-08" zaid="54134"/>
<ace_table alias="Xe-135.73c" awr="133.748" location="1" name="54135.73c" path="900K/Xe_135_900K.ace" temperature="7.756e-08" zaid="54135"/>
<ace_table alias="Xe-136.73c" awr="134.74" location="1" name="54136.73c" path="900K/Xe_136_900K.ace" temperature="7.756e-08" zaid="54136"/>
<ace_table alias="Cs-133.73c" awr="131.764" location="1" name="55133.73c" path="900K/Cs_133_900K.ace" temperature="7.756e-08" zaid="55133"/>
<ace_table alias="Cs-134.73c" awr="132.757" location="1" name="55134.73c" path="900K/Cs_134_900K.ace" temperature="7.756e-08" zaid="55134"/>
<ace_table alias="Cs-135.73c" awr="133.747" location="1" name="55135.73c" path="900K/Cs_135_900K.ace" temperature="7.756e-08" zaid="55135"/>
<ace_table alias="Cs-136.73c" awr="134.739" location="1" name="55136.73c" path="900K/Cs_136_900K.ace" temperature="7.756e-08" zaid="55136"/>
<ace_table alias="Cs-137.73c" awr="135.731" location="1" name="55137.73c" path="900K/Cs_137_900K.ace" temperature="7.756e-08" zaid="55137"/>
<ace_table alias="Ba-130.73c" awr="128.79" location="1" name="56130.73c" path="900K/Ba_130_900K.ace" temperature="7.756e-08" zaid="56130"/>
<ace_table alias="Ba-132.73c" awr="130.772" location="1" name="56132.73c" path="900K/Ba_132_900K.ace" temperature="7.756e-08" zaid="56132"/>
<ace_table alias="Ba-133.73c" awr="131.764" location="1" name="56133.73c" path="900K/Ba_133_900K.ace" temperature="7.756e-08" zaid="56133"/>
<ace_table alias="Ba-134.73c" awr="132.754" location="1" name="56134.73c" path="900K/Ba_134_900K.ace" temperature="7.756e-08" zaid="56134"/>
<ace_table alias="Ba-135.73c" awr="133.747" location="1" name="56135.73c" path="900K/Ba_135_900K.ace" temperature="7.756e-08" zaid="56135"/>
<ace_table alias="Ba-136.73c" awr="134.737" location="1" name="56136.73c" path="900K/Ba_136_900K.ace" temperature="7.756e-08" zaid="56136"/>
<ace_table alias="Ba-137.73c" awr="135.73" location="1" name="56137.73c" path="900K/Ba_137_900K.ace" temperature="7.756e-08" zaid="56137"/>
<ace_table alias="Ba-138.73c" awr="136.72" location="1" name="56138.73c" path="900K/Ba_138_900K.ace" temperature="7.756e-08" zaid="56138"/>
<ace_table alias="Ba-140.73c" awr="138.708" location="1" name="56140.73c" path="900K/Ba_140_900K.ace" temperature="7.756e-08" zaid="56140"/>
<ace_table alias="La-138.73c" awr="136.722" location="1" name="57138.73c" path="900K/La_138_900K.ace" temperature="7.756e-08" zaid="57138"/>
<ace_table alias="La-139.73c" awr="137.71" location="1" name="57139.73c" path="900K/La_139_900K.ace" temperature="7.756e-08" zaid="57139"/>
<ace_table alias="La-140.73c" awr="138.708" location="1" name="57140.73c" path="900K/La_140_900K.ace" temperature="7.756e-08" zaid="57140"/>
<ace_table alias="Ce-136.73c" awr="134.74" location="1" name="58136.73c" path="900K/Ce_136_900K.ace" temperature="7.756e-08" zaid="58136"/>
<ace_table alias="Ce-138.73c" awr="136.721" location="1" name="58138.73c" path="900K/Ce_138_900K.ace" temperature="7.756e-08" zaid="58138"/>
<ace_table alias="Ce-139.73c" awr="137.713" location="1" name="58139.73c" path="900K/Ce_139_900K.ace" temperature="7.756e-08" zaid="58139"/>
<ace_table alias="Ce-140.73c" awr="138.704" location="1" name="58140.73c" path="900K/Ce_140_900K.ace" temperature="7.756e-08" zaid="58140"/>
<ace_table alias="Ce-141.73c" awr="139.7" location="1" name="58141.73c" path="900K/Ce_141_900K.ace" temperature="7.756e-08" zaid="58141"/>
<ace_table alias="Ce-142.73c" awr="140.69" location="1" name="58142.73c" path="900K/Ce_142_900K.ace" temperature="7.756e-08" zaid="58142"/>
<ace_table alias="Ce-143.73c" awr="141.685" location="1" name="58143.73c" path="900K/Ce_143_900K.ace" temperature="7.756e-08" zaid="58143"/>
<ace_table alias="Ce-144.73c" awr="142.678" location="1" name="58144.73c" path="900K/Ce_144_900K.ace" temperature="7.756e-08" zaid="58144"/>
<ace_table alias="Pr-141.73c" awr="139.697" location="1" name="59141.73c" path="900K/Pr_141_900K.ace" temperature="7.756e-08" zaid="59141"/>
<ace_table alias="Pr-142.73c" awr="140.691" location="1" name="59142.73c" path="900K/Pr_142_900K.ace" temperature="7.756e-08" zaid="59142"/>
<ace_table alias="Pr-143.73c" awr="141.683" location="1" name="59143.73c" path="900K/Pr_143_900K.ace" temperature="7.756e-08" zaid="59143"/>
<ace_table alias="Nd-142.73c" awr="140.689" location="1" name="60142.73c" path="900K/Nd_142_900K.ace" temperature="7.756e-08" zaid="60142"/>
<ace_table alias="Nd-143.73c" awr="141.682" location="1" name="60143.73c" path="900K/Nd_143_900K.ace" temperature="7.756e-08" zaid="60143"/>
<ace_table alias="Nd-144.73c" awr="142.674" location="1" name="60144.73c" path="900K/Nd_144_900K.ace" temperature="7.756e-08" zaid="60144"/>
<ace_table alias="Nd-145.73c" awr="143.668" location="1" name="60145.73c" path="900K/Nd_145_900K.ace" temperature="7.756e-08" zaid="60145"/>
<ace_table alias="Nd-146.73c" awr="144.66" location="1" name="60146.73c" path="900K/Nd_146_900K.ace" temperature="7.756e-08" zaid="60146"/>
<ace_table alias="Nd-147.73c" awr="145.654" location="1" name="60147.73c" path="900K/Nd_147_900K.ace" temperature="7.756e-08" zaid="60147"/>
<ace_table alias="Nd-148.73c" awr="146.646" location="1" name="60148.73c" path="900K/Nd_148_900K.ace" temperature="7.756e-08" zaid="60148"/>
<ace_table alias="Nd-150.73c" awr="148.633" location="1" name="60150.73c" path="900K/Nd_150_900K.ace" temperature="7.756e-08" zaid="60150"/>
<ace_table alias="Pm-147.73c" awr="145.653" location="1" name="61147.73c" path="900K/Pm_147_900K.ace" temperature="7.756e-08" zaid="61147"/>
<ace_table alias="Pm-148.73c" awr="146.646" location="1" name="61148.73c" path="900K/Pm_148_900K.ace" temperature="7.756e-08" zaid="61148"/>
<ace_table alias="Pm-149.73c" awr="146.65" location="1" name="61149.73c" path="900K/Pm_148m1_900K.ace" temperature="7.756e-08" zaid="61149"/>
<ace_table alias="Pm-149.73c" awr="147.639" location="1" name="61149.73c" path="900K/Pm_149_900K.ace" temperature="7.756e-08" zaid="61149"/>
<ace_table alias="Pm-151.73c" awr="149.625" location="1" name="61151.73c" path="900K/Pm_151_900K.ace" temperature="7.756e-08" zaid="61151"/>
<ace_table alias="Sm-144.73c" awr="142.676" location="1" name="62144.73c" path="900K/Sm_144_900K.ace" temperature="7.756e-08" zaid="62144"/>
<ace_table alias="Sm-147.73c" awr="145.653" location="1" name="62147.73c" path="900K/Sm_147_900K.ace" temperature="7.756e-08" zaid="62147"/>
<ace_table alias="Sm-148.73c" awr="146.644" location="1" name="62148.73c" path="900K/Sm_148_900K.ace" temperature="7.756e-08" zaid="62148"/>
<ace_table alias="Sm-149.73c" awr="147.638" location="1" name="62149.73c" path="900K/Sm_149_900K.ace" temperature="7.756e-08" zaid="62149"/>
<ace_table alias="Sm-150.73c" awr="148.629" location="1" name="62150.73c" path="900K/Sm_150_900K.ace" temperature="7.756e-08" zaid="62150"/>
<ace_table alias="Sm-151.73c" awr="149.623" location="1" name="62151.73c" path="900K/Sm_151_900K.ace" temperature="7.756e-08" zaid="62151"/>
<ace_table alias="Sm-152.73c" awr="150.615" location="1" name="62152.73c" path="900K/Sm_152_900K.ace" temperature="7.756e-08" zaid="62152"/>
<ace_table alias="Sm-153.73c" awr="151.608" location="1" name="62153.73c" path="900K/Sm_153_900K.ace" temperature="7.756e-08" zaid="62153"/>
<ace_table alias="Sm-154.73c" awr="152.6" location="1" name="62154.73c" path="900K/Sm_154_900K.ace" temperature="7.756e-08" zaid="62154"/>
<ace_table alias="Eu-151.73c" awr="149.62" location="1" name="63151.73c" path="900K/Eu_151_900K.ace" temperature="7.756e-08" zaid="63151"/>
<ace_table alias="Eu-152.73c" awr="150.617" location="1" name="63152.73c" path="900K/Eu_152_900K.ace" temperature="7.756e-08" zaid="63152"/>
<ace_table alias="Eu-153.73c" awr="151.608" location="1" name="63153.73c" path="900K/Eu_153_900K.ace" temperature="7.756e-08" zaid="63153"/>
<ace_table alias="Eu-154.73c" awr="152.6" location="1" name="63154.73c" path="900K/Eu_154_900K.ace" temperature="7.756e-08" zaid="63154"/>
<ace_table alias="Eu-155.73c" awr="153.59" location="1" name="63155.73c" path="900K/Eu_155_900K.ace" temperature="7.756e-08" zaid="63155"/>
<ace_table alias="Eu-156.73c" awr="154.586" location="1" name="63156.73c" path="900K/Eu_156_900K.ace" temperature="7.756e-08" zaid="63156"/>
<ace_table alias="Eu-157.73c" awr="155.577" location="1" name="63157.73c" path="900K/Eu_157_900K.ace" temperature="7.756e-08" zaid="63157"/>
<ace_table alias="Gd-152.73c" awr="150.615" location="1" name="64152.73c" path="900K/Gd_152_900K.ace" temperature="7.756e-08" zaid="64152"/>
<ace_table alias="Gd-153.73c" awr="151.608" location="1" name="64153.73c" path="900K/Gd_153_900K.ace" temperature="7.756e-08" zaid="64153"/>
<ace_table alias="Gd-154.73c" awr="152.599" location="1" name="64154.73c" path="900K/Gd_154_900K.ace" temperature="7.756e-08" zaid="64154"/>
<ace_table alias="Gd-155.73c" awr="153.592" location="1" name="64155.73c" path="900K/Gd_155_900K.ace" temperature="7.756e-08" zaid="64155"/>
<ace_table alias="Gd-156.73c" awr="154.583" location="1" name="64156.73c" path="900K/Gd_156_900K.ace" temperature="7.756e-08" zaid="64156"/>
<ace_table alias="Gd-157.73c" awr="155.576" location="1" name="64157.73c" path="900K/Gd_157_900K.ace" temperature="7.756e-08" zaid="64157"/>
<ace_table alias="Gd-158.73c" awr="156.567" location="1" name="64158.73c" path="900K/Gd_158_900K.ace" temperature="7.756e-08" zaid="64158"/>
<ace_table alias="Gd-160.73c" awr="158.553" location="1" name="64160.73c" path="900K/Gd_160_900K.ace" temperature="7.756e-08" zaid="64160"/>
<ace_table alias="Tb-159.73c" awr="157.56" location="1" name="65159.73c" path="900K/Tb_159_900K.ace" temperature="7.756e-08" zaid="65159"/>
<ace_table alias="Tb-160.73c" awr="158.553" location="1" name="65160.73c" path="900K/Tb_160_900K.ace" temperature="7.756e-08" zaid="65160"/>
<ace_table alias="Dy-156.73c" awr="154.585" location="1" name="66156.73c" path="900K/Dy_156_900K.ace" temperature="7.756e-08" zaid="66156"/>
<ace_table alias="Dy-158.73c" awr="156.568" location="1" name="66158.73c" path="900K/Dy_158_900K.ace" temperature="7.756e-08" zaid="66158"/>
<ace_table alias="Dy-160.73c" awr="158.551" location="1" name="66160.73c" path="900K/Dy_160_900K.ace" temperature="7.756e-08" zaid="66160"/>
<ace_table alias="Dy-161.73c" awr="159.544" location="1" name="66161.73c" path="900K/Dy_161_900K.ace" temperature="7.756e-08" zaid="66161"/>
<ace_table alias="Dy-162.73c" awr="160.536" location="1" name="66162.73c" path="900K/Dy_162_900K.ace" temperature="7.756e-08" zaid="66162"/>
<ace_table alias="Dy-163.73c" awr="161.529" location="1" name="66163.73c" path="900K/Dy_163_900K.ace" temperature="7.756e-08" zaid="66163"/>
<ace_table alias="Dy-164.73c" awr="162.521" location="1" name="66164.73c" path="900K/Dy_164_900K.ace" temperature="7.756e-08" zaid="66164"/>
<ace_table alias="Ho-165.73c" awr="163.513" location="1" name="67165.73c" path="900K/Ho_165_900K.ace" temperature="7.756e-08" zaid="67165"/>
<ace_table alias="Ho-169.73c" awr="164.507" location="1" name="67169.73c" path="900K/Ho_166m1_900K.ace" temperature="7.756e-08" zaid="67169"/>
<ace_table alias="Er-162.73c" awr="160.538" location="1" name="68162.73c" path="900K/Er_162_900K.ace" temperature="7.756e-08" zaid="68162"/>
<ace_table alias="Er-164.73c" awr="162.521" location="1" name="68164.73c" path="900K/Er_164_900K.ace" temperature="7.756e-08" zaid="68164"/>
<ace_table alias="Er-166.73c" awr="164.505" location="1" name="68166.73c" path="900K/Er_166_900K.ace" temperature="7.756e-08" zaid="68166"/>
<ace_table alias="Er-167.73c" awr="165.498" location="1" name="68167.73c" path="900K/Er_167_900K.ace" temperature="7.756e-08" zaid="68167"/>
<ace_table alias="Er-168.73c" awr="166.487" location="1" name="68168.73c" path="900K/Er_168_900K.ace" temperature="7.756e-08" zaid="68168"/>
<ace_table alias="Er-170.73c" awr="168.476" location="1" name="68170.73c" path="900K/Er_170_900K.ace" temperature="7.756e-08" zaid="68170"/>
<ace_table alias="Tm-168.73c" awr="166.492" location="1" name="69168.73c" path="900K/Tm_168_900K.ace" temperature="7.756e-08" zaid="69168"/>
<ace_table alias="Tm-169.73c" awr="167.483" location="1" name="69169.73c" path="900K/Tm_169_900K.ace" temperature="7.756e-08" zaid="69169"/>
<ace_table alias="Tm-170.73c" awr="168.476" location="1" name="69170.73c" path="900K/Tm_170_900K.ace" temperature="7.756e-08" zaid="69170"/>
<ace_table alias="Lu-175.73c" awr="173.438" location="1" name="71175.73c" path="900K/Lu_175_900K.ace" temperature="7.756e-08" zaid="71175"/>
<ace_table alias="Lu-176.73c" awr="174.43" location="1" name="71176.73c" path="900K/Lu_176_900K.ace" temperature="7.756e-08" zaid="71176"/>
<ace_table alias="Hf-174.73c" awr="172.446" location="1" name="72174.73c" path="900K/Hf_174_900K.ace" temperature="7.756e-08" zaid="72174"/>
<ace_table alias="Hf-176.73c" awr="174.429" location="1" name="72176.73c" path="900K/Hf_176_900K.ace" temperature="7.756e-08" zaid="72176"/>
<ace_table alias="Hf-177.73c" awr="175.42" location="1" name="72177.73c" path="900K/Hf_177_900K.ace" temperature="7.756e-08" zaid="72177"/>
<ace_table alias="Hf-178.73c" awr="176.411" location="1" name="72178.73c" path="900K/Hf_178_900K.ace" temperature="7.756e-08" zaid="72178"/>
<ace_table alias="Hf-179.73c" awr="177.413" location="1" name="72179.73c" path="900K/Hf_179_900K.ace" temperature="7.756e-08" zaid="72179"/>
<ace_table alias="Hf-180.73c" awr="178.404" location="1" name="72180.73c" path="900K/Hf_180_900K.ace" temperature="7.756e-08" zaid="72180"/>
<ace_table alias="Ta-180.73c" awr="178.4016" location="1" name="73180.73c" path="900K/Ta_180_900K.ace" temperature="7.756e-08" zaid="73180"/>
<ace_table alias="Ta-181.73c" awr="179.3936" location="1" name="73181.73c" path="900K/Ta_181_900K.ace" temperature="7.756e-08" zaid="73181"/>
<ace_table alias="Ta-182.73c" awr="180.387" location="1" name="73182.73c" path="900K/Ta_182_900K.ace" temperature="7.756e-08" zaid="73182"/>
<ace_table alias="W-180.73c" awr="178.401" location="1" name="74180.73c" path="900K/W_180_900K.ace" temperature="7.756e-08" zaid="74180"/>
<ace_table alias="W-182.73c" awr="180.385" location="1" name="74182.73c" path="900K/W_182_900K.ace" temperature="7.756e-08" zaid="74182"/>
<ace_table alias="W-183.73c" awr="181.379" location="1" name="74183.73c" path="900K/W_183_900K.ace" temperature="7.756e-08" zaid="74183"/>
<ace_table alias="W-184.73c" awr="182.371" location="1" name="74184.73c" path="900K/W_184_900K.ace" temperature="7.756e-08" zaid="74184"/>
<ace_table alias="W-186.73c" awr="184.357" location="1" name="74186.73c" path="900K/W_186_900K.ace" temperature="7.756e-08" zaid="74186"/>
<ace_table alias="Re-185.73c" awr="183.3641" location="1" name="75185.73c" path="900K/Re_185_900K.ace" temperature="7.756e-08" zaid="75185"/>
<ace_table alias="Re-187.73c" awr="185.3497" location="1" name="75187.73c" path="900K/Re_187_900K.ace" temperature="7.756e-08" zaid="75187"/>
<ace_table alias="Ir-191.73c" awr="189.32" location="1" name="77191.73c" path="900K/Ir_191_900K.ace" temperature="7.756e-08" zaid="77191"/>
<ace_table alias="Ir-193.73c" awr="191.305" location="1" name="77193.73c" path="900K/Ir_193_900K.ace" temperature="7.756e-08" zaid="77193"/>
<ace_table alias="Au-197.73c" awr="195.274" location="1" name="79197.73c" path="900K/Au_197_900K.ace" temperature="7.756e-08" zaid="79197"/>
<ace_table alias="Hg-196.73c" awr="194.282" location="1" name="80196.73c" path="900K/Hg_196_900K.ace" temperature="7.756e-08" zaid="80196"/>
<ace_table alias="Hg-198.73c" awr="196.266" location="1" name="80198.73c" path="900K/Hg_198_900K.ace" temperature="7.756e-08" zaid="80198"/>
<ace_table alias="Hg-199.73c" awr="197.259" location="1" name="80199.73c" path="900K/Hg_199_900K.ace" temperature="7.756e-08" zaid="80199"/>
<ace_table alias="Hg-200.73c" awr="198.25" location="1" name="80200.73c" path="900K/Hg_200_900K.ace" temperature="7.756e-08" zaid="80200"/>
<ace_table alias="Hg-201.73c" awr="199.244" location="1" name="80201.73c" path="900K/Hg_201_900K.ace" temperature="7.756e-08" zaid="80201"/>
<ace_table alias="Hg-202.73c" awr="200.236" location="1" name="80202.73c" path="900K/Hg_202_900K.ace" temperature="7.756e-08" zaid="80202"/>
<ace_table alias="Hg-204.73c" awr="202.221" location="1" name="80204.73c" path="900K/Hg_204_900K.ace" temperature="7.756e-08" zaid="80204"/>
<ace_table alias="Tl-203.73c" awr="201.229" location="1" name="81203.73c" path="900K/Tl_203_900K.ace" temperature="7.756e-08" zaid="81203"/>
<ace_table alias="Tl-205.73c" awr="203.214" location="1" name="81205.73c" path="900K/Tl_205_900K.ace" temperature="7.756e-08" zaid="81205"/>
<ace_table alias="Pb-204.73c" awr="202.2208" location="1" name="82204.73c" path="900K/Pb_204_900K.ace" temperature="7.756e-08" zaid="82204"/>
<ace_table alias="Pb-206.73c" awr="204.205" location="1" name="82206.73c" path="900K/Pb_206_900K.ace" temperature="7.756e-08" zaid="82206"/>
<ace_table alias="Pb-207.73c" awr="205.1979" location="1" name="82207.73c" path="900K/Pb_207_900K.ace" temperature="7.756e-08" zaid="82207"/>
<ace_table alias="Pb-208.73c" awr="206.19" location="1" name="82208.73c" path="900K/Pb_208_900K.ace" temperature="7.756e-08" zaid="82208"/>
<ace_table alias="Bi-209.73c" awr="207.185" location="1" name="83209.73c" path="900K/Bi_209_900K.ace" temperature="7.756e-08" zaid="83209"/>
<ace_table alias="Ra-223.73c" awr="221.103" location="1" name="88223.73c" path="900K/Ra_223_900K.ace" temperature="7.756e-08" zaid="88223"/>
<ace_table alias="Ra-224.73c" awr="222.096" location="1" name="88224.73c" path="900K/Ra_224_900K.ace" temperature="7.756e-08" zaid="88224"/>
<ace_table alias="Ra-225.73c" awr="223.091" location="1" name="88225.73c" path="900K/Ra_225_900K.ace" temperature="7.756e-08" zaid="88225"/>
<ace_table alias="Ra-226.73c" awr="224.084" location="1" name="88226.73c" path="900K/Ra_226_900K.ace" temperature="7.756e-08" zaid="88226"/>
<ace_table alias="Ac-225.73c" awr="223.09" location="1" name="89225.73c" path="900K/Ac_225_900K.ace" temperature="7.756e-08" zaid="89225"/>
<ace_table alias="Ac-226.73c" awr="224.084" location="1" name="89226.73c" path="900K/Ac_226_900K.ace" temperature="7.756e-08" zaid="89226"/>
<ace_table alias="Ac-227.73c" awr="225.077" location="1" name="89227.73c" path="900K/Ac_227_900K.ace" temperature="7.756e-08" zaid="89227"/>
<ace_table alias="Th-227.73c" awr="225.077" location="1" name="90227.73c" path="900K/Th_227_900K.ace" temperature="7.756e-08" zaid="90227"/>
<ace_table alias="Th-228.73c" awr="226.07" location="1" name="90228.73c" path="900K/Th_228_900K.ace" temperature="7.756e-08" zaid="90228"/>
<ace_table alias="Th-229.73c" awr="227.064" location="1" name="90229.73c" path="900K/Th_229_900K.ace" temperature="7.756e-08" zaid="90229"/>
<ace_table alias="Th-230.73c" awr="228.057" location="1" name="90230.73c" path="900K/Th_230_900K.ace" temperature="7.756e-08" zaid="90230"/>
<ace_table alias="Th-231.73c" awr="229.052" location="1" name="90231.73c" path="900K/Th_231_900K.ace" temperature="7.756e-08" zaid="90231"/>
<ace_table alias="Th-232.73c" awr="230.045" location="1" name="90232.73c" path="900K/Th_232_900K.ace" temperature="7.756e-08" zaid="90232"/>
<ace_table alias="Th-233.73c" awr="231.04" location="1" name="90233.73c" path="900K/Th_233_900K.ace" temperature="7.756e-08" zaid="90233"/>
<ace_table alias="Th-234.73c" awr="232.033" location="1" name="90234.73c" path="900K/Th_234_900K.ace" temperature="7.756e-08" zaid="90234"/>
<ace_table alias="Pa-229.73c" awr="227.065" location="1" name="91229.73c" path="900K/Pa_229_900K.ace" temperature="7.756e-08" zaid="91229"/>
<ace_table alias="Pa-230.73c" awr="228.058" location="1" name="91230.73c" path="900K/Pa_230_900K.ace" temperature="7.756e-08" zaid="91230"/>
<ace_table alias="Pa-231.73c" awr="229.051" location="1" name="91231.73c" path="900K/Pa_231_900K.ace" temperature="7.756e-08" zaid="91231"/>
<ace_table alias="Pa-232.73c" awr="230.045" location="1" name="91232.73c" path="900K/Pa_232_900K.ace" temperature="7.756e-08" zaid="91232"/>
<ace_table alias="Pa-233.73c" awr="231.038" location="1" name="91233.73c" path="900K/Pa_233_900K.ace" temperature="7.756e-08" zaid="91233"/>
<ace_table alias="U-230.73c" awr="228.058" location="1" name="92230.73c" path="900K/U_230_900K.ace" temperature="7.756e-08" zaid="92230"/>
<ace_table alias="U-231.73c" awr="229.052" location="1" name="92231.73c" path="900K/U_231_900K.ace" temperature="7.756e-08" zaid="92231"/>
<ace_table alias="U-232.73c" awr="230.044" location="1" name="92232.73c" path="900K/U_232_900K.ace" temperature="7.756e-08" zaid="92232"/>
<ace_table alias="U-233.73c" awr="231.0377" location="1" name="92233.73c" path="900K/U_233_900K.ace" temperature="7.756e-08" zaid="92233"/>
<ace_table alias="U-234.73c" awr="232.0304" location="1" name="92234.73c" path="900K/U_234_900K.ace" temperature="7.756e-08" zaid="92234"/>
<ace_table alias="U-235.73c" awr="233.0248" location="1" name="92235.73c" path="900K/U_235_900K.ace" temperature="7.756e-08" zaid="92235"/>
<ace_table alias="U-236.73c" awr="234.0178" location="1" name="92236.73c" path="900K/U_236_900K.ace" temperature="7.756e-08" zaid="92236"/>
<ace_table alias="U-237.73c" awr="235.0124" location="1" name="92237.73c" path="900K/U_237_900K.ace" temperature="7.756e-08" zaid="92237"/>
<ace_table alias="U-238.73c" awr="236.0058" location="1" name="92238.73c" path="900K/U_238_900K.ace" temperature="7.756e-08" zaid="92238"/>
<ace_table alias="U-239.73c" awr="237.0007" location="1" name="92239.73c" path="900K/U_239_900K.ace" temperature="7.756e-08" zaid="92239"/>
<ace_table alias="U-240.73c" awr="237.9944" location="1" name="92240.73c" path="900K/U_240_900K.ace" temperature="7.756e-08" zaid="92240"/>
<ace_table alias="U-241.73c" awr="238.9895" location="1" name="92241.73c" path="900K/U_241_900K.ace" temperature="7.756e-08" zaid="92241"/>
<ace_table alias="Np-234.73c" awr="232.032" location="1" name="93234.73c" path="900K/Np_234_900K.ace" temperature="7.756e-08" zaid="93234"/>
<ace_table alias="Np-235.73c" awr="233.025" location="1" name="93235.73c" path="900K/Np_235_900K.ace" temperature="7.756e-08" zaid="93235"/>
<ace_table alias="Np-236.73c" awr="234.019" location="1" name="93236.73c" path="900K/Np_236_900K.ace" temperature="7.756e-08" zaid="93236"/>
<ace_table alias="Np-237.73c" awr="235.0118" location="1" name="93237.73c" path="900K/Np_237_900K.ace" temperature="7.756e-08" zaid="93237"/>
<ace_table alias="Np-238.73c" awr="236.006" location="1" name="93238.73c" path="900K/Np_238_900K.ace" temperature="7.756e-08" zaid="93238"/>
<ace_table alias="Np-239.73c" awr="236.999" location="1" name="93239.73c" path="900K/Np_239_900K.ace" temperature="7.756e-08" zaid="93239"/>
<ace_table alias="Pu-236.73c" awr="234.018" location="1" name="94236.73c" path="900K/Pu_236_900K.ace" temperature="7.756e-08" zaid="94236"/>
<ace_table alias="Pu-237.73c" awr="235.012" location="1" name="94237.73c" path="900K/Pu_237_900K.ace" temperature="7.756e-08" zaid="94237"/>
<ace_table alias="Pu-238.73c" awr="236.0046" location="1" name="94238.73c" path="900K/Pu_238_900K.ace" temperature="7.756e-08" zaid="94238"/>
<ace_table alias="Pu-239.73c" awr="236.9986" location="1" name="94239.73c" path="900K/Pu_239_900K.ace" temperature="7.756e-08" zaid="94239"/>
<ace_table alias="Pu-240.73c" awr="237.9916" location="1" name="94240.73c" path="900K/Pu_240_900K.ace" temperature="7.756e-08" zaid="94240"/>
<ace_table alias="Pu-241.73c" awr="238.978" location="1" name="94241.73c" path="900K/Pu_241_900K.ace" temperature="7.756e-08" zaid="94241"/>
<ace_table alias="Pu-242.73c" awr="239.979" location="1" name="94242.73c" path="900K/Pu_242_900K.ace" temperature="7.756e-08" zaid="94242"/>
<ace_table alias="Pu-243.73c" awr="240.974" location="1" name="94243.73c" path="900K/Pu_243_900K.ace" temperature="7.756e-08" zaid="94243"/>
<ace_table alias="Pu-244.73c" awr="241.967" location="1" name="94244.73c" path="900K/Pu_244_900K.ace" temperature="7.756e-08" zaid="94244"/>
<ace_table alias="Pu-246.73c" awr="243.956" location="1" name="94246.73c" path="900K/Pu_246_900K.ace" temperature="7.756e-08" zaid="94246"/>
<ace_table alias="Am-240.73c" awr="237.993" location="1" name="95240.73c" path="900K/Am_240_900K.ace" temperature="7.756e-08" zaid="95240"/>
<ace_table alias="Am-241.73c" awr="238.986" location="1" name="95241.73c" path="900K/Am_241_900K.ace" temperature="7.756e-08" zaid="95241"/>
<ace_table alias="Am-242m.73c" awr="239.9801" location="1" metastable="1" name="95242.73c" path="900K/Am_242_900K.ace" temperature="7.756e-08" zaid="95242"/>
<ace_table alias="Am-249.73c" awr="239.9801" location="1" name="95249.73c" path="900K/Am_242m1_900K.ace" temperature="7.756e-08" zaid="95249"/>
<ace_table alias="Am-243.73c" awr="240.9734" location="1" name="95243.73c" path="900K/Am_243_900K.ace" temperature="7.756e-08" zaid="95243"/>
<ace_table alias="Am-244.73c" awr="241.968" location="1" name="95244.73c" path="900K/Am_244_900K.ace" temperature="7.756e-08" zaid="95244"/>
<ace_table alias="Am-249.73c" awr="241.968" location="1" name="95249.73c" path="900K/Am_244m1_900K.ace" temperature="7.756e-08" zaid="95249"/>
<ace_table alias="Cm-240.73c" awr="237.993" location="1" name="96240.73c" path="900K/Cm_240_900K.ace" temperature="7.756e-08" zaid="96240"/>
<ace_table alias="Cm-241.73c" awr="238.987" location="1" name="96241.73c" path="900K/Cm_241_900K.ace" temperature="7.756e-08" zaid="96241"/>
<ace_table alias="Cm-242.73c" awr="239.979" location="1" name="96242.73c" path="900K/Cm_242_900K.ace" temperature="7.756e-08" zaid="96242"/>
<ace_table alias="Cm-243.73c" awr="240.973" location="1" name="96243.73c" path="900K/Cm_243_900K.ace" temperature="7.756e-08" zaid="96243"/>
<ace_table alias="Cm-244.73c" awr="241.966" location="1" name="96244.73c" path="900K/Cm_244_900K.ace" temperature="7.756e-08" zaid="96244"/>
<ace_table alias="Cm-245.73c" awr="242.96" location="1" name="96245.73c" path="900K/Cm_245_900K.ace" temperature="7.756e-08" zaid="96245"/>
<ace_table alias="Cm-246.73c" awr="243.953" location="1" name="96246.73c" path="900K/Cm_246_900K.ace" temperature="7.756e-08" zaid="96246"/>
<ace_table alias="Cm-247.73c" awr="244.948" location="1" name="96247.73c" path="900K/Cm_247_900K.ace" temperature="7.756e-08" zaid="96247"/>
<ace_table alias="Cm-248.73c" awr="245.941" location="1" name="96248.73c" path="900K/Cm_248_900K.ace" temperature="7.756e-08" zaid="96248"/>
<ace_table alias="Cm-249.73c" awr="246.936" location="1" name="96249.73c" path="900K/Cm_249_900K.ace" temperature="7.756e-08" zaid="96249"/>
<ace_table alias="Cm-250.73c" awr="247.93" location="1" name="96250.73c" path="900K/Cm_250_900K.ace" temperature="7.756e-08" zaid="96250"/>
<ace_table alias="Bk-245.73c" awr="242.961" location="1" name="97245.73c" path="900K/Bk_245_900K.ace" temperature="7.756e-08" zaid="97245"/>
<ace_table alias="Bk-246.73c" awr="243.955" location="1" name="97246.73c" path="900K/Bk_246_900K.ace" temperature="7.756e-08" zaid="97246"/>
<ace_table alias="Bk-247.73c" awr="244.948" location="1" name="97247.73c" path="900K/Bk_247_900K.ace" temperature="7.756e-08" zaid="97247"/>
<ace_table alias="Bk-248.73c" awr="245.942" location="1" name="97248.73c" path="900K/Bk_248_900K.ace" temperature="7.756e-08" zaid="97248"/>
<ace_table alias="Bk-249.73c" awr="246.935" location="1" name="97249.73c" path="900K/Bk_249_900K.ace" temperature="7.756e-08" zaid="97249"/>
<ace_table alias="Bk-250.73c" awr="247.93" location="1" name="97250.73c" path="900K/Bk_250_900K.ace" temperature="7.756e-08" zaid="97250"/>
<ace_table alias="Cf-246.73c" awr="243.955" location="1" name="98246.73c" path="900K/Cf_246_900K.ace" temperature="7.756e-08" zaid="98246"/>
<ace_table alias="Cf-248.73c" awr="245.941" location="1" name="98248.73c" path="900K/Cf_248_900K.ace" temperature="7.756e-08" zaid="98248"/>
<ace_table alias="Cf-249.73c" awr="246.935" location="1" name="98249.73c" path="900K/Cf_249_900K.ace" temperature="7.756e-08" zaid="98249"/>
<ace_table alias="Cf-250.73c" awr="247.928" location="1" name="98250.73c" path="900K/Cf_250_900K.ace" temperature="7.756e-08" zaid="98250"/>
<ace_table alias="Cf-251.73c" awr="248.923" location="1" name="98251.73c" path="900K/Cf_251_900K.ace" temperature="7.756e-08" zaid="98251"/>
<ace_table alias="Cf-252.73c" awr="249.916" location="1" name="98252.73c" path="900K/Cf_252_900K.ace" temperature="7.756e-08" zaid="98252"/>
<ace_table alias="Cf-253.73c" awr="250.911" location="1" name="98253.73c" path="900K/Cf_253_900K.ace" temperature="7.756e-08" zaid="98253"/>
<ace_table alias="Cf-254.73c" awr="251.905" location="1" name="98254.73c" path="900K/Cf_254_900K.ace" temperature="7.756e-08" zaid="98254"/>
<ace_table alias="Es-251.73c" awr="248.923" location="1" name="99251.73c" path="900K/Es_251_900K.ace" temperature="7.756e-08" zaid="99251"/>
<ace_table alias="Es-252.73c" awr="249.917" location="1" name="99252.73c" path="900K/Es_252_900K.ace" temperature="7.756e-08" zaid="99252"/>
<ace_table alias="Es-253.73c" awr="250.911" location="1" name="99253.73c" path="900K/Es_253_900K.ace" temperature="7.756e-08" zaid="99253"/>
<ace_table alias="Es-254.73c" awr="251.905" location="1" name="99254.73c" path="900K/Es_254_900K.ace" temperature="7.756e-08" zaid="99254"/>
<ace_table alias="Es-259.73c" awr="251.905" location="1" name="99259.73c" path="900K/Es_254m1_900K.ace" temperature="7.756e-08" zaid="99259"/>
<ace_table alias="Es-255.73c" awr="252.899" location="1" name="99255.73c" path="900K/Es_255_900K.ace" temperature="7.756e-08" zaid="99255"/>
<ace_table alias="Fm-255.73c" awr="252.899" location="1" name="100255.73c" path="900K/Fm_255_900K.ace" temperature="7.756e-08" zaid="100255"/>
<ace_table alias="H-1.74c" awr="0.999167" location="1" name="1001.74c" path="1500K/H_001_1500K.ace" temperature="1.293e-07" zaid="1001"/>
<ace_table alias="H-2.74c" awr="1.9968" location="1" name="1002.74c" path="1500K/H_002_1500K.ace" temperature="1.293e-07" zaid="1002"/>
<ace_table alias="H-3.74c" awr="2.989596" location="1" name="1003.74c" path="1500K/H_003_1500K.ace" temperature="1.293e-07" zaid="1003"/>
<ace_table alias="He-3.74c" awr="2.989032" location="1" name="2003.74c" path="1500K/He_003_1500K.ace" temperature="1.293e-07" zaid="2003"/>
<ace_table alias="He-4.74c" awr="3.968219" location="1" name="2004.74c" path="1500K/He_004_1500K.ace" temperature="1.293e-07" zaid="2004"/>
<ace_table alias="Li-6.74c" awr="5.9634" location="1" name="3006.74c" path="1500K/Li_006_1500K.ace" temperature="1.293e-07" zaid="3006"/>
<ace_table alias="Li-7.74c" awr="6.955732" location="1" name="3007.74c" path="1500K/Li_007_1500K.ace" temperature="1.293e-07" zaid="3007"/>
<ace_table alias="Be-7.74c" awr="6.9545" location="1" name="4007.74c" path="1500K/Be_007_1500K.ace" temperature="1.293e-07" zaid="4007"/>
<ace_table alias="Be-9.74c" awr="8.93478" location="1" name="4009.74c" path="1500K/Be_009_1500K.ace" temperature="1.293e-07" zaid="4009"/>
<ace_table alias="B-10.74c" awr="9.926921" location="1" name="5010.74c" path="1500K/B_010_1500K.ace" temperature="1.293e-07" zaid="5010"/>
<ace_table alias="B-11.74c" awr="10.9147" location="1" name="5011.74c" path="1500K/B_011_1500K.ace" temperature="1.293e-07" zaid="5011"/>
<ace_table alias="C-Nat.74c" awr="11.898" location="1" name="6000.74c" path="1500K/C_000_1500K.ace" temperature="1.293e-07" zaid="6000"/>
<ace_table alias="N-14.74c" awr="13.88278" location="1" name="7014.74c" path="1500K/N_014_1500K.ace" temperature="1.293e-07" zaid="7014"/>
<ace_table alias="N-15.74c" awr="14.871" location="1" name="7015.74c" path="1500K/N_015_1500K.ace" temperature="1.293e-07" zaid="7015"/>
<ace_table alias="O-16.74c" awr="15.85751" location="1" name="8016.74c" path="1500K/O_016_1500K.ace" temperature="1.293e-07" zaid="8016"/>
<ace_table alias="O-17.74c" awr="16.8531" location="1" name="8017.74c" path="1500K/O_017_1500K.ace" temperature="1.293e-07" zaid="8017"/>
<ace_table alias="F-19.74c" awr="18.835" location="1" name="9019.74c" path="1500K/F_019_1500K.ace" temperature="1.293e-07" zaid="9019"/>
<ace_table alias="Na-22.74c" awr="21.8055" location="1" name="11022.74c" path="1500K/Na_022_1500K.ace" temperature="1.293e-07" zaid="11022"/>
<ace_table alias="Na-23.74c" awr="22.792" location="1" name="11023.74c" path="1500K/Na_023_1500K.ace" temperature="1.293e-07" zaid="11023"/>
<ace_table alias="Mg-24.74c" awr="23.779" location="1" name="12024.74c" path="1500K/Mg_024_1500K.ace" temperature="1.293e-07" zaid="12024"/>
<ace_table alias="Mg-25.74c" awr="24.7712" location="1" name="12025.74c" path="1500K/Mg_025_1500K.ace" temperature="1.293e-07" zaid="12025"/>
<ace_table alias="Mg-26.74c" awr="25.7594" location="1" name="12026.74c" path="1500K/Mg_026_1500K.ace" temperature="1.293e-07" zaid="12026"/>
<ace_table alias="Al-27.74c" awr="26.74975" location="1" name="13027.74c" path="1500K/Al_027_1500K.ace" temperature="1.293e-07" zaid="13027"/>
<ace_table alias="Si-28.74c" awr="27.737" location="1" name="14028.74c" path="1500K/Si_028_1500K.ace" temperature="1.293e-07" zaid="14028"/>
<ace_table alias="Si-29.74c" awr="28.728" location="1" name="14029.74c" path="1500K/Si_029_1500K.ace" temperature="1.293e-07" zaid="14029"/>
<ace_table alias="Si-30.74c" awr="29.716" location="1" name="14030.74c" path="1500K/Si_030_1500K.ace" temperature="1.293e-07" zaid="14030"/>
<ace_table alias="P-31.74c" awr="30.708" location="1" name="15031.74c" path="1500K/P_031_1500K.ace" temperature="1.293e-07" zaid="15031"/>
<ace_table alias="S-32.74c" awr="31.6973" location="1" name="16032.74c" path="1500K/S_032_1500K.ace" temperature="1.293e-07" zaid="16032"/>
<ace_table alias="S-33.74c" awr="32.6878" location="1" name="16033.74c" path="1500K/S_033_1500K.ace" temperature="1.293e-07" zaid="16033"/>
<ace_table alias="S-34.74c" awr="33.6762" location="1" name="16034.74c" path="1500K/S_034_1500K.ace" temperature="1.293e-07" zaid="16034"/>
<ace_table alias="S-36.74c" awr="35.658" location="1" name="16036.74c" path="1500K/S_036_1500K.ace" temperature="1.293e-07" zaid="16036"/>
<ace_table alias="Cl-35.74c" awr="34.66845" location="1" name="17035.74c" path="1500K/Cl_035_1500K.ace" temperature="1.293e-07" zaid="17035"/>
<ace_table alias="Cl-37.74c" awr="36.6483" location="1" name="17037.74c" path="1500K/Cl_037_1500K.ace" temperature="1.293e-07" zaid="17037"/>
<ace_table alias="Ar-36.74c" awr="35.6585" location="1" name="18036.74c" path="1500K/Ar_036_1500K.ace" temperature="1.293e-07" zaid="18036"/>
<ace_table alias="Ar-38.74c" awr="37.6366" location="1" name="18038.74c" path="1500K/Ar_038_1500K.ace" temperature="1.293e-07" zaid="18038"/>
<ace_table alias="Ar-40.74c" awr="39.6191" location="1" name="18040.74c" path="1500K/Ar_040_1500K.ace" temperature="1.293e-07" zaid="18040"/>
<ace_table alias="K-39.74c" awr="38.6293" location="1" name="19039.74c" path="1500K/K_039_1500K.ace" temperature="1.293e-07" zaid="19039"/>
<ace_table alias="K-40.74c" awr="39.6207" location="1" name="19040.74c" path="1500K/K_040_1500K.ace" temperature="1.293e-07" zaid="19040"/>
<ace_table alias="K-41.74c" awr="40.6101" location="1" name="19041.74c" path="1500K/K_041_1500K.ace" temperature="1.293e-07" zaid="19041"/>
<ace_table alias="Ca-40.74c" awr="39.6193" location="1" name="20040.74c" path="1500K/Ca_040_1500K.ace" temperature="1.293e-07" zaid="20040"/>
<ace_table alias="Ca-42.74c" awr="41.59818" location="1" name="20042.74c" path="1500K/Ca_042_1500K.ace" temperature="1.293e-07" zaid="20042"/>
<ace_table alias="Ca-43.74c" awr="42.58973" location="1" name="20043.74c" path="1500K/Ca_043_1500K.ace" temperature="1.293e-07" zaid="20043"/>
<ace_table alias="Ca-44.74c" awr="43.57788" location="1" name="20044.74c" path="1500K/Ca_044_1500K.ace" temperature="1.293e-07" zaid="20044"/>
<ace_table alias="Ca-46.74c" awr="45.55893" location="1" name="20046.74c" path="1500K/Ca_046_1500K.ace" temperature="1.293e-07" zaid="20046"/>
<ace_table alias="Ca-48.74c" awr="47.5406" location="1" name="20048.74c" path="1500K/Ca_048_1500K.ace" temperature="1.293e-07" zaid="20048"/>
<ace_table alias="Sc-45.74c" awr="44.5679" location="1" name="21045.74c" path="1500K/Sc_045_1500K.ace" temperature="1.293e-07" zaid="21045"/>
<ace_table alias="Ti-46.74c" awr="45.5579" location="1" name="22046.74c" path="1500K/Ti_046_1500K.ace" temperature="1.293e-07" zaid="22046"/>
<ace_table alias="Ti-47.74c" awr="46.5484" location="1" name="22047.74c" path="1500K/Ti_047_1500K.ace" temperature="1.293e-07" zaid="22047"/>
<ace_table alias="Ti-48.74c" awr="47.5361" location="1" name="22048.74c" path="1500K/Ti_048_1500K.ace" temperature="1.293e-07" zaid="22048"/>
<ace_table alias="Ti-49.74c" awr="48.5274" location="1" name="22049.74c" path="1500K/Ti_049_1500K.ace" temperature="1.293e-07" zaid="22049"/>
<ace_table alias="Ti-50.74c" awr="49.5157" location="1" name="22050.74c" path="1500K/Ti_050_1500K.ace" temperature="1.293e-07" zaid="22050"/>
<ace_table alias="V-50.74c" awr="49.5181" location="1" name="23050.74c" path="1500K/V_050_1500K.ace" temperature="1.293e-07" zaid="23050"/>
<ace_table alias="V-51.74c" awr="50.5063" location="1" name="23051.74c" path="1500K/V_051_1500K.ace" temperature="1.293e-07" zaid="23051"/>
<ace_table alias="Cr-50.74c" awr="49.517" location="1" name="24050.74c" path="1500K/Cr_050_1500K.ace" temperature="1.293e-07" zaid="24050"/>
<ace_table alias="Cr-52.74c" awr="51.494" location="1" name="24052.74c" path="1500K/Cr_052_1500K.ace" temperature="1.293e-07" zaid="24052"/>
<ace_table alias="Cr-53.74c" awr="52.486" location="1" name="24053.74c" path="1500K/Cr_053_1500K.ace" temperature="1.293e-07" zaid="24053"/>
<ace_table alias="Cr-54.74c" awr="53.476" location="1" name="24054.74c" path="1500K/Cr_054_1500K.ace" temperature="1.293e-07" zaid="24054"/>
<ace_table alias="Mn-55.74c" awr="54.4661" location="1" name="25055.74c" path="1500K/Mn_055_1500K.ace" temperature="1.293e-07" zaid="25055"/>
<ace_table alias="Fe-54.74c" awr="53.476" location="1" name="26054.74c" path="1500K/Fe_054_1500K.ace" temperature="1.293e-07" zaid="26054"/>
<ace_table alias="Fe-56.74c" awr="55.454" location="1" name="26056.74c" path="1500K/Fe_056_1500K.ace" temperature="1.293e-07" zaid="26056"/>
<ace_table alias="Fe-57.74c" awr="56.446" location="1" name="26057.74c" path="1500K/Fe_057_1500K.ace" temperature="1.293e-07" zaid="26057"/>
<ace_table alias="Fe-58.74c" awr="57.436" location="1" name="26058.74c" path="1500K/Fe_058_1500K.ace" temperature="1.293e-07" zaid="26058"/>
<ace_table alias="Co-58.74c" awr="57.4381" location="1" name="27058.74c" path="1500K/Co_058_1500K.ace" temperature="1.293e-07" zaid="27058"/>
<ace_table alias="Co-59.74c" awr="57.4381" location="1" name="27059.74c" path="1500K/Co_058m1_1500K.ace" temperature="1.293e-07" zaid="27059"/>
<ace_table alias="Co-59.74c" awr="58.4269" location="1" name="27059.74c" path="1500K/Co_059_1500K.ace" temperature="1.293e-07" zaid="27059"/>
<ace_table alias="Ni-58.74c" awr="57.438" location="1" name="28058.74c" path="1500K/Ni_058_1500K.ace" temperature="1.293e-07" zaid="28058"/>
<ace_table alias="Ni-59.74c" awr="58.4281" location="1" name="28059.74c" path="1500K/Ni_059_1500K.ace" temperature="1.293e-07" zaid="28059"/>
<ace_table alias="Ni-60.74c" awr="59.416" location="1" name="28060.74c" path="1500K/Ni_060_1500K.ace" temperature="1.293e-07" zaid="28060"/>
<ace_table alias="Ni-61.74c" awr="60.408" location="1" name="28061.74c" path="1500K/Ni_061_1500K.ace" temperature="1.293e-07" zaid="28061"/>
<ace_table alias="Ni-62.74c" awr="61.396" location="1" name="28062.74c" path="1500K/Ni_062_1500K.ace" temperature="1.293e-07" zaid="28062"/>
<ace_table alias="Ni-64.74c" awr="63.379" location="1" name="28064.74c" path="1500K/Ni_064_1500K.ace" temperature="1.293e-07" zaid="28064"/>
<ace_table alias="Cu-63.74c" awr="62.389" location="1" name="29063.74c" path="1500K/Cu_063_1500K.ace" temperature="1.293e-07" zaid="29063"/>
<ace_table alias="Cu-65.74c" awr="64.37" location="1" name="29065.74c" path="1500K/Cu_065_1500K.ace" temperature="1.293e-07" zaid="29065"/>
<ace_table alias="Zn-64.74c" awr="63.38" location="1" name="30064.74c" path="1500K/Zn_064_1500K.ace" temperature="1.293e-07" zaid="30064"/>
<ace_table alias="Zn-65.74c" awr="64.3715" location="1" name="30065.74c" path="1500K/Zn_065_1500K.ace" temperature="1.293e-07" zaid="30065"/>
<ace_table alias="Zn-66.74c" awr="65.3597" location="1" name="30066.74c" path="1500K/Zn_066_1500K.ace" temperature="1.293e-07" zaid="30066"/>
<ace_table alias="Zn-67.74c" awr="66.3522" location="1" name="30067.74c" path="1500K/Zn_067_1500K.ace" temperature="1.293e-07" zaid="30067"/>
<ace_table alias="Zn-68.74c" awr="67.3413" location="1" name="30068.74c" path="1500K/Zn_068_1500K.ace" temperature="1.293e-07" zaid="30068"/>
<ace_table alias="Zn-70.74c" awr="69.3246" location="1" name="30070.74c" path="1500K/Zn_070_1500K.ace" temperature="1.293e-07" zaid="30070"/>
<ace_table alias="Ga-69.74c" awr="68.3336" location="1" name="31069.74c" path="1500K/Ga_069_1500K.ace" temperature="1.293e-07" zaid="31069"/>
<ace_table alias="Ga-71.74c" awr="70.315" location="1" name="31071.74c" path="1500K/Ga_071_1500K.ace" temperature="1.293e-07" zaid="31071"/>
<ace_table alias="Ge-70.74c" awr="69.3236" location="1" name="32070.74c" path="1500K/Ge_070_1500K.ace" temperature="1.293e-07" zaid="32070"/>
<ace_table alias="Ge-72.74c" awr="71.3042" location="1" name="32072.74c" path="1500K/Ge_072_1500K.ace" temperature="1.293e-07" zaid="32072"/>
<ace_table alias="Ge-73.74c" awr="72.297" location="1" name="32073.74c" path="1500K/Ge_073_1500K.ace" temperature="1.293e-07" zaid="32073"/>
<ace_table alias="Ge-74.74c" awr="73.2862" location="1" name="32074.74c" path="1500K/Ge_074_1500K.ace" temperature="1.293e-07" zaid="32074"/>
<ace_table alias="Ge-76.74c" awr="75.2692" location="1" name="32076.74c" path="1500K/Ge_076_1500K.ace" temperature="1.293e-07" zaid="32076"/>
<ace_table alias="As-74.74c" awr="73.2889" location="1" name="33074.74c" path="1500K/As_074_1500K.ace" temperature="1.293e-07" zaid="33074"/>
<ace_table alias="As-75.74c" awr="74.278" location="1" name="33075.74c" path="1500K/As_075_1500K.ace" temperature="1.293e-07" zaid="33075"/>
<ace_table alias="Se-74.74c" awr="73.2875" location="1" name="34074.74c" path="1500K/Se_074_1500K.ace" temperature="1.293e-07" zaid="34074"/>
<ace_table alias="Se-76.74c" awr="75.267" location="1" name="34076.74c" path="1500K/Se_076_1500K.ace" temperature="1.293e-07" zaid="34076"/>
<ace_table alias="Se-77.74c" awr="76.2591" location="1" name="34077.74c" path="1500K/Se_077_1500K.ace" temperature="1.293e-07" zaid="34077"/>
<ace_table alias="Se-78.74c" awr="77.2479" location="1" name="34078.74c" path="1500K/Se_078_1500K.ace" temperature="1.293e-07" zaid="34078"/>
<ace_table alias="Se-79.74c" awr="78.2405" location="1" name="34079.74c" path="1500K/Se_079_1500K.ace" temperature="1.293e-07" zaid="34079"/>
<ace_table alias="Se-80.74c" awr="79.23" location="1" name="34080.74c" path="1500K/Se_080_1500K.ace" temperature="1.293e-07" zaid="34080"/>
<ace_table alias="Se-82.74c" awr="81.213" location="1" name="34082.74c" path="1500K/Se_082_1500K.ace" temperature="1.293e-07" zaid="34082"/>
<ace_table alias="Br-79.74c" awr="78.2403" location="1" name="35079.74c" path="1500K/Br_079_1500K.ace" temperature="1.293e-07" zaid="35079"/>
<ace_table alias="Br-81.74c" awr="80.2212" location="1" name="35081.74c" path="1500K/Br_081_1500K.ace" temperature="1.293e-07" zaid="35081"/>
<ace_table alias="Kr-78.74c" awr="77.25099" location="1" name="36078.74c" path="1500K/Kr_078_1500K.ace" temperature="1.293e-07" zaid="36078"/>
<ace_table alias="Kr-80.74c" awr="79.2299" location="1" name="36080.74c" path="1500K/Kr_080_1500K.ace" temperature="1.293e-07" zaid="36080"/>
<ace_table alias="Kr-82.74c" awr="81.2098" location="1" name="36082.74c" path="1500K/Kr_082_1500K.ace" temperature="1.293e-07" zaid="36082"/>
<ace_table alias="Kr-83.74c" awr="82.202" location="1" name="36083.74c" path="1500K/Kr_083_1500K.ace" temperature="1.293e-07" zaid="36083"/>
<ace_table alias="Kr-84.74c" awr="83.1907" location="1" name="36084.74c" path="1500K/Kr_084_1500K.ace" temperature="1.293e-07" zaid="36084"/>
<ace_table alias="Kr-85.74c" awr="84.1831" location="1" name="36085.74c" path="1500K/Kr_085_1500K.ace" temperature="1.293e-07" zaid="36085"/>
<ace_table alias="Kr-86.74c" awr="85.1726" location="1" name="36086.74c" path="1500K/Kr_086_1500K.ace" temperature="1.293e-07" zaid="36086"/>
<ace_table alias="Rb-85.74c" awr="84.1824" location="1" name="37085.74c" path="1500K/Rb_085_1500K.ace" temperature="1.293e-07" zaid="37085"/>
<ace_table alias="Rb-86.74c" awr="85.1731" location="1" name="37086.74c" path="1500K/Rb_086_1500K.ace" temperature="1.293e-07" zaid="37086"/>
<ace_table alias="Rb-87.74c" awr="86.1626" location="1" name="37087.74c" path="1500K/Rb_087_1500K.ace" temperature="1.293e-07" zaid="37087"/>
<ace_table alias="Sr-84.74c" awr="83.1926" location="1" name="38084.74c" path="1500K/Sr_084_1500K.ace" temperature="1.293e-07" zaid="38084"/>
<ace_table alias="Sr-86.74c" awr="85.1713" location="1" name="38086.74c" path="1500K/Sr_086_1500K.ace" temperature="1.293e-07" zaid="38086"/>
<ace_table alias="Sr-87.74c" awr="86.1623" location="1" name="38087.74c" path="1500K/Sr_087_1500K.ace" temperature="1.293e-07" zaid="38087"/>
<ace_table alias="Sr-88.74c" awr="87.15" location="1" name="38088.74c" path="1500K/Sr_088_1500K.ace" temperature="1.293e-07" zaid="38088"/>
<ace_table alias="Sr-89.74c" awr="88.144" location="1" name="38089.74c" path="1500K/Sr_089_1500K.ace" temperature="1.293e-07" zaid="38089"/>
<ace_table alias="Sr-90.74c" awr="89.1353" location="1" name="38090.74c" path="1500K/Sr_090_1500K.ace" temperature="1.293e-07" zaid="38090"/>
<ace_table alias="Y-89.74c" awr="88.1421" location="1" name="39089.74c" path="1500K/Y_089_1500K.ace" temperature="1.293e-07" zaid="39089"/>
<ace_table alias="Y-90.74c" awr="89.1348" location="1" name="39090.74c" path="1500K/Y_090_1500K.ace" temperature="1.293e-07" zaid="39090"/>
<ace_table alias="Y-91.74c" awr="90.1264" location="1" name="39091.74c" path="1500K/Y_091_1500K.ace" temperature="1.293e-07" zaid="39091"/>
<ace_table alias="Zr-90.74c" awr="89.1324" location="1" name="40090.74c" path="1500K/Zr_090_1500K.ace" temperature="1.293e-07" zaid="40090"/>
<ace_table alias="Zr-91.74c" awr="90.1247" location="1" name="40091.74c" path="1500K/Zr_091_1500K.ace" temperature="1.293e-07" zaid="40091"/>
<ace_table alias="Zr-92.74c" awr="91.1155" location="1" name="40092.74c" path="1500K/Zr_092_1500K.ace" temperature="1.293e-07" zaid="40092"/>
<ace_table alias="Zr-93.74c" awr="92.1084" location="1" name="40093.74c" path="1500K/Zr_093_1500K.ace" temperature="1.293e-07" zaid="40093"/>
<ace_table alias="Zr-94.74c" awr="93.0996" location="1" name="40094.74c" path="1500K/Zr_094_1500K.ace" temperature="1.293e-07" zaid="40094"/>
<ace_table alias="Zr-95.74c" awr="94.0927" location="1" name="40095.74c" path="1500K/Zr_095_1500K.ace" temperature="1.293e-07" zaid="40095"/>
<ace_table alias="Zr-96.74c" awr="95.0844" location="1" name="40096.74c" path="1500K/Zr_096_1500K.ace" temperature="1.293e-07" zaid="40096"/>
<ace_table alias="Nb-93.74c" awr="92.1051" location="1" name="41093.74c" path="1500K/Nb_093_1500K.ace" temperature="1.293e-07" zaid="41093"/>
<ace_table alias="Nb-94.74c" awr="93.1006" location="1" name="41094.74c" path="1500K/Nb_094_1500K.ace" temperature="1.293e-07" zaid="41094"/>
<ace_table alias="Nb-95.74c" awr="94.0915" location="1" name="41095.74c" path="1500K/Nb_095_1500K.ace" temperature="1.293e-07" zaid="41095"/>
<ace_table alias="Mo-92.74c" awr="91.1173" location="1" name="42092.74c" path="1500K/Mo_092_1500K.ace" temperature="1.293e-07" zaid="42092"/>
<ace_table alias="Mo-94.74c" awr="93.0984" location="1" name="42094.74c" path="1500K/Mo_094_1500K.ace" temperature="1.293e-07" zaid="42094"/>
<ace_table alias="Mo-95.74c" awr="94.0906" location="1" name="42095.74c" path="1500K/Mo_095_1500K.ace" temperature="1.293e-07" zaid="42095"/>
<ace_table alias="Mo-96.74c" awr="95.0808" location="1" name="42096.74c" path="1500K/Mo_096_1500K.ace" temperature="1.293e-07" zaid="42096"/>
<ace_table alias="Mo-97.74c" awr="96.0735" location="1" name="42097.74c" path="1500K/Mo_097_1500K.ace" temperature="1.293e-07" zaid="42097"/>
<ace_table alias="Mo-98.74c" awr="97.0643" location="1" name="42098.74c" path="1500K/Mo_098_1500K.ace" temperature="1.293e-07" zaid="42098"/>
<ace_table alias="Mo-99.74c" awr="98.058" location="1" name="42099.74c" path="1500K/Mo_099_1500K.ace" temperature="1.293e-07" zaid="42099"/>
<ace_table alias="Mo-100.74c" awr="99.049" location="1" name="42100.74c" path="1500K/Mo_100_1500K.ace" temperature="1.293e-07" zaid="42100"/>
<ace_table alias="Tc-99.74c" awr="98.0566" location="1" name="43099.74c" path="1500K/Tc_099_1500K.ace" temperature="1.293e-07" zaid="43099"/>
<ace_table alias="Ru-96.74c" awr="95.0837" location="1" name="44096.74c" path="1500K/Ru_096_1500K.ace" temperature="1.293e-07" zaid="44096"/>
<ace_table alias="Ru-98.74c" awr="97.0642" location="1" name="44098.74c" path="1500K/Ru_098_1500K.ace" temperature="1.293e-07" zaid="44098"/>
<ace_table alias="Ru-99.74c" awr="98.0562" location="1" name="44099.74c" path="1500K/Ru_099_1500K.ace" temperature="1.293e-07" zaid="44099"/>
<ace_table alias="Ru-100.74c" awr="99.046" location="1" name="44100.74c" path="1500K/Ru_100_1500K.ace" temperature="1.293e-07" zaid="44100"/>
<ace_table alias="Ru-101.74c" awr="100.039" location="1" name="44101.74c" path="1500K/Ru_101_1500K.ace" temperature="1.293e-07" zaid="44101"/>
<ace_table alias="Ru-102.74c" awr="101.03" location="1" name="44102.74c" path="1500K/Ru_102_1500K.ace" temperature="1.293e-07" zaid="44102"/>
<ace_table alias="Ru-103.74c" awr="102.02" location="1" name="44103.74c" path="1500K/Ru_103_1500K.ace" temperature="1.293e-07" zaid="44103"/>
<ace_table alias="Ru-104.74c" awr="103.01" location="1" name="44104.74c" path="1500K/Ru_104_1500K.ace" temperature="1.293e-07" zaid="44104"/>
<ace_table alias="Ru-105.74c" awr="104.01" location="1" name="44105.74c" path="1500K/Ru_105_1500K.ace" temperature="1.293e-07" zaid="44105"/>
<ace_table alias="Ru-106.74c" awr="104.997" location="1" name="44106.74c" path="1500K/Ru_106_1500K.ace" temperature="1.293e-07" zaid="44106"/>
<ace_table alias="Rh-103.74c" awr="102.021" location="1" name="45103.74c" path="1500K/Rh_103_1500K.ace" temperature="1.293e-07" zaid="45103"/>
<ace_table alias="Rh-105.74c" awr="104.0" location="1" name="45105.74c" path="1500K/Rh_105_1500K.ace" temperature="1.293e-07" zaid="45105"/>
<ace_table alias="Pd-102.74c" awr="101.0302" location="1" name="46102.74c" path="1500K/Pd_102_1500K.ace" temperature="1.293e-07" zaid="46102"/>
<ace_table alias="Pd-104.74c" awr="103.0114" location="1" name="46104.74c" path="1500K/Pd_104_1500K.ace" temperature="1.293e-07" zaid="46104"/>
<ace_table alias="Pd-105.74c" awr="104.004" location="1" name="46105.74c" path="1500K/Pd_105_1500K.ace" temperature="1.293e-07" zaid="46105"/>
<ace_table alias="Pd-106.74c" awr="104.9937" location="1" name="46106.74c" path="1500K/Pd_106_1500K.ace" temperature="1.293e-07" zaid="46106"/>
<ace_table alias="Pd-107.74c" awr="105.987" location="1" name="46107.74c" path="1500K/Pd_107_1500K.ace" temperature="1.293e-07" zaid="46107"/>
<ace_table alias="Pd-108.74c" awr="106.9769" location="1" name="46108.74c" path="1500K/Pd_108_1500K.ace" temperature="1.293e-07" zaid="46108"/>
<ace_table alias="Pd-110.74c" awr="108.961" location="1" name="46110.74c" path="1500K/Pd_110_1500K.ace" temperature="1.293e-07" zaid="46110"/>
<ace_table alias="Ag-107.74c" awr="105.987" location="1" name="47107.74c" path="1500K/Ag_107_1500K.ace" temperature="1.293e-07" zaid="47107"/>
<ace_table alias="Ag-109.74c" awr="107.969" location="1" name="47109.74c" path="1500K/Ag_109_1500K.ace" temperature="1.293e-07" zaid="47109"/>
<ace_table alias="Ag-119.74c" awr="108.962" location="1" name="47119.74c" path="1500K/Ag_110m1_1500K.ace" temperature="1.293e-07" zaid="47119"/>
<ace_table alias="Ag-111.74c" awr="109.953" location="1" name="47111.74c" path="1500K/Ag_111_1500K.ace" temperature="1.293e-07" zaid="47111"/>
<ace_table alias="Cd-106.74c" awr="104.996" location="1" name="48106.74c" path="1500K/Cd_106_1500K.ace" temperature="1.293e-07" zaid="48106"/>
<ace_table alias="Cd-108.74c" awr="106.977" location="1" name="48108.74c" path="1500K/Cd_108_1500K.ace" temperature="1.293e-07" zaid="48108"/>
<ace_table alias="Cd-110.74c" awr="108.959" location="1" name="48110.74c" path="1500K/Cd_110_1500K.ace" temperature="1.293e-07" zaid="48110"/>
<ace_table alias="Cd-111.74c" awr="109.951" location="1" name="48111.74c" path="1500K/Cd_111_1500K.ace" temperature="1.293e-07" zaid="48111"/>
<ace_table alias="Cd-112.74c" awr="110.942" location="1" name="48112.74c" path="1500K/Cd_112_1500K.ace" temperature="1.293e-07" zaid="48112"/>
<ace_table alias="Cd-113.74c" awr="111.93" location="1" name="48113.74c" path="1500K/Cd_113_1500K.ace" temperature="1.293e-07" zaid="48113"/>
<ace_table alias="Cd-114.74c" awr="112.925" location="1" name="48114.74c" path="1500K/Cd_114_1500K.ace" temperature="1.293e-07" zaid="48114"/>
<ace_table alias="Cd-119.74c" awr="113.918" location="1" name="48119.74c" path="1500K/Cd_115m1_1500K.ace" temperature="1.293e-07" zaid="48119"/>
<ace_table alias="Cd-116.74c" awr="114.909" location="1" name="48116.74c" path="1500K/Cd_116_1500K.ace" temperature="1.293e-07" zaid="48116"/>
<ace_table alias="In-113.74c" awr="111.934" location="1" name="49113.74c" path="1500K/In_113_1500K.ace" temperature="1.293e-07" zaid="49113"/>
<ace_table alias="In-115.74c" awr="113.917" location="1" name="49115.74c" path="1500K/In_115_1500K.ace" temperature="1.293e-07" zaid="49115"/>
<ace_table alias="Sn-112.74c" awr="110.944" location="1" name="50112.74c" path="1500K/Sn_112_1500K.ace" temperature="1.293e-07" zaid="50112"/>
<ace_table alias="Sn-113.74c" awr="111.935" location="1" name="50113.74c" path="1500K/Sn_113_1500K.ace" temperature="1.293e-07" zaid="50113"/>
<ace_table alias="Sn-114.74c" awr="112.925" location="1" name="50114.74c" path="1500K/Sn_114_1500K.ace" temperature="1.293e-07" zaid="50114"/>
<ace_table alias="Sn-115.74c" awr="113.916" location="1" name="50115.74c" path="1500K/Sn_115_1500K.ace" temperature="1.293e-07" zaid="50115"/>
<ace_table alias="Sn-116.74c" awr="114.906" location="1" name="50116.74c" path="1500K/Sn_116_1500K.ace" temperature="1.293e-07" zaid="50116"/>
<ace_table alias="Sn-117.74c" awr="115.899" location="1" name="50117.74c" path="1500K/Sn_117_1500K.ace" temperature="1.293e-07" zaid="50117"/>
<ace_table alias="Sn-118.74c" awr="116.889" location="1" name="50118.74c" path="1500K/Sn_118_1500K.ace" temperature="1.293e-07" zaid="50118"/>
<ace_table alias="Sn-119.74c" awr="117.882" location="1" name="50119.74c" path="1500K/Sn_119_1500K.ace" temperature="1.293e-07" zaid="50119"/>
<ace_table alias="Sn-120.74c" awr="118.872" location="1" name="50120.74c" path="1500K/Sn_120_1500K.ace" temperature="1.293e-07" zaid="50120"/>
<ace_table alias="Sn-122.74c" awr="120.856" location="1" name="50122.74c" path="1500K/Sn_122_1500K.ace" temperature="1.293e-07" zaid="50122"/>
<ace_table alias="Sn-123.74c" awr="121.85" location="1" name="50123.74c" path="1500K/Sn_123_1500K.ace" temperature="1.293e-07" zaid="50123"/>
<ace_table alias="Sn-124.74c" awr="122.841" location="1" name="50124.74c" path="1500K/Sn_124_1500K.ace" temperature="1.293e-07" zaid="50124"/>
<ace_table alias="Sn-125.74c" awr="123.835" location="1" name="50125.74c" path="1500K/Sn_125_1500K.ace" temperature="1.293e-07" zaid="50125"/>
<ace_table alias="Sn-126.74c" awr="124.826" location="1" name="50126.74c" path="1500K/Sn_126_1500K.ace" temperature="1.293e-07" zaid="50126"/>
<ace_table alias="Sb-121.74c" awr="119.87" location="1" name="51121.74c" path="1500K/Sb_121_1500K.ace" temperature="1.293e-07" zaid="51121"/>
<ace_table alias="Sb-123.74c" awr="121.85" location="1" name="51123.74c" path="1500K/Sb_123_1500K.ace" temperature="1.293e-07" zaid="51123"/>
<ace_table alias="Sb-124.74c" awr="122.842" location="1" name="51124.74c" path="1500K/Sb_124_1500K.ace" temperature="1.293e-07" zaid="51124"/>
<ace_table alias="Sb-125.74c" awr="123.832" location="1" name="51125.74c" path="1500K/Sb_125_1500K.ace" temperature="1.293e-07" zaid="51125"/>
<ace_table alias="Sb-126.74c" awr="124.826" location="1" name="51126.74c" path="1500K/Sb_126_1500K.ace" temperature="1.293e-07" zaid="51126"/>
<ace_table alias="Te-120.74c" awr="118.874" location="1" name="52120.74c" path="1500K/Te_120_1500K.ace" temperature="1.293e-07" zaid="52120"/>
<ace_table alias="Te-122.74c" awr="120.856" location="1" name="52122.74c" path="1500K/Te_122_1500K.ace" temperature="1.293e-07" zaid="52122"/>
<ace_table alias="Te-123.74c" awr="121.848" location="1" name="52123.74c" path="1500K/Te_123_1500K.ace" temperature="1.293e-07" zaid="52123"/>
<ace_table alias="Te-124.74c" awr="122.839" location="1" name="52124.74c" path="1500K/Te_124_1500K.ace" temperature="1.293e-07" zaid="52124"/>
<ace_table alias="Te-125.74c" awr="123.831" location="1" name="52125.74c" path="1500K/Te_125_1500K.ace" temperature="1.293e-07" zaid="52125"/>
<ace_table alias="Te-126.74c" awr="124.821" location="1" name="52126.74c" path="1500K/Te_126_1500K.ace" temperature="1.293e-07" zaid="52126"/>
<ace_table alias="Te-129.74c" awr="125.815" location="1" name="52129.74c" path="1500K/Te_127m1_1500K.ace" temperature="1.293e-07" zaid="52129"/>
<ace_table alias="Te-128.74c" awr="126.805" location="1" name="52128.74c" path="1500K/Te_128_1500K.ace" temperature="1.293e-07" zaid="52128"/>
<ace_table alias="Te-129.74c" awr="127.8" location="1" name="52129.74c" path="1500K/Te_129m1_1500K.ace" temperature="1.293e-07" zaid="52129"/>
<ace_table alias="Te-130.74c" awr="128.79" location="1" name="52130.74c" path="1500K/Te_130_1500K.ace" temperature="1.293e-07" zaid="52130"/>
<ace_table alias="Te-132.74c" awr="130.775" location="1" name="52132.74c" path="1500K/Te_132_1500K.ace" temperature="1.293e-07" zaid="52132"/>
<ace_table alias="I-127.74c" awr="125.8143" location="1" name="53127.74c" path="1500K/I_127_1500K.ace" temperature="1.293e-07" zaid="53127"/>
<ace_table alias="I-129.74c" awr="127.798" location="1" name="53129.74c" path="1500K/I_129_1500K.ace" temperature="1.293e-07" zaid="53129"/>
<ace_table alias="I-130.74c" awr="128.791" location="1" name="53130.74c" path="1500K/I_130_1500K.ace" temperature="1.293e-07" zaid="53130"/>
<ace_table alias="I-131.74c" awr="129.781" location="1" name="53131.74c" path="1500K/I_131_1500K.ace" temperature="1.293e-07" zaid="53131"/>
<ace_table alias="I-135.74c" awr="133.75" location="1" name="53135.74c" path="1500K/I_135_1500K.ace" temperature="1.293e-07" zaid="53135"/>
<ace_table alias="Xe-123.74c" awr="121.8526" location="1" name="54123.74c" path="1500K/Xe_123_1500K.ace" temperature="1.293e-07" zaid="54123"/>
<ace_table alias="Xe-124.74c" awr="122.8415" location="1" name="54124.74c" path="1500K/Xe_124_1500K.ace" temperature="1.293e-07" zaid="54124"/>
<ace_table alias="Xe-126.74c" awr="124.822" location="1" name="54126.74c" path="1500K/Xe_126_1500K.ace" temperature="1.293e-07" zaid="54126"/>
<ace_table alias="Xe-128.74c" awr="126.804" location="1" name="54128.74c" path="1500K/Xe_128_1500K.ace" temperature="1.293e-07" zaid="54128"/>
<ace_table alias="Xe-129.74c" awr="127.798" location="1" name="54129.74c" path="1500K/Xe_129_1500K.ace" temperature="1.293e-07" zaid="54129"/>
<ace_table alias="Xe-130.74c" awr="128.788" location="1" name="54130.74c" path="1500K/Xe_130_1500K.ace" temperature="1.293e-07" zaid="54130"/>
<ace_table alias="Xe-131.74c" awr="129.781" location="1" name="54131.74c" path="1500K/Xe_131_1500K.ace" temperature="1.293e-07" zaid="54131"/>
<ace_table alias="Xe-132.74c" awr="130.77" location="1" name="54132.74c" path="1500K/Xe_132_1500K.ace" temperature="1.293e-07" zaid="54132"/>
<ace_table alias="Xe-133.74c" awr="131.764" location="1" name="54133.74c" path="1500K/Xe_133_1500K.ace" temperature="1.293e-07" zaid="54133"/>
<ace_table alias="Xe-134.74c" awr="132.76" location="1" name="54134.74c" path="1500K/Xe_134_1500K.ace" temperature="1.293e-07" zaid="54134"/>
<ace_table alias="Xe-135.74c" awr="133.748" location="1" name="54135.74c" path="1500K/Xe_135_1500K.ace" temperature="1.293e-07" zaid="54135"/>
<ace_table alias="Xe-136.74c" awr="134.74" location="1" name="54136.74c" path="1500K/Xe_136_1500K.ace" temperature="1.293e-07" zaid="54136"/>
<ace_table alias="Cs-133.74c" awr="131.764" location="1" name="55133.74c" path="1500K/Cs_133_1500K.ace" temperature="1.293e-07" zaid="55133"/>
<ace_table alias="Cs-134.74c" awr="132.757" location="1" name="55134.74c" path="1500K/Cs_134_1500K.ace" temperature="1.293e-07" zaid="55134"/>
<ace_table alias="Cs-135.74c" awr="133.747" location="1" name="55135.74c" path="1500K/Cs_135_1500K.ace" temperature="1.293e-07" zaid="55135"/>
<ace_table alias="Cs-136.74c" awr="134.739" location="1" name="55136.74c" path="1500K/Cs_136_1500K.ace" temperature="1.293e-07" zaid="55136"/>
<ace_table alias="Cs-137.74c" awr="135.731" location="1" name="55137.74c" path="1500K/Cs_137_1500K.ace" temperature="1.293e-07" zaid="55137"/>
<ace_table alias="Ba-130.74c" awr="128.79" location="1" name="56130.74c" path="1500K/Ba_130_1500K.ace" temperature="1.293e-07" zaid="56130"/>
<ace_table alias="Ba-132.74c" awr="130.772" location="1" name="56132.74c" path="1500K/Ba_132_1500K.ace" temperature="1.293e-07" zaid="56132"/>
<ace_table alias="Ba-133.74c" awr="131.764" location="1" name="56133.74c" path="1500K/Ba_133_1500K.ace" temperature="1.293e-07" zaid="56133"/>
<ace_table alias="Ba-134.74c" awr="132.754" location="1" name="56134.74c" path="1500K/Ba_134_1500K.ace" temperature="1.293e-07" zaid="56134"/>
<ace_table alias="Ba-135.74c" awr="133.747" location="1" name="56135.74c" path="1500K/Ba_135_1500K.ace" temperature="1.293e-07" zaid="56135"/>
<ace_table alias="Ba-136.74c" awr="134.737" location="1" name="56136.74c" path="1500K/Ba_136_1500K.ace" temperature="1.293e-07" zaid="56136"/>
<ace_table alias="Ba-137.74c" awr="135.73" location="1" name="56137.74c" path="1500K/Ba_137_1500K.ace" temperature="1.293e-07" zaid="56137"/>
<ace_table alias="Ba-138.74c" awr="136.72" location="1" name="56138.74c" path="1500K/Ba_138_1500K.ace" temperature="1.293e-07" zaid="56138"/>
<ace_table alias="Ba-140.74c" awr="138.708" location="1" name="56140.74c" path="1500K/Ba_140_1500K.ace" temperature="1.293e-07" zaid="56140"/>
<ace_table alias="La-138.74c" awr="136.722" location="1" name="57138.74c" path="1500K/La_138_1500K.ace" temperature="1.293e-07" zaid="57138"/>
<ace_table alias="La-139.74c" awr="137.71" location="1" name="57139.74c" path="1500K/La_139_1500K.ace" temperature="1.293e-07" zaid="57139"/>
<ace_table alias="La-140.74c" awr="138.708" location="1" name="57140.74c" path="1500K/La_140_1500K.ace" temperature="1.293e-07" zaid="57140"/>
<ace_table alias="Ce-136.74c" awr="134.74" location="1" name="58136.74c" path="1500K/Ce_136_1500K.ace" temperature="1.293e-07" zaid="58136"/>
<ace_table alias="Ce-138.74c" awr="136.721" location="1" name="58138.74c" path="1500K/Ce_138_1500K.ace" temperature="1.293e-07" zaid="58138"/>
<ace_table alias="Ce-139.74c" awr="137.713" location="1" name="58139.74c" path="1500K/Ce_139_1500K.ace" temperature="1.293e-07" zaid="58139"/>
<ace_table alias="Ce-140.74c" awr="138.704" location="1" name="58140.74c" path="1500K/Ce_140_1500K.ace" temperature="1.293e-07" zaid="58140"/>
<ace_table alias="Ce-141.74c" awr="139.7" location="1" name="58141.74c" path="1500K/Ce_141_1500K.ace" temperature="1.293e-07" zaid="58141"/>
<ace_table alias="Ce-142.74c" awr="140.69" location="1" name="58142.74c" path="1500K/Ce_142_1500K.ace" temperature="1.293e-07" zaid="58142"/>
<ace_table alias="Ce-143.74c" awr="141.685" location="1" name="58143.74c" path="1500K/Ce_143_1500K.ace" temperature="1.293e-07" zaid="58143"/>
<ace_table alias="Ce-144.74c" awr="142.678" location="1" name="58144.74c" path="1500K/Ce_144_1500K.ace" temperature="1.293e-07" zaid="58144"/>
<ace_table alias="Pr-141.74c" awr="139.697" location="1" name="59141.74c" path="1500K/Pr_141_1500K.ace" temperature="1.293e-07" zaid="59141"/>
<ace_table alias="Pr-142.74c" awr="140.691" location="1" name="59142.74c" path="1500K/Pr_142_1500K.ace" temperature="1.293e-07" zaid="59142"/>
<ace_table alias="Pr-143.74c" awr="141.683" location="1" name="59143.74c" path="1500K/Pr_143_1500K.ace" temperature="1.293e-07" zaid="59143"/>
<ace_table alias="Nd-142.74c" awr="140.689" location="1" name="60142.74c" path="1500K/Nd_142_1500K.ace" temperature="1.293e-07" zaid="60142"/>
<ace_table alias="Nd-143.74c" awr="141.682" location="1" name="60143.74c" path="1500K/Nd_143_1500K.ace" temperature="1.293e-07" zaid="60143"/>
<ace_table alias="Nd-144.74c" awr="142.674" location="1" name="60144.74c" path="1500K/Nd_144_1500K.ace" temperature="1.293e-07" zaid="60144"/>
<ace_table alias="Nd-145.74c" awr="143.668" location="1" name="60145.74c" path="1500K/Nd_145_1500K.ace" temperature="1.293e-07" zaid="60145"/>
<ace_table alias="Nd-146.74c" awr="144.66" location="1" name="60146.74c" path="1500K/Nd_146_1500K.ace" temperature="1.293e-07" zaid="60146"/>
<ace_table alias="Nd-147.74c" awr="145.654" location="1" name="60147.74c" path="1500K/Nd_147_1500K.ace" temperature="1.293e-07" zaid="60147"/>
<ace_table alias="Nd-148.74c" awr="146.646" location="1" name="60148.74c" path="1500K/Nd_148_1500K.ace" temperature="1.293e-07" zaid="60148"/>
<ace_table alias="Nd-150.74c" awr="148.633" location="1" name="60150.74c" path="1500K/Nd_150_1500K.ace" temperature="1.293e-07" zaid="60150"/>
<ace_table alias="Pm-147.74c" awr="145.653" location="1" name="61147.74c" path="1500K/Pm_147_1500K.ace" temperature="1.293e-07" zaid="61147"/>
<ace_table alias="Pm-148.74c" awr="146.646" location="1" name="61148.74c" path="1500K/Pm_148_1500K.ace" temperature="1.293e-07" zaid="61148"/>
<ace_table alias="Pm-149.74c" awr="146.65" location="1" name="61149.74c" path="1500K/Pm_148m1_1500K.ace" temperature="1.293e-07" zaid="61149"/>
<ace_table alias="Pm-149.74c" awr="147.639" location="1" name="61149.74c" path="1500K/Pm_149_1500K.ace" temperature="1.293e-07" zaid="61149"/>
<ace_table alias="Pm-151.74c" awr="149.625" location="1" name="61151.74c" path="1500K/Pm_151_1500K.ace" temperature="1.293e-07" zaid="61151"/>
<ace_table alias="Sm-144.74c" awr="142.676" location="1" name="62144.74c" path="1500K/Sm_144_1500K.ace" temperature="1.293e-07" zaid="62144"/>
<ace_table alias="Sm-147.74c" awr="145.653" location="1" name="62147.74c" path="1500K/Sm_147_1500K.ace" temperature="1.293e-07" zaid="62147"/>
<ace_table alias="Sm-148.74c" awr="146.644" location="1" name="62148.74c" path="1500K/Sm_148_1500K.ace" temperature="1.293e-07" zaid="62148"/>
<ace_table alias="Sm-149.74c" awr="147.638" location="1" name="62149.74c" path="1500K/Sm_149_1500K.ace" temperature="1.293e-07" zaid="62149"/>
<ace_table alias="Sm-150.74c" awr="148.629" location="1" name="62150.74c" path="1500K/Sm_150_1500K.ace" temperature="1.293e-07" zaid="62150"/>
<ace_table alias="Sm-151.74c" awr="149.623" location="1" name="62151.74c" path="1500K/Sm_151_1500K.ace" temperature="1.293e-07" zaid="62151"/>
<ace_table alias="Sm-152.74c" awr="150.615" location="1" name="62152.74c" path="1500K/Sm_152_1500K.ace" temperature="1.293e-07" zaid="62152"/>
<ace_table alias="Sm-153.74c" awr="151.608" location="1" name="62153.74c" path="1500K/Sm_153_1500K.ace" temperature="1.293e-07" zaid="62153"/>
<ace_table alias="Sm-154.74c" awr="152.6" location="1" name="62154.74c" path="1500K/Sm_154_1500K.ace" temperature="1.293e-07" zaid="62154"/>
<ace_table alias="Eu-151.74c" awr="149.62" location="1" name="63151.74c" path="1500K/Eu_151_1500K.ace" temperature="1.293e-07" zaid="63151"/>
<ace_table alias="Eu-152.74c" awr="150.617" location="1" name="63152.74c" path="1500K/Eu_152_1500K.ace" temperature="1.293e-07" zaid="63152"/>
<ace_table alias="Eu-153.74c" awr="151.608" location="1" name="63153.74c" path="1500K/Eu_153_1500K.ace" temperature="1.293e-07" zaid="63153"/>
<ace_table alias="Eu-154.74c" awr="152.6" location="1" name="63154.74c" path="1500K/Eu_154_1500K.ace" temperature="1.293e-07" zaid="63154"/>
<ace_table alias="Eu-155.74c" awr="153.59" location="1" name="63155.74c" path="1500K/Eu_155_1500K.ace" temperature="1.293e-07" zaid="63155"/>
<ace_table alias="Eu-156.74c" awr="154.586" location="1" name="63156.74c" path="1500K/Eu_156_1500K.ace" temperature="1.293e-07" zaid="63156"/>
<ace_table alias="Eu-157.74c" awr="155.577" location="1" name="63157.74c" path="1500K/Eu_157_1500K.ace" temperature="1.293e-07" zaid="63157"/>
<ace_table alias="Gd-152.74c" awr="150.615" location="1" name="64152.74c" path="1500K/Gd_152_1500K.ace" temperature="1.293e-07" zaid="64152"/>
<ace_table alias="Gd-153.74c" awr="151.608" location="1" name="64153.74c" path="1500K/Gd_153_1500K.ace" temperature="1.293e-07" zaid="64153"/>
<ace_table alias="Gd-154.74c" awr="152.599" location="1" name="64154.74c" path="1500K/Gd_154_1500K.ace" temperature="1.293e-07" zaid="64154"/>
<ace_table alias="Gd-155.74c" awr="153.592" location="1" name="64155.74c" path="1500K/Gd_155_1500K.ace" temperature="1.293e-07" zaid="64155"/>
<ace_table alias="Gd-156.74c" awr="154.583" location="1" name="64156.74c" path="1500K/Gd_156_1500K.ace" temperature="1.293e-07" zaid="64156"/>
<ace_table alias="Gd-157.74c" awr="155.576" location="1" name="64157.74c" path="1500K/Gd_157_1500K.ace" temperature="1.293e-07" zaid="64157"/>
<ace_table alias="Gd-158.74c" awr="156.567" location="1" name="64158.74c" path="1500K/Gd_158_1500K.ace" temperature="1.293e-07" zaid="64158"/>
<ace_table alias="Gd-160.74c" awr="158.553" location="1" name="64160.74c" path="1500K/Gd_160_1500K.ace" temperature="1.293e-07" zaid="64160"/>
<ace_table alias="Tb-159.74c" awr="157.56" location="1" name="65159.74c" path="1500K/Tb_159_1500K.ace" temperature="1.293e-07" zaid="65159"/>
<ace_table alias="Tb-160.74c" awr="158.553" location="1" name="65160.74c" path="1500K/Tb_160_1500K.ace" temperature="1.293e-07" zaid="65160"/>
<ace_table alias="Dy-156.74c" awr="154.585" location="1" name="66156.74c" path="1500K/Dy_156_1500K.ace" temperature="1.293e-07" zaid="66156"/>
<ace_table alias="Dy-158.74c" awr="156.568" location="1" name="66158.74c" path="1500K/Dy_158_1500K.ace" temperature="1.293e-07" zaid="66158"/>
<ace_table alias="Dy-160.74c" awr="158.551" location="1" name="66160.74c" path="1500K/Dy_160_1500K.ace" temperature="1.293e-07" zaid="66160"/>
<ace_table alias="Dy-161.74c" awr="159.544" location="1" name="66161.74c" path="1500K/Dy_161_1500K.ace" temperature="1.293e-07" zaid="66161"/>
<ace_table alias="Dy-162.74c" awr="160.536" location="1" name="66162.74c" path="1500K/Dy_162_1500K.ace" temperature="1.293e-07" zaid="66162"/>
<ace_table alias="Dy-163.74c" awr="161.529" location="1" name="66163.74c" path="1500K/Dy_163_1500K.ace" temperature="1.293e-07" zaid="66163"/>
<ace_table alias="Dy-164.74c" awr="162.521" location="1" name="66164.74c" path="1500K/Dy_164_1500K.ace" temperature="1.293e-07" zaid="66164"/>
<ace_table alias="Ho-165.74c" awr="163.513" location="1" name="67165.74c" path="1500K/Ho_165_1500K.ace" temperature="1.293e-07" zaid="67165"/>
<ace_table alias="Ho-169.74c" awr="164.507" location="1" name="67169.74c" path="1500K/Ho_166m1_1500K.ace" temperature="1.293e-07" zaid="67169"/>
<ace_table alias="Er-162.74c" awr="160.538" location="1" name="68162.74c" path="1500K/Er_162_1500K.ace" temperature="1.293e-07" zaid="68162"/>
<ace_table alias="Er-164.74c" awr="162.521" location="1" name="68164.74c" path="1500K/Er_164_1500K.ace" temperature="1.293e-07" zaid="68164"/>
<ace_table alias="Er-166.74c" awr="164.505" location="1" name="68166.74c" path="1500K/Er_166_1500K.ace" temperature="1.293e-07" zaid="68166"/>
<ace_table alias="Er-167.74c" awr="165.498" location="1" name="68167.74c" path="1500K/Er_167_1500K.ace" temperature="1.293e-07" zaid="68167"/>
<ace_table alias="Er-168.74c" awr="166.487" location="1" name="68168.74c" path="1500K/Er_168_1500K.ace" temperature="1.293e-07" zaid="68168"/>
<ace_table alias="Er-170.74c" awr="168.476" location="1" name="68170.74c" path="1500K/Er_170_1500K.ace" temperature="1.293e-07" zaid="68170"/>
<ace_table alias="Tm-168.74c" awr="166.492" location="1" name="69168.74c" path="1500K/Tm_168_1500K.ace" temperature="1.293e-07" zaid="69168"/>
<ace_table alias="Tm-169.74c" awr="167.483" location="1" name="69169.74c" path="1500K/Tm_169_1500K.ace" temperature="1.293e-07" zaid="69169"/>
<ace_table alias="Tm-170.74c" awr="168.476" location="1" name="69170.74c" path="1500K/Tm_170_1500K.ace" temperature="1.293e-07" zaid="69170"/>
<ace_table alias="Lu-175.74c" awr="173.438" location="1" name="71175.74c" path="1500K/Lu_175_1500K.ace" temperature="1.293e-07" zaid="71175"/>
<ace_table alias="Lu-176.74c" awr="174.43" location="1" name="71176.74c" path="1500K/Lu_176_1500K.ace" temperature="1.293e-07" zaid="71176"/>
<ace_table alias="Hf-174.74c" awr="172.446" location="1" name="72174.74c" path="1500K/Hf_174_1500K.ace" temperature="1.293e-07" zaid="72174"/>
<ace_table alias="Hf-176.74c" awr="174.429" location="1" name="72176.74c" path="1500K/Hf_176_1500K.ace" temperature="1.293e-07" zaid="72176"/>
<ace_table alias="Hf-177.74c" awr="175.42" location="1" name="72177.74c" path="1500K/Hf_177_1500K.ace" temperature="1.293e-07" zaid="72177"/>
<ace_table alias="Hf-178.74c" awr="176.411" location="1" name="72178.74c" path="1500K/Hf_178_1500K.ace" temperature="1.293e-07" zaid="72178"/>
<ace_table alias="Hf-179.74c" awr="177.413" location="1" name="72179.74c" path="1500K/Hf_179_1500K.ace" temperature="1.293e-07" zaid="72179"/>
<ace_table alias="Hf-180.74c" awr="178.404" location="1" name="72180.74c" path="1500K/Hf_180_1500K.ace" temperature="1.293e-07" zaid="72180"/>
<ace_table alias="Ta-180.74c" awr="178.4016" location="1" name="73180.74c" path="1500K/Ta_180_1500K.ace" temperature="1.293e-07" zaid="73180"/>
<ace_table alias="Ta-181.74c" awr="179.3936" location="1" name="73181.74c" path="1500K/Ta_181_1500K.ace" temperature="1.293e-07" zaid="73181"/>
<ace_table alias="Ta-182.74c" awr="180.387" location="1" name="73182.74c" path="1500K/Ta_182_1500K.ace" temperature="1.293e-07" zaid="73182"/>
<ace_table alias="W-180.74c" awr="178.401" location="1" name="74180.74c" path="1500K/W_180_1500K.ace" temperature="1.293e-07" zaid="74180"/>
<ace_table alias="W-182.74c" awr="180.385" location="1" name="74182.74c" path="1500K/W_182_1500K.ace" temperature="1.293e-07" zaid="74182"/>
<ace_table alias="W-183.74c" awr="181.379" location="1" name="74183.74c" path="1500K/W_183_1500K.ace" temperature="1.293e-07" zaid="74183"/>
<ace_table alias="W-184.74c" awr="182.371" location="1" name="74184.74c" path="1500K/W_184_1500K.ace" temperature="1.293e-07" zaid="74184"/>
<ace_table alias="W-186.74c" awr="184.357" location="1" name="74186.74c" path="1500K/W_186_1500K.ace" temperature="1.293e-07" zaid="74186"/>
<ace_table alias="Re-185.74c" awr="183.3641" location="1" name="75185.74c" path="1500K/Re_185_1500K.ace" temperature="1.293e-07" zaid="75185"/>
<ace_table alias="Re-187.74c" awr="185.3497" location="1" name="75187.74c" path="1500K/Re_187_1500K.ace" temperature="1.293e-07" zaid="75187"/>
<ace_table alias="Ir-191.74c" awr="189.32" location="1" name="77191.74c" path="1500K/Ir_191_1500K.ace" temperature="1.293e-07" zaid="77191"/>
<ace_table alias="Ir-193.74c" awr="191.305" location="1" name="77193.74c" path="1500K/Ir_193_1500K.ace" temperature="1.293e-07" zaid="77193"/>
<ace_table alias="Au-197.74c" awr="195.274" location="1" name="79197.74c" path="1500K/Au_197_1500K.ace" temperature="1.293e-07" zaid="79197"/>
<ace_table alias="Hg-196.74c" awr="194.282" location="1" name="80196.74c" path="1500K/Hg_196_1500K.ace" temperature="1.293e-07" zaid="80196"/>
<ace_table alias="Hg-198.74c" awr="196.266" location="1" name="80198.74c" path="1500K/Hg_198_1500K.ace" temperature="1.293e-07" zaid="80198"/>
<ace_table alias="Hg-199.74c" awr="197.259" location="1" name="80199.74c" path="1500K/Hg_199_1500K.ace" temperature="1.293e-07" zaid="80199"/>
<ace_table alias="Hg-200.74c" awr="198.25" location="1" name="80200.74c" path="1500K/Hg_200_1500K.ace" temperature="1.293e-07" zaid="80200"/>
<ace_table alias="Hg-201.74c" awr="199.244" location="1" name="80201.74c" path="1500K/Hg_201_1500K.ace" temperature="1.293e-07" zaid="80201"/>
<ace_table alias="Hg-202.74c" awr="200.236" location="1" name="80202.74c" path="1500K/Hg_202_1500K.ace" temperature="1.293e-07" zaid="80202"/>
<ace_table alias="Hg-204.74c" awr="202.221" location="1" name="80204.74c" path="1500K/Hg_204_1500K.ace" temperature="1.293e-07" zaid="80204"/>
<ace_table alias="Tl-203.74c" awr="201.229" location="1" name="81203.74c" path="1500K/Tl_203_1500K.ace" temperature="1.293e-07" zaid="81203"/>
<ace_table alias="Tl-205.74c" awr="203.214" location="1" name="81205.74c" path="1500K/Tl_205_1500K.ace" temperature="1.293e-07" zaid="81205"/>
<ace_table alias="Pb-204.74c" awr="202.2208" location="1" name="82204.74c" path="1500K/Pb_204_1500K.ace" temperature="1.293e-07" zaid="82204"/>
<ace_table alias="Pb-206.74c" awr="204.205" location="1" name="82206.74c" path="1500K/Pb_206_1500K.ace" temperature="1.293e-07" zaid="82206"/>
<ace_table alias="Pb-207.74c" awr="205.1979" location="1" name="82207.74c" path="1500K/Pb_207_1500K.ace" temperature="1.293e-07" zaid="82207"/>
<ace_table alias="Pb-208.74c" awr="206.19" location="1" name="82208.74c" path="1500K/Pb_208_1500K.ace" temperature="1.293e-07" zaid="82208"/>
<ace_table alias="Bi-209.74c" awr="207.185" location="1" name="83209.74c" path="1500K/Bi_209_1500K.ace" temperature="1.293e-07" zaid="83209"/>
<ace_table alias="Ra-223.74c" awr="221.103" location="1" name="88223.74c" path="1500K/Ra_223_1500K.ace" temperature="1.293e-07" zaid="88223"/>
<ace_table alias="Ra-224.74c" awr="222.096" location="1" name="88224.74c" path="1500K/Ra_224_1500K.ace" temperature="1.293e-07" zaid="88224"/>
<ace_table alias="Ra-225.74c" awr="223.091" location="1" name="88225.74c" path="1500K/Ra_225_1500K.ace" temperature="1.293e-07" zaid="88225"/>
<ace_table alias="Ra-226.74c" awr="224.084" location="1" name="88226.74c" path="1500K/Ra_226_1500K.ace" temperature="1.293e-07" zaid="88226"/>
<ace_table alias="Ac-225.74c" awr="223.09" location="1" name="89225.74c" path="1500K/Ac_225_1500K.ace" temperature="1.293e-07" zaid="89225"/>
<ace_table alias="Ac-226.74c" awr="224.084" location="1" name="89226.74c" path="1500K/Ac_226_1500K.ace" temperature="1.293e-07" zaid="89226"/>
<ace_table alias="Ac-227.74c" awr="225.077" location="1" name="89227.74c" path="1500K/Ac_227_1500K.ace" temperature="1.293e-07" zaid="89227"/>
<ace_table alias="Th-227.74c" awr="225.077" location="1" name="90227.74c" path="1500K/Th_227_1500K.ace" temperature="1.293e-07" zaid="90227"/>
<ace_table alias="Th-228.74c" awr="226.07" location="1" name="90228.74c" path="1500K/Th_228_1500K.ace" temperature="1.293e-07" zaid="90228"/>
<ace_table alias="Th-229.74c" awr="227.064" location="1" name="90229.74c" path="1500K/Th_229_1500K.ace" temperature="1.293e-07" zaid="90229"/>
<ace_table alias="Th-230.74c" awr="228.057" location="1" name="90230.74c" path="1500K/Th_230_1500K.ace" temperature="1.293e-07" zaid="90230"/>
<ace_table alias="Th-231.74c" awr="229.052" location="1" name="90231.74c" path="1500K/Th_231_1500K.ace" temperature="1.293e-07" zaid="90231"/>
<ace_table alias="Th-232.74c" awr="230.045" location="1" name="90232.74c" path="1500K/Th_232_1500K.ace" temperature="1.293e-07" zaid="90232"/>
<ace_table alias="Th-233.74c" awr="231.04" location="1" name="90233.74c" path="1500K/Th_233_1500K.ace" temperature="1.293e-07" zaid="90233"/>
<ace_table alias="Th-234.74c" awr="232.033" location="1" name="90234.74c" path="1500K/Th_234_1500K.ace" temperature="1.293e-07" zaid="90234"/>
<ace_table alias="Pa-229.74c" awr="227.065" location="1" name="91229.74c" path="1500K/Pa_229_1500K.ace" temperature="1.293e-07" zaid="91229"/>
<ace_table alias="Pa-230.74c" awr="228.058" location="1" name="91230.74c" path="1500K/Pa_230_1500K.ace" temperature="1.293e-07" zaid="91230"/>
<ace_table alias="Pa-231.74c" awr="229.051" location="1" name="91231.74c" path="1500K/Pa_231_1500K.ace" temperature="1.293e-07" zaid="91231"/>
<ace_table alias="Pa-232.74c" awr="230.045" location="1" name="91232.74c" path="1500K/Pa_232_1500K.ace" temperature="1.293e-07" zaid="91232"/>
<ace_table alias="Pa-233.74c" awr="231.038" location="1" name="91233.74c" path="1500K/Pa_233_1500K.ace" temperature="1.293e-07" zaid="91233"/>
<ace_table alias="U-230.74c" awr="228.058" location="1" name="92230.74c" path="1500K/U_230_1500K.ace" temperature="1.293e-07" zaid="92230"/>
<ace_table alias="U-231.74c" awr="229.052" location="1" name="92231.74c" path="1500K/U_231_1500K.ace" temperature="1.293e-07" zaid="92231"/>
<ace_table alias="U-232.74c" awr="230.044" location="1" name="92232.74c" path="1500K/U_232_1500K.ace" temperature="1.293e-07" zaid="92232"/>
<ace_table alias="U-233.74c" awr="231.0377" location="1" name="92233.74c" path="1500K/U_233_1500K.ace" temperature="1.293e-07" zaid="92233"/>
<ace_table alias="U-234.74c" awr="232.0304" location="1" name="92234.74c" path="1500K/U_234_1500K.ace" temperature="1.293e-07" zaid="92234"/>
<ace_table alias="U-235.74c" awr="233.0248" location="1" name="92235.74c" path="1500K/U_235_1500K.ace" temperature="1.293e-07" zaid="92235"/>
<ace_table alias="U-236.74c" awr="234.0178" location="1" name="92236.74c" path="1500K/U_236_1500K.ace" temperature="1.293e-07" zaid="92236"/>
<ace_table alias="U-237.74c" awr="235.0124" location="1" name="92237.74c" path="1500K/U_237_1500K.ace" temperature="1.293e-07" zaid="92237"/>
<ace_table alias="U-238.74c" awr="236.0058" location="1" name="92238.74c" path="1500K/U_238_1500K.ace" temperature="1.293e-07" zaid="92238"/>
<ace_table alias="U-239.74c" awr="237.0007" location="1" name="92239.74c" path="1500K/U_239_1500K.ace" temperature="1.293e-07" zaid="92239"/>
<ace_table alias="U-240.74c" awr="237.9944" location="1" name="92240.74c" path="1500K/U_240_1500K.ace" temperature="1.293e-07" zaid="92240"/>
<ace_table alias="U-241.74c" awr="238.9895" location="1" name="92241.74c" path="1500K/U_241_1500K.ace" temperature="1.293e-07" zaid="92241"/>
<ace_table alias="Np-234.74c" awr="232.032" location="1" name="93234.74c" path="1500K/Np_234_1500K.ace" temperature="1.293e-07" zaid="93234"/>
<ace_table alias="Np-235.74c" awr="233.025" location="1" name="93235.74c" path="1500K/Np_235_1500K.ace" temperature="1.293e-07" zaid="93235"/>
<ace_table alias="Np-236.74c" awr="234.019" location="1" name="93236.74c" path="1500K/Np_236_1500K.ace" temperature="1.293e-07" zaid="93236"/>
<ace_table alias="Np-237.74c" awr="235.0118" location="1" name="93237.74c" path="1500K/Np_237_1500K.ace" temperature="1.293e-07" zaid="93237"/>
<ace_table alias="Np-238.74c" awr="236.006" location="1" name="93238.74c" path="1500K/Np_238_1500K.ace" temperature="1.293e-07" zaid="93238"/>
<ace_table alias="Np-239.74c" awr="236.999" location="1" name="93239.74c" path="1500K/Np_239_1500K.ace" temperature="1.293e-07" zaid="93239"/>
<ace_table alias="Pu-236.74c" awr="234.018" location="1" name="94236.74c" path="1500K/Pu_236_1500K.ace" temperature="1.293e-07" zaid="94236"/>
<ace_table alias="Pu-237.74c" awr="235.012" location="1" name="94237.74c" path="1500K/Pu_237_1500K.ace" temperature="1.293e-07" zaid="94237"/>
<ace_table alias="Pu-238.74c" awr="236.0046" location="1" name="94238.74c" path="1500K/Pu_238_1500K.ace" temperature="1.293e-07" zaid="94238"/>
<ace_table alias="Pu-239.74c" awr="236.9986" location="1" name="94239.74c" path="1500K/Pu_239_1500K.ace" temperature="1.293e-07" zaid="94239"/>
<ace_table alias="Pu-240.74c" awr="237.9916" location="1" name="94240.74c" path="1500K/Pu_240_1500K.ace" temperature="1.293e-07" zaid="94240"/>
<ace_table alias="Pu-241.74c" awr="238.978" location="1" name="94241.74c" path="1500K/Pu_241_1500K.ace" temperature="1.293e-07" zaid="94241"/>
<ace_table alias="Pu-242.74c" awr="239.979" location="1" name="94242.74c" path="1500K/Pu_242_1500K.ace" temperature="1.293e-07" zaid="94242"/>
<ace_table alias="Pu-243.74c" awr="240.974" location="1" name="94243.74c" path="1500K/Pu_243_1500K.ace" temperature="1.293e-07" zaid="94243"/>
<ace_table alias="Pu-244.74c" awr="241.967" location="1" name="94244.74c" path="1500K/Pu_244_1500K.ace" temperature="1.293e-07" zaid="94244"/>
<ace_table alias="Pu-246.74c" awr="243.956" location="1" name="94246.74c" path="1500K/Pu_246_1500K.ace" temperature="1.293e-07" zaid="94246"/>
<ace_table alias="Am-240.74c" awr="237.993" location="1" name="95240.74c" path="1500K/Am_240_1500K.ace" temperature="1.293e-07" zaid="95240"/>
<ace_table alias="Am-241.74c" awr="238.986" location="1" name="95241.74c" path="1500K/Am_241_1500K.ace" temperature="1.293e-07" zaid="95241"/>
<ace_table alias="Am-242m.74c" awr="239.9801" location="1" metastable="1" name="95242.74c" path="1500K/Am_242_1500K.ace" temperature="1.293e-07" zaid="95242"/>
<ace_table alias="Am-249.74c" awr="239.9801" location="1" name="95249.74c" path="1500K/Am_242m1_1500K.ace" temperature="1.293e-07" zaid="95249"/>
<ace_table alias="Am-243.74c" awr="240.9734" location="1" name="95243.74c" path="1500K/Am_243_1500K.ace" temperature="1.293e-07" zaid="95243"/>
<ace_table alias="Am-244.74c" awr="241.968" location="1" name="95244.74c" path="1500K/Am_244_1500K.ace" temperature="1.293e-07" zaid="95244"/>
<ace_table alias="Am-249.74c" awr="241.968" location="1" name="95249.74c" path="1500K/Am_244m1_1500K.ace" temperature="1.293e-07" zaid="95249"/>
<ace_table alias="Cm-240.74c" awr="237.993" location="1" name="96240.74c" path="1500K/Cm_240_1500K.ace" temperature="1.293e-07" zaid="96240"/>
<ace_table alias="Cm-241.74c" awr="238.987" location="1" name="96241.74c" path="1500K/Cm_241_1500K.ace" temperature="1.293e-07" zaid="96241"/>
<ace_table alias="Cm-242.74c" awr="239.979" location="1" name="96242.74c" path="1500K/Cm_242_1500K.ace" temperature="1.293e-07" zaid="96242"/>
<ace_table alias="Cm-243.74c" awr="240.973" location="1" name="96243.74c" path="1500K/Cm_243_1500K.ace" temperature="1.293e-07" zaid="96243"/>
<ace_table alias="Cm-244.74c" awr="241.966" location="1" name="96244.74c" path="1500K/Cm_244_1500K.ace" temperature="1.293e-07" zaid="96244"/>
<ace_table alias="Cm-245.74c" awr="242.96" location="1" name="96245.74c" path="1500K/Cm_245_1500K.ace" temperature="1.293e-07" zaid="96245"/>
<ace_table alias="Cm-246.74c" awr="243.953" location="1" name="96246.74c" path="1500K/Cm_246_1500K.ace" temperature="1.293e-07" zaid="96246"/>
<ace_table alias="Cm-247.74c" awr="244.948" location="1" name="96247.74c" path="1500K/Cm_247_1500K.ace" temperature="1.293e-07" zaid="96247"/>
<ace_table alias="Cm-248.74c" awr="245.941" location="1" name="96248.74c" path="1500K/Cm_248_1500K.ace" temperature="1.293e-07" zaid="96248"/>
<ace_table alias="Cm-249.74c" awr="246.936" location="1" name="96249.74c" path="1500K/Cm_249_1500K.ace" temperature="1.293e-07" zaid="96249"/>
<ace_table alias="Cm-250.74c" awr="247.93" location="1" name="96250.74c" path="1500K/Cm_250_1500K.ace" temperature="1.293e-07" zaid="96250"/>
<ace_table alias="Bk-245.74c" awr="242.961" location="1" name="97245.74c" path="1500K/Bk_245_1500K.ace" temperature="1.293e-07" zaid="97245"/>
<ace_table alias="Bk-246.74c" awr="243.955" location="1" name="97246.74c" path="1500K/Bk_246_1500K.ace" temperature="1.293e-07" zaid="97246"/>
<ace_table alias="Bk-247.74c" awr="244.948" location="1" name="97247.74c" path="1500K/Bk_247_1500K.ace" temperature="1.293e-07" zaid="97247"/>
<ace_table alias="Bk-248.74c" awr="245.942" location="1" name="97248.74c" path="1500K/Bk_248_1500K.ace" temperature="1.293e-07" zaid="97248"/>
<ace_table alias="Bk-249.74c" awr="246.935" location="1" name="97249.74c" path="1500K/Bk_249_1500K.ace" temperature="1.293e-07" zaid="97249"/>
<ace_table alias="Bk-250.74c" awr="247.93" location="1" name="97250.74c" path="1500K/Bk_250_1500K.ace" temperature="1.293e-07" zaid="97250"/>
<ace_table alias="Cf-246.74c" awr="243.955" location="1" name="98246.74c" path="1500K/Cf_246_1500K.ace" temperature="1.293e-07" zaid="98246"/>
<ace_table alias="Cf-248.74c" awr="245.941" location="1" name="98248.74c" path="1500K/Cf_248_1500K.ace" temperature="1.293e-07" zaid="98248"/>
<ace_table alias="Cf-249.74c" awr="246.935" location="1" name="98249.74c" path="1500K/Cf_249_1500K.ace" temperature="1.293e-07" zaid="98249"/>
<ace_table alias="Cf-250.74c" awr="247.928" location="1" name="98250.74c" path="1500K/Cf_250_1500K.ace" temperature="1.293e-07" zaid="98250"/>
<ace_table alias="Cf-251.74c" awr="248.923" location="1" name="98251.74c" path="1500K/Cf_251_1500K.ace" temperature="1.293e-07" zaid="98251"/>
<ace_table alias="Cf-252.74c" awr="249.916" location="1" name="98252.74c" path="1500K/Cf_252_1500K.ace" temperature="1.293e-07" zaid="98252"/>
<ace_table alias="Cf-253.74c" awr="250.911" location="1" name="98253.74c" path="1500K/Cf_253_1500K.ace" temperature="1.293e-07" zaid="98253"/>
<ace_table alias="Cf-254.74c" awr="251.905" location="1" name="98254.74c" path="1500K/Cf_254_1500K.ace" temperature="1.293e-07" zaid="98254"/>
<ace_table alias="Es-251.74c" awr="248.923" location="1" name="99251.74c" path="1500K/Es_251_1500K.ace" temperature="1.293e-07" zaid="99251"/>
<ace_table alias="Es-252.74c" awr="249.917" location="1" name="99252.74c" path="1500K/Es_252_1500K.ace" temperature="1.293e-07" zaid="99252"/>
<ace_table alias="Es-253.74c" awr="250.911" location="1" name="99253.74c" path="1500K/Es_253_1500K.ace" temperature="1.293e-07" zaid="99253"/>
<ace_table alias="Es-254.74c" awr="251.905" location="1" name="99254.74c" path="1500K/Es_254_1500K.ace" temperature="1.293e-07" zaid="99254"/>
<ace_table alias="Es-259.74c" awr="251.905" location="1" name="99259.74c" path="1500K/Es_254m1_1500K.ace" temperature="1.293e-07" zaid="99259"/>
<ace_table alias="Es-255.74c" awr="252.899" location="1" name="99255.74c" path="1500K/Es_255_1500K.ace" temperature="1.293e-07" zaid="99255"/>
<ace_table alias="Fm-255.74c" awr="252.899" location="1" name="100255.74c" path="1500K/Fm_255_1500K.ace" temperature="1.293e-07" 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"/>

View file

@ -453,12 +453,12 @@
<ace_table alias="Co-59.12c" awr="58.426899" location="1" name="27059.12c" path="27059ENDF7.ace" temperature="1.034e-07" zaid="27059"/>
<ace_table alias="Co-59.15c" awr="58.426899" location="47907" name="27059.15c" path="27059ENDF7.ace" temperature="1.293e-07" zaid="27059"/>
<ace_table alias="Co-59.18c" awr="58.426899" location="95695" name="27059.18c" path="27059ENDF7.ace" temperature="1.551e-07" zaid="27059"/>
<ace_table alias="Co-158m.03c" awr="57.438099" location="9465" metastable="1" name="27358.03c" path="27358ENDF7.ace" temperature="2.585e-08" zaid="27358"/>
<ace_table alias="Co-158m.06c" awr="57.438099" location="12631" metastable="1" name="27358.06c" path="27358ENDF7.ace" temperature="5.17e-08" zaid="27358"/>
<ace_table alias="Co-158m.09c" awr="57.438099" location="15789" metastable="1" name="27358.09c" path="27358ENDF7.ace" temperature="7.756e-08" zaid="27358"/>
<ace_table alias="Co-158m.12c" awr="57.438099" location="1" metastable="1" name="27358.12c" path="27358ENDF7.ace" temperature="1.034e-07" zaid="27358"/>
<ace_table alias="Co-158m.15c" awr="57.438099" location="3152" metastable="1" name="27358.15c" path="27358ENDF7.ace" temperature="1.293e-07" zaid="27358"/>
<ace_table alias="Co-158m.18c" awr="57.438099" location="6305" metastable="1" name="27358.18c" path="27358ENDF7.ace" temperature="1.551e-07" zaid="27358"/>
<ace_table alias="Co-58m.03c" awr="57.438099" location="9465" metastable="1" name="27358.03c" path="27358ENDF7.ace" temperature="2.585e-08" zaid="27358"/>
<ace_table alias="Co-58m.06c" awr="57.438099" location="12631" metastable="1" name="27358.06c" path="27358ENDF7.ace" temperature="5.17e-08" zaid="27358"/>
<ace_table alias="Co-58m.09c" awr="57.438099" location="15789" metastable="1" name="27358.09c" path="27358ENDF7.ace" temperature="7.756e-08" zaid="27358"/>
<ace_table alias="Co-58m.12c" awr="57.438099" location="1" metastable="1" name="27358.12c" path="27358ENDF7.ace" temperature="1.034e-07" zaid="27358"/>
<ace_table alias="Co-58m.15c" awr="57.438099" location="3152" metastable="1" name="27358.15c" path="27358ENDF7.ace" temperature="1.293e-07" zaid="27358"/>
<ace_table alias="Co-58m.18c" awr="57.438099" location="6305" metastable="1" name="27358.18c" path="27358ENDF7.ace" temperature="1.551e-07" zaid="27358"/>
<ace_table alias="Ni-Nat.03c" awr="58.1838" location="309404" name="28000.03c" path="28000JNDL32.ace" temperature="2.585e-08" zaid="28000"/>
<ace_table alias="Ni-Nat.06c" awr="58.1838" location="413232" name="28000.06c" path="28000JNDL32.ace" temperature="5.17e-08" zaid="28000"/>
<ace_table alias="Ni-Nat.09c" awr="58.1838" location="516809" name="28000.09c" path="28000JNDL32.ace" temperature="7.756e-08" zaid="28000"/>
@ -2422,12 +2422,12 @@
<ace_table alias="Am-241.12c" awr="238.985992" location="1" name="95241.12c" path="95241ENDF7.ace" temperature="1.034e-07" zaid="95241"/>
<ace_table alias="Am-241.15c" awr="238.985992" location="31077" name="95241.15c" path="95241ENDF7.ace" temperature="1.293e-07" zaid="95241"/>
<ace_table alias="Am-241.18c" awr="238.985992" location="61491" name="95241.18c" path="95241ENDF7.ace" temperature="1.551e-07" zaid="95241"/>
<ace_table alias="Am-242.03c" awr="239.980103" location="94457" metastable="1" name="95242.03c" path="95242ENDF7.ace" temperature="2.585e-08" zaid="95242"/>
<ace_table alias="Am-242.06c" awr="239.980103" location="126665" metastable="1" name="95242.06c" path="95242ENDF7.ace" temperature="5.17e-08" zaid="95242"/>
<ace_table alias="Am-242.09c" awr="239.980103" location="158587" metastable="1" name="95242.09c" path="95242ENDF7.ace" temperature="7.756e-08" zaid="95242"/>
<ace_table alias="Am-242.12c" awr="239.980103" location="1" metastable="1" name="95242.12c" path="95242ENDF7.ace" temperature="1.034e-07" zaid="95242"/>
<ace_table alias="Am-242.15c" awr="239.980103" location="31580" metastable="1" name="95242.15c" path="95242ENDF7.ace" temperature="1.293e-07" zaid="95242"/>
<ace_table alias="Am-242.18c" awr="239.980103" location="63058" metastable="1" name="95242.18c" path="95242ENDF7.ace" temperature="1.551e-07" zaid="95242"/>
<ace_table alias="Am-242.03c" awr="239.980103" location="94457" name="95242.03c" path="95242ENDF7.ace" temperature="2.585e-08" zaid="95242"/>
<ace_table alias="Am-242.06c" awr="239.980103" location="126665" name="95242.06c" path="95242ENDF7.ace" temperature="5.17e-08" zaid="95242"/>
<ace_table alias="Am-242.09c" awr="239.980103" location="158587" name="95242.09c" path="95242ENDF7.ace" temperature="7.756e-08" zaid="95242"/>
<ace_table alias="Am-242.12c" awr="239.980103" location="1" name="95242.12c" path="95242ENDF7.ace" temperature="1.034e-07" zaid="95242"/>
<ace_table alias="Am-242.15c" awr="239.980103" location="31580" name="95242.15c" path="95242ENDF7.ace" temperature="1.293e-07" zaid="95242"/>
<ace_table alias="Am-242.18c" awr="239.980103" location="63058" name="95242.18c" path="95242ENDF7.ace" temperature="1.551e-07" zaid="95242"/>
<ace_table alias="Am-243.03c" awr="240.973404" location="101763" name="95243.03c" path="95243ENDF7.ace" temperature="2.585e-08" zaid="95243"/>
<ace_table alias="Am-243.06c" awr="240.973404" location="142713" name="95243.06c" path="95243ENDF7.ace" temperature="5.17e-08" zaid="95243"/>
<ace_table alias="Am-243.09c" awr="240.973404" location="180357" name="95243.09c" path="95243ENDF7.ace" temperature="7.756e-08" zaid="95243"/>

View file

@ -6,17 +6,19 @@ import shutil
import subprocess
import sys
import tarfile
import glob
try:
from urllib.request import urlopen
except ImportError:
from urllib2 import urlopen
cwd = os.getcwd()
sys.path.append(os.path.join(cwd, '..', 'src', 'utils'))
from convert_binary 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-neutron-300K.tar.gz',
'ENDF-B-VII.1-neutron-900K.tar.gz',
'ENDF-B-VII.1-neutron-1500K.tar.gz',
'ENDF-B-VII.1-tsl.tar.gz']
block_size = 16384
@ -30,7 +32,10 @@ for f in files:
req = urlopen(url)
# Get file size from header
file_size = int(req.info().getheaders('Content-Length')[0])
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
@ -73,6 +78,17 @@ for f in files:
print('Extracting {0}...'.format(f))
tgz.extractall(path='nndc/' + suffix)
#===============================================================================
# EDIT GRAPHITE ZAID (6012 to 6000)
print('Changing graphite ZAID from 6012 to 6000')
graphite = os.path.join('nndc', 'tsl', 'graphite.acer')
with open(graphite) as fh:
text = fh.read()
text = text.replace('6012', '6000', 1)
with open(graphite, 'w') as fh:
fh.write(text)
# ==============================================================================
# COPY CROSS_SECTIONS.XML
@ -94,3 +110,43 @@ if not response or response.lower().startswith('y'):
if os.path.exists(f):
print('Removing {0}...'.format(f))
os.remove(f)
# ==============================================================================
# PROMPT USER TO CONVERT ASCII TO BINARY
# Ask user to convert
if sys.version_info[0] < 3:
response = raw_input('Convert ACE files to binary? ([y]/n) ')
else:
response = input('Convert ACE files to binary? ([y]/n) ')
# Convert files if requested
if not response or response.lower().startswith('y'):
# get a list of directories
ace_dirs = glob.glob(os.path.join('nndc', '*K'))
ace_dirs += glob.glob(os.path.join('nndc', 'tsl'))
# 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)

View file

@ -46,9 +46,9 @@ copyright = u'2011-2014, Massachusetts Institute of Technology'
# built documents.
#
# The short X.Y version.
version = "0.5"
version = "0.6"
# The full version, including alpha/beta/rc tags.
release = "0.5.3"
release = "0.6.0"
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

View file

@ -10,7 +10,7 @@ as debugging.
.. toctree::
:numbered:
:maxdepth: 2
:maxdepth: 3
structures
styleguide

View file

@ -38,7 +38,7 @@ following criteria must be satisfied for all proposed changes:
- Changes have a clear purpose and are useful.
- Compiles under all conditions (MPI, OpenMP, HDF5, etc.). This is checked as
part of the test suite (see `test_compile.py`_).
part of the test suite.
- Passes the regression suite.
- If appropriate, test cases are added to regression suite.
- No memory leaks (checked with valgrind_).
@ -91,6 +91,133 @@ features and bug fixes. The general steps for contributing are as follows:
6. After the pull request has been thoroughly vetted, it is merged back into the
*develop* branch of mit-crpg/openmc.
.. _test suite:
OpenMC Test Suite
-----------------
The purpose of this test suite is to ensure that OpenMC compiles using various
combinations of compiler flags and options, and that all user input options can
be used successfully without breaking the code. The test suite is comprised of
regression tests where different types of input files are configured and the
full OpenMC code is executed. Results from simulations are compared with
expected results. The test suite is comprised of many build configurations
(e.g. debug, mpi, hdf5) and the actual tests which reside in sub-directories
in the tests directory. We recommend to developers to test their branches
before submitting a formal pull request using gfortran and intel compilers
if available.
The test suite is designed to integrate with cmake using ctest_.
It is configured to run with cross sections from NNDC_. To
download these cross sections please do the following:
.. code-block:: sh
cd ../data
python get_nndc.py
export CROSS_SECTIONS=<path_to_data_folder>/nndc/cross_sections.xml
The test suite can be run on an already existing build using:
.. code-block:: sh
cd build
make test
or
.. code-block:: sh
cd build
ctest
There are numerous ctest_ command line options that can be set to have
more control over which tests are executed.
Before running the test suite python script, the following environmental
variables should be set if the default paths are incorrect:
* **FC** - The command of the Fortran compiler (e.g. gfotran, ifort).
* Default - *gfortran*
* **MPI_DIR** - The path to the MPI directory.
* Default - */opt/mpich/3.1-gnu*
* **HDF5_DIR** - The path to the HDF5 directory.
* Default - */opt/hdf5/1.8.12-gnu*
* **PHDF5_DIR** - The path to the parallel HDF5 directory.
* Default - */opt/phdf5/1.8.12-gnu*
* **PETSC_DIR** - The path to the PETSc directory.
* Default - */opt/petsc/3.4.4-gnu*
To run the full test suite, the following command can be executed in the
tests directory:
.. code-block:: sh
python run_tests.py
A subset of build configurations and/or tests can be run. To see how to use
the script run:
.. code-block:: sh
python run_tests.py --help
As an example, say we want to run all tests with debug flags only on tests
that have cone and plot in their name. Also, we would like to run this on
4 processors. We can run:
.. code-block:: sh
python run_tests.py -j 4 -C debug -R "cone|plot"
Note that standard regular expression syntax is used for selecting build
configurations and tests. To print out a list of build configurations, we
can run:
.. code-block:: sh
python run_tests.py -p
Adding tests to test suite
++++++++++++++++++++++++++
To add a new test to the test suite, create a sub-directory in the tests
directory that conforms to the regular expression *test_*. To configure
a test you need to add the following files to your new test directory,
*test_name* for example:
* OpenMC input XML files
* **test_name.py** - python test driver script, please refer to other
tests to see how to construct. Any output files that are generated
during testing must be removed at the end of this script.
* **results.py** - python script that extracts results from statepoint
output files. By default it should look for a binary file, but can
take an argument to overwrite which statepoint file is processed,
whether it is at a different batch or with an HDF5 extension. This
script must output a results file that is named *results_test.dat*.
It is recommended that any real numbers reported use *12.6E* format.
* **results_true.dat** - ASCII file that contains the expected results
from the test. The file *results_test.dat* is compared to this file
during the execution of the python test driver script. When the
above files have been created, generate a *results_test.dat* file and
copy it to this name and commit. It should be noted that this file
should be generated with basic compiler options during openmc
configuration and build (e.g., no MPI/HDF5, no debug/optimization).
In addition to this description, please see the various types of tests that
are already included in the test suite to see how to create them. If all is
implemented correctly, the new test directory will automatically be added
to the CTest framework.
Private Development
-------------------
@ -108,10 +235,11 @@ from your private repository into a public fork.
.. _git: http://git-scm.com/
.. _GitHub: https://github.com/
.. _git flow: http://nvie.com/git-model
.. _test_compile.py: https://github.com/mit-crpg/openmc/blob/develop/tests/test_compile/test_compile.py
.. _valgrind: http://valgrind.org/
.. _style guide: http://mit-crpg.github.io/openmc/devguide/styleguide.html
.. _pull request: https://help.github.com/articles/using-pull-requests
.. _mit-crpg/openmc: https://github.com/mit-crpg/openmc
.. _paid plan: https://github.com/plans
.. _Bitbucket: https://bitbucket.org
.. _ctest: http://www.cmake.org/cmake/help/v2.8.12/ctest.html
.. _NNDC: http://http://www.nndc.bnl.gov/endf/b7.1/acefiles.html

View file

@ -13,13 +13,13 @@ With the FoX library, extending the user input files to include new tags is
fairly straightforward. The steps for modifying/adding input are as follows:
1. Add appropriate calls to procedures from the `xml_interface module`_, such as
``check_for_node``, ``get_node_value``, and ``get_node_array``. All input
reading is performed in the `input_xml module`_.
``check_for_node``, ``get_node_value``, and ``get_node_array``. All input
reading is performed in the `input_xml module`_.
2. Make sure that your input can be categorized as one of the datatypes from
`XML Schema Part 2`_ and that parsing of the data appropriately reflects
this. For example, for a boolean_ value, true can be represented either by "true"
or by "1".
`XML Schema Part 2`_ and that parsing of the data appropriately reflects
this. For example, for a boolean_ value, true can be represented either by
"true" or by "1".
3. Add code to check the variable for any possible errors.
@ -29,10 +29,90 @@ schema for the file you changed (e.g. src/relaxng/geometry.rnc) so that
those who use Emacs can confirm whether their input is valid before they
run. You will need to be familiar with RELAX NG `compact syntax`_.
.. _FoX: https://github.com/andreww/fox
Working with the FoX Submodule
==============================
The FoX_ library is included as a submodule_ in OpenMC. This means that for a
given commit in OpenMC, there is an associated commit id that links to FoX.
The actual FoX source code is maintained at mit-crpg/fox, branch openmc. When
cloning the OpenMC repo for the first time, you will notice that the directory
*src/xml/fox* is empty. To fetch the submodule source code, you can manually
enter the following from the root directory of OpenMC:
.. code-block:: sh
git submodule init
git submodule update
It should be noted that if the submodule is not initialized and updated, *cmake*
will automatically perform these commands if it cannot file the FoX source code.
If you navigate into the FoX source code in OpenMC, src/xml/fox, and check git
information, you will notice that you are in a completely different repo. Actually,
you are in a clone of mit-crpg/fox. If you have write access to this repo, you can
make changes to the FoX source code, commit and push just like any other repo.
Just because you make changes to the FoX source code in OpenMC or in a standalone
repo, this does not mean that OpenMC will automatically fetch these changes. The
way submodules work is that they are just stored as a commit id. To save FoX xml
source changes to your OpenMC branch, do the following:
1. Go into src/xml/fox and check out the appropriate source code state
2. Navigate back out of fox subdirectory and type:
.. code-block:: sh
git status
3. Make sure you see that git recognized that the state of FoX changed:
::
# On branch fox_submodule
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: fox (new commits)
4. Commit and push this change
Editing FoX on Personal Fork
============================
If you don't have write access to mit-crpg/fox and thus can't make a branch off of the openmc
branch there, you will need to fork mit-crpg/fox to your personal account. You need to then
link your branch in your OpenMC repo, to the *openmc* branch on your own personal FoX fork.
To do this, edit the *.gitmodules* file in the root folder of the repo. It contains the
following information:
::
[submodule "src/xml/fox"]
path = src/xml/fox
url = git@github.com:mit-crpg/fox
Change the url remote to your own fork. The commit id should stay constant until you start
making modification to FoX yourself. Once you have made changes to your FoX fork and linked
the new commit id to your OpenMC branch, you can pull request your changes in by peforming
the following steps:
1. Create a pull request from your fork of FoX to mit-crpg/fox and wait until it
is merged into the openmc branch.
2. In your OpenMC repo, change your *.gitmodules* file back to point at mit-crpg/fox.
3. Submit a pull request to mit-crpg/openmc
.. warning:: If you make changes to your FoX submodule inside of an OpenMC repo and do not
commit, do **not** run *git submodule update*. This may throw away any changes that
were not committed.
.. _FoX: https://github.com/mit-crpg/fox
.. _xml_interface module: https://github.com/mit-crpg/openmc/blob/develop/src/xml_interface.F90
.. _input_xml module: https://github.com/mit-crpg/openmc/blob/develop/src/input_xml.F90
.. _XML Schema Part 2: http://www.w3.org/TR/xmlschema-2/
.. _boolean: http://www.w3.org/TR/xmlschema-2/#boolean
.. _RELAX NG: http://relaxng.org/
.. _compact syntax: http://relaxng.org/compact-tutorial-20030326.html
.. _submodule: http://git-scm.com/book/en/Git-Tools-Submodules

View file

@ -10,8 +10,8 @@ Publications
- Andrew Siegel, Kord Smith, Kyle Felker, Paul Romano, Benoit Forget, and Peter
Beckman, "Improved cache performance in Monte Carlo transport calculations
using energy banding," *Comput. Phys. Commun.*
(2013). `<http://dx.doi.org/10.1016/j.cpc.2013.10.008>`_
using energy banding," *Comput. Phys. Commun.*, **185** (4), 1195--1199
(2014). `<http://dx.doi.org/10.1016/j.cpc.2013.10.008>`_
- Jonathan A. Walsh, Benoit Forget, and Kord S. Smith, "Validation of OpenMC
Reactor Physics Simulations with the B&W 1810 Series Benchmarks,"
@ -28,23 +28,25 @@ Publications
- Paul K. Romano, Benoit Forget, Kord Smith, and Andrew Siegel, "On the use of
tally servers in Monte Carlo simulations of light-water reactors,"
*Proc. Joint International Conference on Supercomputing in Nuclear
Applications and Monte Carlo*, Paris, France, Oct. 27--31 (2013).
Applications and Monte Carlo*, Paris, France, Oct. 27--31
(2013). `<http://dx.doi.org/10.1051/snamc/201404301>`_
- Paul K. Romano, Nicholas E. Horelik, Bryan R. Herman, Adam G. Nelson, Benoit
Forget, and Kord Smith, "OpenMC: A State-of-the-Art Monte Carlo Code for
Research and Development," *Proc. Joint International Conference on
Supercomputing in Nuclear Applications and Monte Carlo*, Paris, France,
Oct. 27--31 (2013).
Oct. 27--31 (2013). `<http://dx.doi.org/10.1051/snamc/201406016>`_
- Kyle G. Felker, Andrew R. Siegel, Kord S. Smith, Paul K. Romano, and Benoit
Forget, "The energy band memory server algorithm for parallel Monte Carlo
calculations," *Proc. Joint International Conference on Supercomputing in
Nuclear Applications and Monte Carlo*, Paris, France, Oct. 27--31 (2013).
Nuclear Applications and Monte Carlo*, Paris, France, Oct. 27--31
(2013). `<http://dx.doi.org/10.1051/snamc/201404207>`_
- John R. Tramm and Andrew R. Siegel, "Memory Bottlenecks and Memory Contention
in Multi-Core Monte Carlo Transport Codes," *Proc. Joint International
Conference on Supercomputing in Nuclear Applications and Monte Carlo*, Paris,
France, Oct. 27--31 (2013).
France, Oct. 27--31 (2013). `<http://dx.doi.org/10.1051/snamc/201404208>`_
- Andrew R. Siegel, Kord Smith, Paul K. Romano, Benoit Forget, and Kyle Felker,
"Multi-core performance studies of a Monte Carlo neutron transport code,"

View file

@ -43,7 +43,7 @@ following commands in a terminal:
git clone git://github.com/mit-crpg/openmc.git
cd openmc/src
git checkout master
git checkout -b master origin/master
make
sudo make install

View file

@ -10,6 +10,7 @@ bugs fixed, and known issues for each successive release.
.. toctree::
:maxdepth: 1
notes_0.6.0
notes_0.5.4
notes_0.5.3
notes_0.5.2

View file

@ -0,0 +1,59 @@
.. _notes_0.6.0:
==============================
Release Notes for OpenMC 0.6.0
==============================
-------------------
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).
------------
New Features
------------
- Legendre and spherical harmonic expansion tally scores
- CMake is now default build system
- Regression test suite based on CTests and NNDC cross sections
- FoX is now a git submodule
- Support for older cross sections (e.g. MCNP 66c)
- Progress bar for plots
- Expanded support for natural elements via <natural_elements> in settings.xml
---------
Bug Fixes
---------
- 41f7ca_: Fixed erroneous results from survival biasing
- 038736_: Fix tallies over void materials
- 46f9e8_: Check for negative values in probability tables
- d1ca35_: Fixed sampling of angular distribution
- 0291c0_: Fixed indexing error in plotting
- d7a7d0_: Fix bug with <element> specifying xs attribute
- 85b3cb_: Fix out-of-bounds error with OpenMP threading
.. _41f7ca: https://github.com/mit-crpg/openmc/commit/41f7ca
.. _038736: https://github.com/mit-crpg/openmc/commit/038736
.. _46f9e8: https://github.com/mit-crpg/openmc/commit/46f9e8
.. _d1ca35: https://github.com/mit-crpg/openmc/commit/d1ca35
.. _0291c0: https://github.com/mit-crpg/openmc/commit/0291c0
.. _d7a7d0: https://github.com/mit-crpg/openmc/commit/d7a7d0
.. _85b3cb: https://github.com/mit-crpg/openmc/commit/85b3cb
------------
Contributors
------------
This release contains new contributions from the following people:
- `Sterling Harper <smharper@mit.edu>`_
- `Bryan Herman <bherman@mit.edu>`_
- `Nick Horelik <nhorelik@mit.edu>`_
- `Adam Nelson <nelsonag@umich.edu>`_
- `Paul Romano <paul.k.romano@gmail.com>`_
- `Jon Walsh <walshjon@mit.edu>`_

View file

@ -41,7 +41,7 @@ for the geometry, materials, and settings. Additionally, there are three optiona
input files. The first is a tallies XML file that specifies physical quantities
to be tallied. The second is a plots XML file that specifies regions of geometry
which should be plotted. The third is a CMFD XML file that specifies coarse mesh
acceleration geometry and execution parameters. OpenMC expects that these
acceleration geometry and execution parameters. OpenMC expects that these
files are called:
* ``geometry.xml``
@ -105,7 +105,7 @@ default. This element has the following attributes/sub-elements:
The ``<eigenvalue>`` element indicates that a :math:`k`-eigenvalue calculation
should be performed. It has the following attributes/sub-elements:
:batches:
:batches:
The total number of batches, where each batch corresponds to multiple
fission source iterations. Batching is done to eliminate correlation between
realizations of random variables.
@ -171,7 +171,7 @@ problem. It has the following attributes/sub-elements:
The ``<fixed_source>`` element indicates that a fixed source calculation should be
performed. It has the following attributes/sub-elements:
:batches:
:batches:
The total number of batches. For fixed source calculations, each batch
represents a realization of random variables for tallies.
@ -182,6 +182,29 @@ performed. It has the following attributes/sub-elements:
*Default*: None
.. _natural_elements:
``<natural_elements>`` Element
------------------------------
The ``<natural_elements>`` element indicates to OpenMC what nuclides are
available in the cross section library when expanding an ``<element>`` into
separate isotopes (see :ref:`material`). The accepted values are:
- ENDF/B-VII.0
- ENDF/B-VII.1
- JEFF-3.1.1
- JEFF-3.1.2
- JEFF-3.2
- JENDL-3.2
- JENDL-3.3
- JENDL-4.0
Note that the value is case-insensitive, so "ENDF/B-VII.1" is equivalent to
"endf/b-vii.1".
*Default*: ENDF/B-VII.1
``<no_reduce>`` Element
-----------------------
@ -206,7 +229,7 @@ out the file and "false" will not.
*Default*: false
:summary:
:summary:
Writes out an ASCII summary file describing all of the user input files that
were read in.
@ -274,7 +297,7 @@ attributes/sub-elements:
An element specifying the spatial distribution of source sites. This element
has the following attributes:
:type:
:type:
The type of spatial distribution. Valid options are "box" and "point". A
"box" spatial distribution has coordinates sampled uniformly in a
parallelepiped. A "point" spatial distribution has coordinates specified
@ -298,7 +321,7 @@ attributes/sub-elements:
An element specifying the angular distribution of source sites. This element
has the following attributes:
:type:
:type:
The type of angular distribution. Valid options are "isotropic" and
"monodirectional". The angle of the particle emitted from a source site is
isotropic if the "isotropic" option is given. The angle of the particle
@ -321,7 +344,7 @@ attributes/sub-elements:
An element specifying the energy distribution of source sites. This element
has the following attributes:
:type:
:type:
The type of energy distribution. Valid options are "monoenergetic",
"watt", and "maxwell". The "monoenergetic" option produces source sites at
@ -350,8 +373,8 @@ attributes/sub-elements:
The ``<state_point>`` element indicates at what batches a state point file
should be written. A state point file can be used to restart a run or to get
tally results at any batch. The default behavior when using this tag is to
write out the source bank in the state_point file. This behavior can be
tally results at any batch. The default behavior when using this tag is to
write out the source bank in the state_point file. This behavior can be
customized by using the ``<source_point>`` element. This element has the
following attributes/sub-elements:
@ -371,28 +394,29 @@ following attributes/sub-elements:
``<source_point>`` Element
--------------------------
The ``<source_point>`` element indicates at what batches the source bank
should be written. The source bank can be either written out within a state
The ``<source_point>`` element indicates at what batches the source bank
should be written. The source bank can be either written out within a state
point file or separately in a source point file. This element has the following
attributes/sub-elements:
:batches:
A list of integers separated by spaces indicating at what batches a state
point file should be written. It should be noted that if source_separate
tag is not set to "true", this list must be a subset of state point batches.
point file should be written. It should be noted that if the ``separate``
attribute is not set to "true", this list must be a subset of state point
batches.
*Default*: Last batch only
:interval:
A single integer :math:`n` indicating that a state point should be written
every :math:`n` batches. This option can be given in lieu of listing
batches explicitly. It should be noted that if source_separate tag is not
set to "true", this value should produce a list of batches that is a subset
of state point batches.
every :math:`n` batches. This option can be given in lieu of listing batches
explicitly. It should be noted that if the ``separate`` attribute is not set
to "true", this value should produce a list of batches that is a subset of
state point batches.
*Default*: None
:source_separate:
:separate:
If this element is set to "true", a separate binary source point file will be
written. Otherwise, the source sites will be written in the state point
directly.
@ -401,17 +425,17 @@ attributes/sub-elements:
:source_write:
If this element is set to "false", source sites are not written
to the state point or source point file. This can substantially reduce the
to the state point or source point file. This can substantially reduce the
size of state points if large numbers of particles per batch are used.
*Default*: true
:overwrite_latest:
If this element is set to "true", a source point file containing
the source bank will be written out to a separate file named
``source.binary`` or ``source.h5`` depending on if HDF5 is enabled.
the source bank will be written out to a separate file named
``source.binary`` or ``source.h5`` depending on if HDF5 is enabled.
This file will be overwritten at every single batch so that the latest
source bank will be available. It should be noted that a user can set both
source bank will be available. It should be noted that a user can set both
this element to "true" and specify batches to write a permanent source bank.
*Default*: false
@ -741,6 +765,8 @@ sub-elements:
Materials Specification -- materials.xml
----------------------------------------
.. _material:
``<material>`` Element
----------------------
@ -780,12 +806,13 @@ Each ``material`` element can have the following attributes or sub-elements:
:element:
Specifies that a natural element is present in the material. The natural
element is split up into individual isotopes based on IUPAC Isotopic
Compositions of the Elements 1997. This element has attributes/sub-elements
called ``name``, ``xs``, and ``ao``. The ``name`` attribute is the atomic
symbol of the element while the ``xs`` attribute is the cross-section
identifier. Finally, the ``ao`` attribute specifies the atom percent of the
element within the material, respectively. One example would be as follows:
element is split up into individual isotopes based on `IUPAC Isotopic
Compositions of the Elements 2009`_. This element has
attributes/sub-elements called ``name``, ``xs``, and ``ao``. The ``name``
attribute is the atomic symbol of the element while the ``xs`` attribute is
the cross-section identifier. Finally, the ``ao`` attribute specifies the
atom percent of the element within the material, respectively. One example
would be as follows:
.. code-block:: xml
@ -794,6 +821,10 @@ Each ``material`` element can have the following attributes or sub-elements:
<element name="Mn" ao="2.7426e-05" />
<element name="Cu" ao="1.6993e-04" />
In some cross section libraries, certain naturally occurring isotopes do not
have cross sections. The :ref:`natural_elements` option determines how a
natural element is split into isotopes in these cases.
*Default*: None
@ -805,6 +836,9 @@ Each ``material`` element can have the following attributes or sub-elements:
*Default*: None
.. _IUPAC Isotopic Compositions of the Elements 2009:
http://pac.iupac.org/publications/pac/pdf/2011/pdf/8302x0397.pdf
``<default_xs>`` Element
------------------------
@ -845,7 +879,7 @@ The ``<tally>`` element accepts the following sub-elements:
:label:
This is an optional sub-element specifying the name of this tally to be used
for output purposes. This string is limited to 52 characters for formatting
for output purposes. This string is limited to 52 characters for formatting
purposes.
:filter:
@ -915,10 +949,11 @@ The ``<tally>`` element accepts the following sub-elements:
:scores:
A space-separated list of the desired responses to be accumulated. Accepted
options are "flux", "total", "scatter", "nu-scatter", "scatter-N",
"scatter-PN", "absorption", "fission", "nu-fission", "kappa-fission",
"current", and "events". These corresponding to the following physical
quantities.
options are "flux", "total", "scatter", "absorption", "fission",
"nu-fission", "kappa-fission", "nu-scatter", "scatter-N", "scatter-PN",
"scatter-YN", "nu-scatter-N", "nu-scatter-PN", "nu-scatter-YN", "flux-YN",
"total-YN", "current", and "events". These corresponding to the following
physical quantities:
:flux:
Total flux
@ -930,24 +965,6 @@ The ``<tally>`` element accepts the following sub-elements:
Total scattering rate. Can also be identified with the ``scatter-0``
response type.
:nu-scatter:
Total production of neutrons due to scattering. This accounts for
multiplicity from (n,2n), (n,3n), and (n,4n) reactions and should be
slightly higher than the scattering rate.
:scatter-N:
Tally the N\ :sup:`th` \ scattering moment, where N is the Legendre
expansion order. N must be between 0 and 10. As an example, tallying the
2\ :sup:`nd` \ scattering moment would be specified as ``<scores>
scatter-2 </scores>``.
:scatter-PN:
Tally all of the scattering moments from order 0 to N, where N is the
Legendre expansion order. That is, ``scatter-P1`` is equivalent to
requesting tallies of ``scatter-0`` and ``scatter-1``. N must be between
0 and 10. As an example, tallying up to the 2\ :sup:`nd` \ scattering
moment would be specified as ``<scores> scatter-P2 </scores>``.
:absorption:
Total absorption rate. This accounts for all reactions which do not
produce secondary neutrons.
@ -957,7 +974,7 @@ The ``<tally>`` element accepts the following sub-elements:
:nu-fission:
Total production of neutrons due to fission
:kappa-fission:
The recoverable energy production rate due to fission. The recoverable
energy is defined as the fission product kinetic energy, prompt and
@ -967,6 +984,47 @@ The ``<tally>`` element accepts the following sub-elements:
prompt and delayed :math:`\gamma`-rays are assumed to deposit their energy
locally.
:scatter-N:
Tally the N\ :sup:`th` \ scattering moment, where N is the Legendre
expansion order of the change in particle angle :math:`\left(\mu\right)`.
N must be between 0 and 10. As an example, tallying the
2\ :sup:`nd` \ scattering moment would be specified as
``<scores> scatter-2 </scores>``.
:scatter-PN:
Tally all of the scattering moments from order 0 to N, where N is the
Legendre expansion order of the change in particle angle :math:`\left(\mu\right)`.
That is, ``scatter-P1`` is equivalent to requesting tallies of
``scatter-0`` and ``scatter-1``. Like for ``scatter-N``,
N must be between 0 and 10. As an example, tallying up to the
2\ :sup:`nd` \ scattering moment would be specified as
``<scores> scatter-P2 </scores>``.
:scatter-YN:
``scatter-YN`` is similar to ``scatter-PN`` except an additional
expansion is performed for the incoming particle direction
:math:`\left(\Omega\right)` using the real spherical harmonics. This is useful
for performing angular flux moment weighting of the scattering moments.
Like ``scatter-PN``, ``scatter-YN`` will tally all of the moments from
order 0 to N; N again must be between 0 and 10.
:nu-scatter, nu-scatter-N, nu-scatter-PN, nu-scatter-YN:
These scores are similar in functionality to their ``scatter*``
equivalents except the total production of neutrons due to
scattering is scored vice simply the scattering rate. This accounts for
multiplicity from (n,2n), (n,3n), and (n,4n) reactions.
:flux-YN:
Spherical harmonic expansion of the direction of motion
:math:`\left(\Omega\right)` of the total flux. This score will tally
all of the harmonic moments of order 0 to N. N must be between 0 and 10.
:total-YN:
Spherical harmonic expansion of the incoming particle's direction of
motion :math:`\left(\Omega\right)` of the total flux. This score will
tally all of the harmonic moments of order 0 to N. N must be between 0
and 10.
:current:
Partial currents on the boundaries of each cell in a mesh.
@ -1137,7 +1195,7 @@ attributes or sub-elements. These are not used in "voxel" plots:
Any number of this optional tag may be included in each ``<plot>`` element,
which can override the default random colors for cells or materials. Each
``col_spec`` element must contain ``id`` and ``rgb`` sub-elements.
:id:
Specifies the cell or material unique id for the color specification.
@ -1174,20 +1232,20 @@ attributes or sub-elements. These are not used in "voxel" plots:
------------------------------
CMFD Specification -- cmfd.xml
------------------------------
Coarse mesh finite difference acceleration method has been implemented in OpenMC.
Currently, it allows users to accelerate fission source convergence during
inactive neutron batches. To run CMFD, the ``<run_cmfd>`` element in
Currently, it allows users to accelerate fission source convergence during
inactive neutron batches. To run CMFD, the ``<run_cmfd>`` element in
``settings.xml`` should be set to "true".
``<active_flush>`` Element
--------------------------
The ``<active_flush>`` element controls the batch where CMFD tallies should be
reset. CMFD tallies should be reset before active batches so they are accumulated
reset. CMFD tallies should be reset before active batches so they are accumulated
without bias.
*Default*: 0
*Default*: 0
``<begin>`` Element
-------------------
@ -1224,9 +1282,9 @@ It can be turned on with "true" and off with "false".
``<inactive>`` Element
----------------------
The ``<inactive>`` element controls if cmfd tallies should be accumulated
during inactive batches. For some applications, CMFD tallies may not be
needed until the start of active batches. This option can be turned on
The ``<inactive>`` element controls if cmfd tallies should be accumulated
during inactive batches. For some applications, CMFD tallies may not be
needed until the start of active batches. This option can be turned on
with "true" and off with "false"
*Default*: true
@ -1243,12 +1301,12 @@ occurs. The amout of resets is controlled with the ``<num_flushes>`` element.
``<ksp_monitor>`` Element
-------------------------
The ``<ksp_monitor>`` element is used to view the convergence of linear GMRES
iterations in PETSc. This option can be turned on with "true" and turned off
The ``<ksp_monitor>`` element is used to view the convergence of linear GMRES
iterations in PETSc. This option can be turned on with "true" and turned off
with "false".
*Default*: false
*Default*: false
``<mesh>`` Element
------------------
@ -1261,7 +1319,7 @@ attributes/sub-elements:
given, it is assumed that the mesh is an x-y mesh.
:upper_right:
The upper-right corner of the structrued mesh. If only two coordinate are
The upper-right corner of the structrued mesh. If only two coordinate are
given, it is assumed that the mesh is an x-y mesh.
:dimension:
@ -1272,8 +1330,8 @@ attributes/sub-elements:
:energy:
Energy bins [in MeV], listed in ascending order (e.g. 0.0 0.625e-7 20.0)
for CMFD tallies and acceleration. If no energy bins are listed, OpenMC
automatically assumes a one energy group calculation over the entire
for CMFD tallies and acceleration. If no energy bins are listed, OpenMC
automatically assumes a one energy group calculation over the entire
energy range.
:albedo:
@ -1283,10 +1341,10 @@ attributes/sub-elements:
*Default*: 1.0 1.0 1.0 1.0 1.0 1.0
:map:
An optional acceleration map can be specified to overlay on the coarse
mesh spatial grid. If this option is used a ``1`` is used for a
An optional acceleration map can be specified to overlay on the coarse
mesh spatial grid. If this option is used a ``1`` is used for a
non-accelerated region and a ``2`` is used for an accelerated region.
For a simple 4x4 coarse mesh with a 2x2 fuel lattice surrounded by
For a simple 4x4 coarse mesh with a 2x2 fuel lattice surrounded by
reflector, the map is:
``1 1 1 1``
@ -1297,24 +1355,24 @@ attributes/sub-elements:
``1 1 1 1``
Therefore a 2x2 system of equations is solved rather than a 4x4. This
is extremely important to use in reflectors as neutrons will not
Therefore a 2x2 system of equations is solved rather than a 4x4. This
is extremely important to use in reflectors as neutrons will not
contribute to any tallies far away from fission source neutron regions.
A ``2`` must be used to identify any fission source region.
.. note:: Only two of the following three sub-elements are needed:
``lower_left``, ``upper_right`` and ``width``. Any combination
.. note:: Only two of the following three sub-elements are needed:
``lower_left``, ``upper_right`` and ``width``. Any combination
of two of these will yield the third.
``<norm>`` Element
------------------
The ``<norm>`` element is used to normalize the CMFD fission source distribution
to a particular value. For example, if a fission source is calculated for a
17 x 17 lattice of pins, the fission source may be normalized to the number of
fission source regions, in this case 289. This is useful when visualizing this
distribution as the average peaking factor will be unity. This parameter will
not impact the calculation.
The ``<norm>`` element is used to normalize the CMFD fission source distribution
to a particular value. For example, if a fission source is calculated for a
17 x 17 lattice of pins, the fission source may be normalized to the number of
fission source regions, in this case 289. This is useful when visualizing this
distribution as the average peaking factor will be unity. This parameter will
not impact the calculation.
*Default*: 1.0
@ -1329,7 +1387,7 @@ occur during inactive CMFD batches.
``<power_monitor>`` Element
---------------------------
The ``<power_monitor>`` element is used to view the convergence of power iteration.
The ``<power_monitor>`` element is used to view the convergence of power iteration.
This option can be turned on with "true" and turned off with "false".
*Default*: false
@ -1355,7 +1413,7 @@ function in PETSc. This option can be turned on with "true" and turned off with
--------------------
The ``<solver>`` element controls whether the CMFD eigenproblem is solved with
standard power iteration or nonlinear Jacobian-free Newton Krylov (JFNK).
standard power iteration or nonlinear Jacobian-free Newton Krylov (JFNK).
By setting "power", power iteration is used and by setting "jfnk", JFNK is used.
*Default*: power

View file

@ -322,6 +322,31 @@ This will build an executable named ``openmc``.
.. _MinGW: http://www.mingw.org
.. _SourceForge: http://sourceforge.net/projects/mingw
Testing Build
-------------
If you have ENDF/B-VII.1 cross sections from NNDC_ you can test your build.
Make sure the **CROSS_SECTIONS** environmental variable is set to the
*cross_sections.xml* file in the *data/nndc* directory.
There are two ways to run tests. The first is to use the Makefile present in
the source directory and run the following:
.. code-block:: sh
cd src
make test
If you want more options for testing you can use ctest_ command. For example,
if we wanted to run only the plot tests with 4 processors, we run:
.. code-block:: sh
cd src/build
ctest -j 4 -R plot
If you want to run the full test suite with different build options please
refer to our :ref:`test suite` documentation.
---------------------------
Cross Section Configuration
---------------------------
@ -347,7 +372,8 @@ extract, and set up a confiuration file:
python get_nndc_data.py
At this point, you should set the :envvar:`CROSS_SECTIONS` environment variable
to the absolute path of the file ``openmc/data/nndc/cross_sections.xml``.
to the absolute path of the file ``openmc/data/nndc/cross_sections.xml``. This
cross section set is used by the test suite.
Using JEFF Cross Sections from OECD/NEA
---------------------------------------
@ -467,3 +493,4 @@ schemas.xml file in your own OpenMC source directory.
.. _GNU Emacs: http://www.gnu.org/software/emacs/
.. _validation: http://en.wikipedia.org/wiki/XML_validation
.. _RELAX NG: http://relaxng.org/
.. _ctest: http://www.cmake.org/cmake/help/v2.8.12/ctest.html

View file

@ -17,7 +17,6 @@ for your Python installation to contain:
* [3]_ `Matplotlib <http://matplotlib.org/>`_
* [3]_ `Silomesh <https://github.com/nhorelik/silomesh>`_
* [3]_ `VTK <http://www.vtk.org/>`_
* [4]_ `PyQt <http://www.riverbankcomputing.com/software/pyqt>`_
Most of these are easily obtainable in Ubuntu through the package manager, or
are easily installed with distutils.
@ -25,7 +24,6 @@ are easily installed with distutils.
.. [1] Required for tally data extraction from statepoints with statepoint.py
.. [2] Required only if reading HDF5 statepoint files.
.. [3] Optional for plotting utilities
.. [4] Optional for interactive GUIs
----------------------
Geometry Visualization
@ -94,9 +92,9 @@ After running OpenMC to obtain PPM files, images should be saved to another
format before using them elsewhere. This cuts down the size of the file by
orders of magnitude. Most image viewers and editors that can view PPM images
can also save to other formats (e.g. `Gimp <http://www.gimp.org/>`_, `IrfanView
<http://www.irfanview.com/>`_, etc.). However, more likey the user will want to
<http://www.irfanview.com/>`_, etc.). However, more likely the user will want to
convert to another format on the command line. This is easily accomplished with
the ``convert`` command available on most linux distributions as part of the
the ``convert`` command available on most Linux distributions as part of the
`ImageMagick <http://www.imagemagick.org/script/convert.php>`_ package. (On
Ubuntu: ``sudo apt-get install imagemagick``). Images are then converted like:
@ -172,7 +170,7 @@ doing this will depend on the 3D viewer, but should be straightforward.
:height: 200px
.. note:: 3D voxel plotting can be very computer intensive for the viewing
program (Visit, Paraview, etc.) if the number of voxels is large (>10
program (Visit, ParaView, etc.) if the number of voxels is large (>10
million or so). Thus if you want an accurate picture that renders
smoothly, consider using only one voxel in a certain direction. For
instance, the 3D pin lattice figure at the beginning of this section
@ -235,13 +233,13 @@ combination:
filters = [('mesh', (1, 1, 5)), ('energyin', 0)]
value, error = sp.get_value(tallyid, filters, score)
In the future more documentaion may become available here for statepoint.py and
In the future more documentation may become available here for statepoint.py and
the data extraction functions of StatePoint objects. However, for now it is up
to the user to explore the classes in statepoint.py to discover what data is
available in StatePoint objects (we highly recommend interactively exploring
with `IPython <http://ipython.org/>`_). Many exmaples can be found by looking
through the other utilies that use statepoint.py, and a few common visualization
tasks will be described here in the following sections.
with `IPython <http://ipython.org/>`_). Many examples can be found by looking
through the other utilities that use statepoint.py, and a few common
visualization tasks will be described here in the following sections.
Plotting in 2D
--------------
@ -251,8 +249,7 @@ Plotting in 2D
For simple viewing of 2D slices of a mesh plot, the utility plot_mesh_tally.py
is provided. This utility provides an interactive GUI to explore and plot
mesh tallies for any scores and filter bins. It requires statepoint.py, as well
as `PyQt <http://www.riverbankcomputing.com/software/pyqt>`_.
mesh tallies for any scores and filter bins. It requires statepoint.py.
.. image:: ../_images/fluxplot.png
:height: 200px
@ -446,14 +443,14 @@ Particle Track Visualization
OpenMC can dump particle tracks—the position of particles as they are
transported through the geometry. There are two ways to make OpenMC output
tracks: all particle tracks through a commandline argument or specific particle
tracks: all particle tracks through a command line argument or specific particle
tracks through settings.xml.
Running OpenMC with the argument "-t", "-track", or "--track" will cause a track
file to be created for every particle transported in the code.
The settings.xml file can dictate that specific particle tracks are output.
These particles are specified withen a ''track'' element. The ''track'' element
These particles are specified within a ''track'' element. The ''track'' element
should contain triplets of integers specifying the batch, generation, and
particle numbers, respectively. For example, to output the tracks for particles
3 and 4 of batch 1 and generation 2 the settings.xml file should contain:
@ -474,7 +471,7 @@ describing track files. The default output name is "track.pvtp". A common
usage of track.py is "track.py track*.binary" which will use the data from all
binary track files in the directory to write a "track.pvtp" VTK output file.
The .pvtp file can then be read and plotted by 3d visualization programs such as
Paraview.
ParaView.
----------------------
Source Site Processing

View file

@ -79,14 +79,6 @@ with the :envvar:`CROSS_SECTIONS` environment variable. It is recommended to add
a line in your ``.profile`` or ``.bash_profile`` setting the
:envvar:`CROSS_SECTIONS` environment variable.
ERROR: Invalid usage of L(I) in ACE data; Consider using more recent data set.
******************************************************************************
The cross-sections requested in ``materials.xml`` do not conform to the current
standard format. This typically happens with fissionable nuclides in a ``.6*c``
library as distributed with MCNP. Please try a newer library such as any from
the ``.7*c`` set.
Geometry Debugging
******************

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<materials>
<default_xs>70c</default_xs>
<default_xs>71c</default_xs>
<material id="40">
<density value="4.5" units="g/cc" />
@ -12,7 +12,7 @@
<density value="1.0" units="g/cc" />
<nuclide name="H-1" ao="2.0" />
<nuclide name="O-16" ao="1.0" />
<sab name="lwtr" xs="10t" />
<sab name="HH2O" xs="71t" />
</material>
</materials>

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<materials>
<default_xs>70c</default_xs>
<default_xs>71c</default_xs>
<!-- Definition of materials -->
<material id="1">
@ -13,7 +13,7 @@
<density value="1.0" units="g/cc" />
<nuclide name="H-1" ao="2.0" />
<nuclide name="O-16" ao="1.0" />
<sab name="lwtr" xs="10t" />
<sab name="HH2O" xs="71t" />
</material>
</materials>

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<materials>
<default_xs>70c</default_xs>
<default_xs>71c</default_xs>
<!-- Definition of materials -->
<material id="1">
@ -13,7 +13,7 @@
<density value="1.0" units="g/cc" />
<nuclide name="H-1" ao="2.0" />
<nuclide name="O-16" ao="1.0" />
<sab name="lwtr" xs="10t" />
<sab name="HH2O" xs="71t" />
</material>
</materials>

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<materials>
<!-- By default, use 600K cross sections -->
<!-- By default, use 300K cross sections -->
<default_xs>71c</default_xs>
<!--
@ -64,7 +64,7 @@
<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="lwtr" xs="15t" />
<sab name="HH2O" xs="71t" />
</material>
</materials>
</materials>

View file

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<materials>
<default_xs>70c</default_xs>
<default_xs>71c</default_xs>
<material id="1">
<density value="4.5" units="g/cc" />

View file

@ -33,7 +33,7 @@ Write tracks for all particles.
.B "\-v\fR, \fP\-\-version"
Show version information.
.TP
.B "\-?\fR, \fP\-\-help"
.B "\-h\fR, \fP\-\-help"
Show help message.
.SH ENVIRONMENT VARIABLES
The behavior of

View file

@ -7,6 +7,14 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/include)
#===============================================================================
# Architecture specific definitions
#===============================================================================
if (${UNIX})
add_definitions(-DUNIX)
endif()
#===============================================================================
# Command line options
#===============================================================================
@ -17,6 +25,7 @@ option(petsc "Enable PETSC for use in CMFD acceleration" OFF)
option(debug "Compile with debug flags" OFF)
option(optimize "Turn on all compiler optimization flags" OFF)
option(verbose "Create verbose Makefiles" OFF)
option(coverage "Compile with flags" OFF)
if (verbose)
set(CMAKE_VERBOSE_MAKEFILE on)
@ -26,15 +35,21 @@ endif()
# MPI for distributed-memory parallelism / HDF5 for binary output
#===============================================================================
set(MPI_ENABLED FALSE)
set(HDF5_ENABLED FALSE)
if($ENV{FC} MATCHES "mpi.*")
message("-- Detected MPI wrapper: $ENV{FC}")
add_definitions(-DMPI)
set(MPI_ENABLED TRUE)
elseif($ENV{FC} MATCHES "h5fc$")
message("-- Detected HDF5 wrapper: $ENV{FC}")
add_definitions(-DHDF5)
set(HDF5_ENABLED TRUE)
elseif($ENV{FC} MATCHES "h5pfc$")
message("-- Detected parallel HDF5 wrapper: $ENV{FC}")
add_definitions(-DMPI -DHDF5)
set(MPI_ENABLED TRUE)
set(HDF5_ENABLED TRUE)
endif()
#===============================================================================
@ -59,6 +74,10 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
set(f90flags "-fopenmp ${f90flags}")
set(ldflags "-fopenmp ${ldflags}")
endif()
if(coverage)
set(f90flags "-coverage ${f90flags}")
set(ldflags "-coverage ${ldflags}")
endif()
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
# Intel Fortran compiler options
@ -128,7 +147,9 @@ endif()
# PETSc for CMFD functionality
#===============================================================================
set (PETSC_ENABLED FALSE)
if(petsc)
set(PETSC_ENABLED TRUE)
find_package(PETSc REQUIRED HINTS $ENV{PETSC_DIR}/conf)
find_library(libpetsc petsc $ENV{PETSC_DIR}/lib)
@ -146,6 +167,34 @@ if(petsc)
list(INSERT PETSC_PACKAGE_LIBS 0 ${PETSC_FLAPACK_LIB})
endif()
# If libdl wasn't found, search /usr/lib64
if(PETSC_DL_LIB STREQUAL "PETSC_DL_LIB-NOTFOUND")
find_library(PETSC_DL_LIB libdl.so /usr/lib64)
list(REMOVE_ITEM PETSC_PACKAGE_LIBS PETSC_DL_LIB-NOTFOUND)
list(INSERT PETSC_PACKAGE_LIBS 0 ${PETSC_DL_LIB})
endif()
# If libm wasn't found, search /usr/lib64
if(PETSC_M_LIB STREQUAL "PETSC_M_LIB-NOTFOUND")
find_library(PETSC_M_LIB libm.so /usr/lib64)
list(REMOVE_ITEM PETSC_PACKAGE_LIBS PETSC_M_LIB-NOTFOUND)
list(INSERT PETSC_PACKAGE_LIBS 0 ${PETSC_M_LIB})
endif()
# If libpthread wasn't found, search /usr/lib64
if(PETSC_PTHREAD_LIB STREQUAL "PETSC_PTHREAD_LIB-NOTFOUND")
find_library(PETSC_PTHREAD_LIB libpthread.so /usr/lib64)
list(REMOVE_ITEM PETSC_PACKAGE_LIBS PETSC_PTHREAD_LIB-NOTFOUND)
list(INSERT PETSC_PACKAGE_LIBS 0 ${PETSC_PTHREAD_LIB})
endif()
# If librt wasn't found, search /usr/lib64
if(PETSC_RT_LIB STREQUAL "PETSC_RT_LIB-NOTFOUND")
find_library(PETSC_RT_LIB librt.so /usr/lib64)
list(REMOVE_ITEM PETSC_PACKAGE_LIBS PETSC_RT_LIB-NOTFOUND)
list(INSERT PETSC_PACKAGE_LIBS 0 ${PETSC_RT_LIB})
endif()
message("-- Using PETSC: ${libpetsc}")
add_definitions(-DPETSC)
include_directories($ENV{PETSC_DIR}/include)
@ -156,7 +205,7 @@ endif()
# git SHA1 hash
#===============================================================================
execute_process(COMMAND git rev-parse -q HEAD
execute_process(COMMAND git rev-parse HEAD
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE GIT_SHA1_SUCCESS
OUTPUT_VARIABLE GIT_SHA1
@ -164,22 +213,30 @@ execute_process(COMMAND git rev-parse -q HEAD
if(GIT_SHA1_SUCCESS EQUAL 0)
add_definitions(-DGIT_SHA1="${GIT_SHA1}")
endif()
#===============================================================================
# FoX Fortran XML Library
#===============================================================================
file(GLOB_RECURSE source_fox xml/*.F90)
add_library(fox STATIC ${source_fox})
# Only initialize git submodules if it is not there. User is responsible
# for future updates of fox xml submodule.
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/xml/fox/.git)
message("-- Initializing/Updating FoX XML submodule...")
execute_process(COMMAND git submodule init
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..)
execute_process(COMMAND git submodule update
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..)
endif()
add_subdirectory(xml/fox)
#===============================================================================
# Build OpenMC executable
#===============================================================================
set(program "openmc")
file(GLOB source *.F90)
file(GLOB source *.F90 xml/openmc_fox.F90)
add_executable(${program} ${source})
target_link_libraries(${program} ${libraries} fox)
target_link_libraries(${program} ${libraries} fox_dom)
set_target_properties(${program} PROPERTIES
COMPILE_FLAGS "${f90flags}"
LINK_FLAGS "${ldflags}")
@ -206,4 +263,137 @@ if(PYTHONINTERP_FOUND)
install(CODE "execute_process(
COMMAND ${PYTHON_EXECUTABLE} setup.py install --user
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/utils)")
endif()
endif()
#===============================================================================
# Regression tests
#===============================================================================
# This allows for dashboard configuration
include(CTest)
# Get a list of all the tests to run
file(GLOB_RECURSE TESTS ${CMAKE_CURRENT_SOURCE_DIR}/../tests/test_*.py)
# Check to see if PETSC is compiled for CMFD tests
if (NOT ${PETSC_ENABLED})
file(GLOB_RECURSE CMFD_TESTS ${CMAKE_CURRENT_SOURCE_DIR}/../tests/test_cmfd*.py)
foreach(cmfd_test in ${CMFD_TESTS})
list(REMOVE_ITEM TESTS ${cmfd_test})
endforeach(cmfd_test)
endif(NOT ${PETSC_ENABLED})
# Check for MEM_CHECK and COVERAGE variables
if (DEFINED ENV{MEM_CHECK})
set(MEM_CHECK $ENV{MEM_CHECK})
else(DEFINED ENV{MEM_CHECK})
set(MEM_CHECK FALSE)
endif(DEFINED ENV{MEM_CHECK})
if (DEFINED ENV{COVERAGE})
set(COVERAGE $ENV{COVERAGE})
else(DEFINED ENV{COVERAGE})
set(COVERAGE FALSE)
endif(DEFINED ENV{COVERAGE})
# Loop through all the tests
foreach(test ${TESTS})
# Get test information
get_filename_component(TEST_NAME ${test} NAME)
get_filename_component(TEST_PATH ${test} PATH)
# Check for running standard tests (no valgrind, no gcov)
if(NOT ${MEM_CHECK} AND NOT ${COVERAGE})
# Check serial/parallel
if (${MPI_ENABLED})
# Preform a parallel test
add_test(NAME ${TEST_NAME}
WORKING_DIRECTORY ${TEST_PATH}
COMMAND ${PYTHON_EXECUTABLE} ${TEST_NAME} --exe $<TARGET_FILE:openmc>
--mpi_exec $ENV{MPI_DIR}/bin/mpiexec)
else(${MPI_ENABLED})
# Perform a serial test
add_test(NAME ${TEST_NAME}
WORKING_DIRECTORY ${TEST_PATH}
COMMAND ${PYTHON_EXECUTABLE} ${TEST_NAME} --exe $<TARGET_FILE:openmc>)
endif(${MPI_ENABLED})
# Handle special case for valgrind and gcov (run openmc directly, no python)
else(NOT ${MEM_CHECK} AND NOT ${COVERAGE})
# If a plot test is encountered, run with "-p"
if (${test} MATCHES "test_plot")
# Perform serial valgrind and coverage test with plot flag
add_test(NAME ${TEST_NAME}
WORKING_DIRECTORY ${TEST_PATH}
COMMAND $<TARGET_FILE:openmc> -p ${TEST_PATH})
# If a restart test is encounted, need to run with -r and restart file(s)
elseif(${test} MATCHES "restart")
# Set restart file names
if (${HDF5_ENABLED})
# Handle restart tests separately
if(${test} MATCHES "test_statepoint_restart")
set(RESTART_FILE statepoint.07.h5)
elseif(${test} MATCHES "test_sourcepoint_restart")
set(RESTART_FILE statepoint.07.h5 source.07.h5)
elseif(${test} MATCHES "test_particle_restart_eigval")
set(RESTART_FILE particle_12_842.h5)
elseif(${test} MATCHES "test_particle_restart_fixed")
set(RESTART_FILE particle_7_6144.h5)
else(${test} MATCHES "test_statepoint_restart")
message(FATAL_ERROR "Restart test ${test} not recognized")
endif(${test} MATCHES "test_statepoint_restart")
else(${HDF5_ENABLED})
# Handle restart tests separately
if(${test} MATCHES "test_statepoint_restart")
set(RESTART_FILE statepoint.07.binary)
elseif(${test} MATCHES "test_sourcepoint_restart")
set(RESTART_FILE statepoint.07.binary source.07.binary)
elseif(${test} MATCHES "test_particle_restart_eigval")
set(RESTART_FILE particle_12_842.binary)
elseif(${test} MATCHES "test_particle_restart_fixed")
set(RESTART_FILE particle_7_6144.binary)
else(${test} MATCHES "test_statepoint_restart")
message(FATAL_ERROR "Restart test ${test} not recognized")
endif(${test} MATCHES "test_statepoint_restart")
endif(${HDF5_ENABLED})
# Perform serial valgrind and coverage test
add_test(NAME ${TEST_NAME}
WORKING_DIRECTORY ${TEST_PATH}
COMMAND $<TARGET_FILE:openmc> ${TEST_PATH})
# Perform serial valgrind and coverage restart test
add_test(NAME ${TEST_NAME}_restart
WORKING_DIRECTORY ${TEST_PATH}
COMMAND $<TARGET_FILE:openmc> -r ${RESTART_FILE} ${TEST_PATH})
# Set test dependency
set_tests_properties(${TEST_NAME}_restart PROPERTIES DEPENDS ${TEST_NAME})
# Handle standard tests for valgrind and gcov
else(${test} MATCHES "test_plot")
# Perform serial valgrind and coverage test
add_test(NAME ${TEST_NAME}
WORKING_DIRECTORY ${TEST_PATH}
COMMAND $<TARGET_FILE:openmc> ${TEST_PATH})
endif(${test} MATCHES "test_plot")
endif(NOT ${MEM_CHECK} AND NOT ${COVERAGE})
endforeach(test)

25
src/CTestConfig.cmake Normal file
View file

@ -0,0 +1,25 @@
## This file should be placed in the root directory of your project.
## Then modify the CMakeLists.txt file in the root directory of your
## project to incorporate the testing dashboard.
## # The following are required to uses Dart and the Cdash dashboard
## ENABLE_TESTING()
## INCLUDE(CTest)
# Generic information about CDASH site
set(CTEST_PROJECT_NAME "OpenMC")
set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC")
set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "openmc.mit.edu")
set(CTEST_DROP_LOCATION "/cdash/submit.php?project=OpenMC")
set(CTEST_DROP_SITE_CDASH TRUE)
# Set file size larger to see more output
set(CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE "20000")
set(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE "20000")
# User/password to CDASH site
# Please contact Nick Horelik <nhorelik@mit.edu> or
# Bryan Herman <bherman@mit.edu> if you want to push
# test suite information to our CDASH site.
set(CTEST_DROP_SITE_USER "")
set(CTEST_DROP_SITE_PASSWORD "")

View file

@ -6,7 +6,9 @@ clean:
make -s -C build clean
distclean:
rm -fr build
test:
make -s -C build test
install:
make -s -C build install
.PHONY: all clean distclean install
.PHONY: all clean distclean test install

View file

@ -3,10 +3,11 @@ module ace
use ace_header, only: Nuclide, Reaction, SAlphaBeta, XsListing, &
DistEnergy
use constants
use endf, only: reaction_name
use endf, only: reaction_name, is_fission, is_disappearance
use error, only: fatal_error, warning
use fission, only: nu_total
use global
use list_header, only: ListElemInt, ListInt
use material_header, only: Material
use output, only: write_message
use set_header, only: SetChar
@ -609,6 +610,7 @@ contains
integer :: IE ! reaction's starting index on energy grid
integer :: NE ! number of energies for reaction
type(Reaction), pointer :: rxn => null()
type(ListInt) :: MTs
LMT = JXS(3)
JXS4 = JXS(4)
@ -657,6 +659,20 @@ contains
rxn % multiplicity = abs(nint(XSS(JXS5 + i - 1)))
rxn % scatter_in_cm = (nint(XSS(JXS5 + i - 1)) < 0)
! If multiplicity is energy-dependent (absolute value > 100), set it based
! on the MT value
if (rxn % multiplicity > 100) then
if (any(rxn%MT == [11, 16, 24, 30, 41])) then
rxn % multiplicity = 2
elseif (any(rxn%MT == [17, 25, 42])) then
rxn % multiplicity = 3
elseif (rxn%MT == 37) then
rxn % multiplicity = 4
else
rxn % multiplicity = 1
end if
end if
! read starting energy index
LOCA = int(XSS(LXS + i - 1))
IE = int(XSS(JXS7 + LOCA - 1))
@ -667,17 +683,37 @@ contains
allocate(rxn % sigma(NE))
XSS_index = JXS7 + LOCA + 1
rxn % sigma = get_real(NE)
end do
! Skip redundant reactions -- this includes total inelastic level
! scattering, gas production cross sections (MT=200+), and (n,p), (n,d),
! etc. reactions leaving the nucleus in an excited state
if (rxn % MT == N_LEVEL .or. rxn % MT > N_DA) cycle
! Create set of MT values
do i = 1, size(nuc % reactions)
call MTs % append(nuc % reactions(i) % MT)
end do
! Create total, absorption, and fission cross sections
do i = 2, size(nuc % reactions)
rxn => nuc % reactions(i)
IE = rxn % threshold
NE = size(rxn % sigma)
! Skip total inelastic level scattering, gas production cross sections
! (MT=200+), etc.
if (rxn % MT == N_LEVEL) cycle
if (rxn % MT > N_5N2P .and. rxn % MT < N_P0) cycle
! Skip level cross sections if total is available
if (rxn % MT >= N_P0 .and. rxn % MT <= N_PC .and. MTs % contains(N_P)) cycle
if (rxn % MT >= N_D0 .and. rxn % MT <= N_DC .and. MTs % contains(N_D)) cycle
if (rxn % MT >= N_T0 .and. rxn % MT <= N_TC .and. MTs % contains(N_T)) cycle
if (rxn % MT >= N_3HE0 .and. rxn % MT <= N_3HEC .and. MTs % contains(N_3HE)) cycle
if (rxn % MT >= N_A0 .and. rxn % MT <= N_AC .and. MTs % contains(N_A)) cycle
if (rxn % MT >= N_2N0 .and. rxn % MT <= N_2NC .and. MTs % contains(N_2N)) cycle
! Add contribution to total cross section
nuc % total(IE:IE+NE-1) = nuc % total(IE:IE+NE-1) + rxn % sigma
! Add contribution to absorption cross section
if (rxn % MT >= N_GAMMA .and. rxn % MT <= N_DA) then
if (is_disappearance(rxn % MT)) then
nuc % absorption(IE:IE+NE-1) = nuc % absorption(IE:IE+NE-1) + rxn % sigma
end if
@ -690,8 +726,7 @@ contains
end if
! Add contribution to fission cross section
if (rxn % MT == N_FISSION .or. rxn % MT == N_F .or. rxn % MT == N_NF &
.or. rxn % MT == N_2NF .or. rxn % MT == N_3NF) then
if (is_fission(rxn % MT)) then
nuc % fissionable = .true.
nuc % fission(IE:IE+NE-1) = nuc % fission(IE:IE+NE-1) + rxn % sigma
@ -704,11 +739,14 @@ contains
! Keep track of this reaction for easy searching later
i_fission = i_fission + 1
nuc % index_fission(i_fission) = i + 1
nuc % index_fission(i_fission) = i
nuc % n_fission = nuc % n_fission + 1
end if
end do
! Clear MTs set
call MTs % clear()
end subroutine read_reactions
!===============================================================================
@ -789,14 +827,19 @@ contains
! read angular distribution -- currently this does not actually parse the
! angular distribution tables for each incoming energy, that must be done
! on-the-fly
LC = rxn % adist % location(1)
XSS_index = JXS9 + abs(LC) - 1
XSS_index = JXS9 + LOCB + 2 * NE
rxn % adist % data = get_real(length)
! change location pointers since they are currently relative to JXS(9)
LC = abs(rxn % adist % location(1))
rxn % adist % location = abs(rxn % adist % location) - LC
LC = LOCB + 2 * NE + 1
do j = 1, NE
! For consistency, leave location as 0 if type is isotropic.
! This is not necessary for current correctness, but can avoid
! future issues
if (rxn % adist % location(j) /= 0) then
rxn % adist % location(j) = abs(rxn % adist % location(j)) - LC
end if
end do
end do
end subroutine read_angular_dist
@ -967,24 +1010,23 @@ contains
! Continuous tabular distribution
NR = int(XSS(lc + 1))
NE = int(XSS(lc + 2 + 2*NR))
! Before progressing, check to see if data set uses L(I) values
! in a way inconsistent with the current form of the ACE Format Guide
! (MCNP5 Manual, Vol 3)
allocate(L(NE))
L = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1))
do i = 1,NE
! Now check to see if L(i) is equal to any other entries
! If so, then we must exit
if (count(L == L(i)) > 1) then
message = "Invalid usage of L(I) in ACE data; &
&Consider using more recent data set."
call fatal_error()
end if
end do
deallocate(L)
! Continue with finding data length
length = length + 2 + 2*NR + 2*NE
do i = 1,NE
! Some older data sets use the same LDAT for multiple Ein tables.
! If this is the case, we should skip incrementing length when it is
! not needed.
if (i < NE) then
if (any(L(i) == L(i + 1: NE))) then
! adjust location for this block
j = lc + 2 + 2*NR + NE + i
XSS(j) = XSS(j) - LOCC - lid
cycle
end if
end if
! determine length
NP = int(XSS(lc + length + 2))
length = length + 2 + 3*NP
@ -993,6 +1035,7 @@ contains
j = lc + 2 + 2*NR + NE + i
XSS(j) = XSS(j) - LOCC - lid
end do
deallocate(L)
case (5)
! General evaporation spectrum
@ -1025,24 +1068,23 @@ contains
! Kalbach-Mann correlated scattering
NR = int(XSS(lc + 1))
NE = int(XSS(lc + 2 + 2*NR))
! Before progressing, check to see if data set uses L(I) values
! in a way inconsistent with the current form of the ACE Format Guide
! (MCNP5 Manual, Vol 3)
allocate(L(NE))
L = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1))
do i = 1,NE
! Now check to see if L(i) is equal to any other entries
! If so, then we must exit
if (count(L == L(i)) > 1) then
message = "Invalid usage of L(I) in ACE data; &
&Consider using more recent data set."
call fatal_error()
end if
end do
deallocate(L)
! Continue with finding data length
length = length + 2 + 2*NR + 2*NE
do i = 1,NE
! Some older data sets use the same LDAT for multiple Ein tables.
! If this is the case, we should skip incrementing length when it is
! not needed.
if (i < NE) then
if (any(L(i) == L(i + 1: NE))) then
! adjust location for this block
j = lc + 2 + 2*NR + NE + i
XSS(j) = XSS(j) - LOCC - lid
cycle
end if
end if
NP = int(XSS(lc + length + 2))
length = length + 2 + 5*NP
@ -1050,29 +1092,30 @@ contains
j = lc + 2 + 2*NR + NE + i
XSS(j) = XSS(j) - LOCC - lid
end do
deallocate(L)
case (61)
! Correlated energy and angle distribution
NR = int(XSS(lc + 1))
NE = int(XSS(lc + 2 + 2*NR))
! Before progressing, check to see if data set uses L(I) values
! in a way inconsistent with the current form of the ACE Format Guide
! (MCNP5 Manual, Vol 3)
allocate(L(NE))
L = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1))
do i = 1,NE
! Now check to see if L(i) is equal to any other entries
! If so, then we must exit
if (count(L == L(i)) > 1) then
message = "Invalid usage of L(I) in ACE data; &
&Consider using more recent data set."
call fatal_error()
end if
end do
deallocate(L)
! Continue with finding data length
length = length + 2 + 2*NR + 2*NE
do i = 1,NE
! Some older data sets use the same LDAT for multiple Ein tables.
! If this is the case, we should skip incrementing length when it is
! not needed.
if (i < NE) then
if (any(L(i) == L(i + 1: NE))) then
! adjust locators for energy distribution
j = lc + 2 + 2*NR + NE + i
XSS(j) = XSS(j) - LOCC - lid
cycle
end if
end if
! outgoing energy distribution
NP = int(XSS(lc + length + 2))
@ -1094,7 +1137,7 @@ contains
j = lc + 2 + 2*NR + NE + i
XSS(j) = XSS(j) - LOCC - lid
end do
deallocate(L)
case (66)
! N-body phase space distribution
length = 2
@ -1108,15 +1151,7 @@ contains
! (MCNP5 Manual, Vol 3)
allocate(L(NE))
L = int(XSS(lc + 3 + 2*NR + NE: lc + 3 + 2*NR + 2*NE - 1))
do i = 1,NE
! Now check to see if L(i) is equal to any other entries
! If so, then we must exit
if (count(L == L(i)) > 1) then
message = "Invalid usage of L(I) in ACE data; &
&Consider using more recent data set."
call fatal_error()
end if
end do
! Don't currently do anything with L
deallocate(L)
! Continue with finding data length
NMU = int(XSS(lc + 4 + 2*NR + 2*NE))
@ -1330,7 +1365,7 @@ contains
! Now we can fill the inelastic_data(i) attributes
do i = 1, NE_in
XSS_index = LOCC(i)
XSS_index = int(LOCC(i))
NE_out = table % inelastic_data(i) % n_e_out
do j = 1, NE_out
table % inelastic_data(i) % e_out(j) = XSS(XSS_index + 1)
@ -1417,4 +1452,31 @@ contains
end function get_real
!===============================================================================
! SAME_NUCLIDE_LIST creates a linked list for each nuclide containing the
! indices in the nuclides array of all other instances of that nuclide. For
! example, the same nuclide may exist at multiple temperatures resulting
! in multiple entries in the nuclides array for a single zaid number.
!===============================================================================
subroutine same_nuclide_list()
integer :: i ! index in nuclides array
integer :: j ! index in nuclides array
type(ListElemInt), pointer :: nuc_list => null() ! pointer to nuclide list
do i = 1, n_nuclides_total
allocate(nuclides(i) % nuc_list)
nuc_list => nuclides(i) % nuc_list
do j = 1, n_nuclides_total
if (nuclides(i) % zaid == nuclides(j) % zaid) then
nuc_list % data = j
allocate(nuc_list % next)
nuc_list => nuc_list % next
end if
end do
end do
end subroutine same_nuclide_list
end module ace

View file

@ -2,6 +2,7 @@ module ace_header
use constants, only: MAX_FILE_LEN
use endf_header, only: Tab1
use list_header, only: ListElemInt
implicit none
@ -95,6 +96,9 @@ module ace_header
real(8) :: awr ! weight of nucleus in neutron masses
real(8) :: kT ! temperature in MeV (k*T)
! Linked list of indices in nuclides array of instances of this same nuclide
type(ListElemInt), pointer :: nuc_list => null()
! Energy grid information
integer :: n_grid ! # of nuclide grid points
integer, allocatable :: grid_index(:) ! pointers to union grid
@ -241,6 +245,7 @@ module ace_header
! Information for URR probability table use
logical :: use_ptable ! in URR range with probability tables?
real(8) :: last_prn
end type NuclideMicroXS
!===============================================================================
@ -337,26 +342,18 @@ module ace_header
integer :: i ! Loop counter
if (allocated(this % grid_index)) &
deallocate(this % grid_index)
if (allocated(this % grid_index)) deallocate(this % grid_index)
if (allocated(this % energy)) &
deallocate(this % total, this % elastic, this % fission, &
this % nu_fission, this % absorption)
if (allocated(this % heating)) &
deallocate(this % heating)
deallocate(this % energy, this % total, this % elastic, &
this % fission, this % nu_fission, this % absorption)
if (allocated(this % heating)) deallocate(this % heating)
if (allocated(this % index_fission)) &
deallocate(this % index_fission)
if (allocated(this % index_fission)) deallocate(this % index_fission)
if (allocated(this % nu_t_data)) &
deallocate(this % nu_t_data)
if (allocated(this % nu_p_data)) &
deallocate(this % nu_p_data)
if (allocated(this % nu_d_data)) &
deallocate(this % nu_d_data)
if (allocated(this % nu_t_data)) deallocate(this % nu_t_data)
if (allocated(this % nu_p_data)) deallocate(this % nu_p_data)
if (allocated(this % nu_d_data)) deallocate(this % nu_d_data)
if (allocated(this % nu_d_precursor_data)) &
deallocate(this % nu_d_precursor_data)

View file

@ -800,7 +800,7 @@ contains
!===============================================================================
! FIX_NEUTRON_BALANCE is a method to adjust parameters to have perfect balance
!===============================================================================
#ifdef DEVELOPMENTAL
subroutine fix_neutron_balance()
use constants, only: ONE, ZERO, CMFD_NOACCEL
@ -926,6 +926,7 @@ contains
end do ZLOOP
end subroutine fix_neutron_balance
#endif
!===============================================================================
! COMPUTE_EFFECTIVE_DOWNSCATTER changes downscatter rate for zero upscatter

View file

@ -194,6 +194,7 @@ contains
if (allocated(this % dom)) deallocate(this % dom)
if (allocated(this % k_cmfd)) deallocate(this % k_cmfd)
if (allocated(this % entropy)) deallocate(this % entropy)
if (allocated(this % resnb)) deallocate(this % resnb)
end subroutine deallocate_cmfd

View file

@ -8,7 +8,7 @@ module cmfd_input
implicit none
private
public :: configure_cmfd
public :: configure_cmfd
contains
@ -20,9 +20,6 @@ contains
use cmfd_header, only: allocate_cmfd
#ifdef PETSC
integer :: new_comm ! new mpi communicator
#endif
integer :: color ! color group of processor
! Read in cmfd input file
@ -37,12 +34,10 @@ contains
! Split up procs
#ifdef PETSC
call MPI_COMM_SPLIT(MPI_COMM_WORLD, color, 0, new_comm, mpi_err)
#endif
call MPI_COMM_SPLIT(MPI_COMM_WORLD, color, 0, cmfd_comm, mpi_err)
! assign to PETSc
#ifdef PETSC
PETSC_COMM_WORLD = new_comm
PETSC_COMM_WORLD = cmfd_comm
! Initialize PETSc on all procs
call PetscInitialize(PETSC_NULL_CHARACTER, mpi_err)
@ -124,7 +119,7 @@ contains
cmfd % egrid = (/0.0_8,20.0_8/)
cmfd % indices(4) = 1 ! one energy group
end if
! Set global albedo
if (check_for_node(node_mesh, "albedo")) then
call get_node_array(node_mesh, "albedo", cmfd % albedo)
@ -139,7 +134,7 @@ contains
if (get_arraysize_integer(node_mesh, "map") /= &
product(cmfd % indices(1:3))) then
message = 'FATAL==>CMFD coremap not to correct dimensions'
call fatal_error()
call fatal_error()
end if
allocate(iarray(get_arraysize_integer(node_mesh, "map")))
call get_node_array(node_mesh, "map", iarray)
@ -211,7 +206,7 @@ contains
! Batch to begin cmfd
if (check_for_node(doc, "begin")) &
call get_node_value(doc, "begin", cmfd_begin)
call get_node_value(doc, "begin", cmfd_begin)
! Tally during inactive batches
if (check_for_node(doc, "inactive")) then
@ -307,7 +302,7 @@ contains
m => meshes(n_user_meshes+1)
! Set mesh id
m % id = n_user_meshes + 1
m % id = n_user_meshes + 1
! Set mesh type to rectangular
m % type = LATTICE_RECT
@ -441,7 +436,7 @@ contains
if (check_for_node(node_mesh, "energy")) then
n_filters = n_filters + 1
filters(n_filters) % type = FILTER_ENERGYIN
ng = get_arraysize_double(node_mesh, "energy")
ng = get_arraysize_double(node_mesh, "energy")
filters(n_filters) % n_bins = ng - 1
allocate(filters(n_filters) % real_bins(ng))
call get_node_array(node_mesh, "energy", &
@ -473,20 +468,20 @@ contains
allocate(t % filters(n_filters))
t % filters = filters(1:n_filters)
! Allocate scoring bins
! Allocate scoring bins
allocate(t % score_bins(3))
t % n_score_bins = 3
t % n_user_score_bins = 3
! Allocate scattering order data
allocate(t % scatt_order(3))
t % scatt_order = 0
allocate(t % moment_order(3))
t % moment_order = 0
! Set macro_bins
t % score_bins(1) = SCORE_FLUX
t % score_bins(2) = SCORE_TOTAL
t % score_bins(3) = SCORE_SCATTER_N
t % scatt_order(3) = 1
t % moment_order(3) = 1
else if (i == 2) then
@ -526,8 +521,8 @@ contains
t % n_user_score_bins = 2
! Allocate scattering order data
allocate(t % scatt_order(2))
t % scatt_order = 0
allocate(t % moment_order(2))
t % moment_order = 0
! Set macro_bins
t % score_bins(1) = SCORE_NU_SCATTER
@ -569,8 +564,8 @@ contains
t % n_user_score_bins = 1
! Allocate scattering order data
allocate(t % scatt_order(1))
t % scatt_order = 0
allocate(t % moment_order(1))
t % moment_order = 0
! Set macro bins
t % score_bins(1) = SCORE_CURRENT

View file

@ -16,7 +16,9 @@ module cmfd_jfnk_solver
type(Matrix) :: jac_prec ! Jacobian preconditioner object
type(Matrix) :: loss ! CMFD loss matrix
type(Matrix) :: prod ! CMFD production matrix
#ifdef PETSC
type(JFNKSolver) :: jfnk ! JFNK solver object
#endif
type(Vector) :: resvec ! JFNK residual vector
type(Vector) :: xvec ! JFNK solution vector
@ -51,9 +53,9 @@ contains
#endif
! Set up residual and jacobian routines
#ifdef PETSC
jfnk_data % res_proc_ptr => compute_nonlinear_residual
jfnk_data % jac_proc_ptr => build_jacobian_matrix
#ifdef PETSC
call jfnk % set_functions(jfnk_data, resvec, jac_prec)
#endif
@ -104,8 +106,10 @@ contains
! Assemble matrices and use PETSc
call loss % assemble()
call prod % assemble()
#ifdef PETSC
call loss % setup_petsc()
call prod % setup_petsc()
#endif
! Check for mathematical adjoint
if (adjoint_calc .and. trim(cmfd_adjoint_type) == 'math') &
@ -133,14 +137,18 @@ contains
end if
! Set up vectors for PETSc
#ifdef PETSC
call resvec % setup_petsc()
call xvec % setup_petsc()
#endif
! Build jacobian from initial guess
call build_jacobian_matrix(xvec)
! Set up Jacobian for PETSc
#ifdef PETSC
call jac_prec % setup_petsc()
#endif
! Set dominance ratio to 0
cmfd % dom(current_batch) = ZERO
@ -262,7 +270,7 @@ contains
!===============================================================================
! COMPUTE_NONLINEAR_RESIDUAL computes the residual of the nonlinear equations
!===============================================================================
#ifdef PETSC
subroutine compute_nonlinear_residual(x, res)
use global, only: cmfd_write_matrices
@ -310,7 +318,9 @@ contains
else
filename = 'res.bin'
end if
#ifdef PETSC
call res % write_petsc_binary(filename)
#endif
! Write out solution vector
if (adjoint_calc) then
@ -318,11 +328,14 @@ contains
else
filename = 'x.bin'
end if
#ifdef PETSC
call x % write_petsc_binary(filename)
#endif
end if
end subroutine compute_nonlinear_residual
#endif
!===============================================================================
! COMPUTE_ADJOINT calculates mathematical adjoint by taking transposes
@ -333,13 +346,17 @@ contains
use global, only: cmfd_write_matrices
! Transpose matrices
#ifdef PETSC
call loss % transpose()
call prod % transpose()
#endif
! Write out matrix in binary file (debugging)
if (cmfd_write_matrices) then
#ifdef PETSC
call loss % write_petsc_binary('adj_lossmat.bin')
call loss % write_petsc_binary('adj_prodmat.bin')
#endif
end if
end subroutine compute_adjoint

View file

@ -29,7 +29,9 @@ module cmfd_power_solver
type(Vector) :: s_n ! new source vector
type(Vector) :: s_o ! old flux vector
type(Vector) :: serr_v ! error in source
#ifdef PETSC
type(GMRESSolver) :: gmres ! gmres solver
#endif
contains
@ -169,13 +171,17 @@ contains
use global, only: cmfd_write_matrices
! Transpose matrices
#ifdef PETSC
call loss % transpose()
call prod % transpose()
#endif
! Write out matrix in binary file (debugging)
if (cmfd_write_matrices) then
#ifdef PETSC
call loss % write_petsc_binary('adj_lossmat.bin')
call prod % write_petsc_binary('adj_prodmat.bin')
#endif
end if
end subroutine compute_adjoint
@ -320,7 +326,9 @@ contains
else
filename = 'fluxvec.bin'
end if
#ifdef PETSC
call phi_n % write_petsc_binary(filename)
#endif
end if
end subroutine extract_results

View file

@ -7,11 +7,11 @@ module constants
! OpenMC major, minor, and release numbers
integer, parameter :: VERSION_MAJOR = 0
integer, parameter :: VERSION_MINOR = 5
integer, parameter :: VERSION_RELEASE = 4
integer, parameter :: VERSION_MINOR = 6
integer, parameter :: VERSION_RELEASE = 0
! Revision numbers for binary files
integer, parameter :: REVISION_STATEPOINT = 11
integer, parameter :: REVISION_STATEPOINT = 12
integer, parameter :: REVISION_PARTICLE_RESTART = 1
! Binary file types
@ -166,54 +166,28 @@ module constants
! Reaction types
integer, parameter :: &
TOTAL_XS = 1, &
ELASTIC = 2, &
N_LEVEL = 4, &
MISC = 5, &
N_2ND = 11, &
N_2N = 16, &
N_3N = 17, &
N_FISSION = 18, &
N_F = 19, &
N_NF = 20, &
N_2NF = 21, &
N_NA = 22, &
N_N3A = 23, &
N_2NA = 24, &
N_3NA = 25, &
N_NP = 28, &
N_N2A = 29, &
N_2N2A = 30, &
N_ND = 32, &
N_NT = 33, &
N_N3HE = 34, &
N_ND2A = 35, &
N_NT2A = 36, &
N_4N = 37, &
N_3NF = 38, &
N_2NP = 41, &
N_3NP = 42, &
N_N2P = 44, &
N_NPA = 45, &
N_N1 = 51, &
N_N40 = 90, &
N_NC = 91, &
N_DISAPPEAR = 101, &
N_GAMMA = 102, &
N_P = 103, &
N_D = 104, &
N_T = 105, &
N_3HE = 106, &
N_A = 107, &
N_2A = 108, &
N_3A = 109, &
N_2P = 111, &
N_PA = 112, &
N_T2A = 113, &
N_D2A = 114, &
N_PD = 115, &
N_PT = 116, &
N_DA = 117
TOTAL_XS = 1, ELASTIC = 2, N_LEVEL = 4, MISC = 5, N_2ND = 11, &
N_2N = 16, N_3N = 17, N_FISSION = 18, N_F = 19, N_NF = 20, &
N_2NF = 21, N_NA = 22, N_N3A = 23, N_2NA = 24, N_3NA = 25, &
N_NP = 28, N_N2A = 29, N_2N2A = 30, N_ND = 32, N_NT = 33, &
N_N3HE = 34, N_ND2A = 35, N_NT2A = 36, N_4N = 37, N_3NF = 38, &
N_2NP = 41, N_3NP = 42, N_N2P = 44, N_NPA = 45, N_N1 = 51, &
N_N40 = 90, N_NC = 91, N_DISAPPEAR = 101, N_GAMMA = 102, N_P = 103, &
N_D = 104, N_T = 105, N_3HE = 106, N_A = 107, N_2A = 108, &
N_3A = 109, N_2P = 111, N_PA = 112, N_T2A = 113, N_D2A = 114, &
N_PD = 115, N_PT = 116, N_DA = 117, N_5N = 152, N_6N = 153, &
N_2NT = 154, N_TA = 155, N_4NP = 156, N_3ND = 157, N_NDA = 158, &
N_2NPA = 159, N_7N = 160, N_8N = 161, N_5NP = 162, N_6NP = 163, &
N_7NP = 164, N_4NA = 165, N_5NA = 166, N_6NA = 167, N_7NA = 168, &
N_4ND = 169, N_5ND = 170, N_6ND = 171, N_3NT = 172, N_4NT = 173, &
N_5NT = 174, N_6NT = 175, N_2N3HE = 176, N_3N3HE = 177, N_4N3HE = 178, &
N_3N2P = 179, N_3N3A = 180, N_3NPA = 181, N_DT = 182, N_NPD = 183, &
N_NPT = 184, N_NDT = 185, N_NP3HE = 186, N_ND3HE = 187, N_NT3HE = 188, &
N_NTA = 189, N_2N2P = 190, N_P3HE = 191, N_D3HE = 192, N_3HEA = 193, &
N_4N2P = 194, N_4N2A = 195, N_4NPA = 196, N_3P = 197, N_N3P = 198, &
N_3N2PA = 199, N_5N2P = 200, N_P0 = 600, N_PC = 649, N_D0 = 650, &
N_DC = 699, N_T0 = 700, N_TC = 749, N_3HE0 = 750, N_3HEC = 799, &
N_A0 = 800, N_AC = 849, N_2N0 = 875, N_2NC = 891
! ACE table types
integer, parameter :: &
@ -244,6 +218,17 @@ module constants
! Maximum number of partial fission reactions
integer, parameter :: PARTIAL_FISSION_MAX = 4
! Major cross section libraries
integer, parameter :: &
ENDF_BVII0 = 1, &
ENDF_BVII1 = 2, &
JEFF_311 = 3, &
JEFF_312 = 4, &
JEFF_32 = 5, &
JENDL_32 = 6, &
JENDL_33 = 7, &
JENDL_40 = 8
! ============================================================================
! TALLY-RELATED CONSTANTS
@ -265,7 +250,7 @@ module constants
EVENT_ABSORB = 2
! Tally score type
integer, parameter :: N_SCORE_TYPES = 14
integer, parameter :: N_SCORE_TYPES = 20
integer, parameter :: &
SCORE_FLUX = -1, & ! flux
SCORE_TOTAL = -2, & ! total reaction rate
@ -273,18 +258,37 @@ module constants
SCORE_NU_SCATTER = -4, & ! scattering production rate
SCORE_SCATTER_N = -5, & ! arbitrary scattering moment
SCORE_SCATTER_PN = -6, & ! system for scoring 0th through nth moment
SCORE_TRANSPORT = -7, & ! transport reaction rate
SCORE_N_1N = -8, & ! (n,1n) rate
SCORE_ABSORPTION = -9, & ! absorption rate
SCORE_FISSION = -10, & ! fission rate
SCORE_NU_FISSION = -11, & ! neutron production rate
SCORE_KAPPA_FISSION = -12, & ! fission energy production rate
SCORE_CURRENT = -13, & ! partial current
SCORE_EVENTS = -14 ! number of events
SCORE_NU_SCATTER_N = -7, & ! arbitrary nu-scattering moment
SCORE_NU_SCATTER_PN = -8, & ! system for scoring 0th through nth nu-scatter moment
SCORE_TRANSPORT = -9, & ! transport reaction rate
SCORE_N_1N = -10, & ! (n,1n) rate
SCORE_ABSORPTION = -11, & ! absorption rate
SCORE_FISSION = -12, & ! fission rate
SCORE_NU_FISSION = -13, & ! neutron production rate
SCORE_KAPPA_FISSION = -14, & ! fission energy production rate
SCORE_CURRENT = -15, & ! partial current
SCORE_FLUX_YN = -16, & ! angular moment of flux
SCORE_TOTAL_YN = -17, & ! angular moment of total reaction rate
SCORE_SCATTER_YN = -18, & ! angular flux-weighted scattering moment (0:N)
SCORE_NU_SCATTER_YN = -19, & ! angular flux-weighted nu-scattering moment (0:N)
SCORE_EVENTS = -20 ! number of events
! Maximum scattering order supported
integer, parameter :: SCATT_ORDER_MAX = 10
character(len=*), parameter :: SCATT_ORDER_MAX_PNSTR = "scatter-p10"
integer, parameter :: MAX_ANG_ORDER = 10
! Names of *-PN & *-YN scores (MOMENT_STRS) and *-N moment scores
character(*), parameter :: &
MOMENT_STRS(6) = (/ "scatter-p ", &
"nu-scatter-p", &
"flux-y ", &
"total-y ", &
"scatter-y ", &
"nu-scatter-y"/), &
MOMENT_N_STRS(2) = (/ "scatter- ", &
"nu-scatter- "/)
! Location in MOMENT_STRS where the YN data begins
integer, parameter :: YN_LOC = 3
! Tally map bin finding
integer, parameter :: NO_BIN_FOUND = -1
@ -318,6 +322,14 @@ module constants
K_TRACKLENGTH = 3, &
LEAKAGE = 4
! ============================================================================
! RANDOM NUMBER STREAM CONSTANTS
integer, parameter :: N_STREAMS = 3
integer, parameter :: STREAM_TRACKING = 1
integer, parameter :: STREAM_TALLIES = 2
integer, parameter :: STREAM_SOURCE = 3
! ============================================================================
! EXTERNAL SOURCE PARAMETERS

View file

@ -5,6 +5,7 @@ module cross_section
use error, only: fatal_error
use fission, only: nu_total
use global
use list_header, only: ListElemInt
use material_header, only: Material
use particle_header, only: Particle
use random_lcg, only: prn
@ -184,6 +185,8 @@ contains
! Initialize sab treatment to false
micro_xs(i_nuclide) % index_sab = NONE
micro_xs(i_nuclide) % elastic_sab = ZERO
! Initialize URR probability table treatment to false
micro_xs(i_nuclide) % use_ptable = .false.
! Initialize nuclide cross-sections to zero
@ -340,17 +343,20 @@ contains
real(8), intent(in) :: E ! energy
integer :: i_energy ! index for energy
integer :: i_table ! index for table
integer :: i_low ! band index at lower bounding energy
integer :: i_up ! band index at upper bounding energy
real(8) :: f ! interpolation factor
real(8) :: r ! pseudo-random number
real(8) :: elastic ! elastic cross section
real(8) :: capture ! (n,gamma) cross section
real(8) :: fission ! fission cross section
real(8) :: inelastic ! inelastic cross section
type(UrrData), pointer, save :: urr => null()
type(Nuclide), pointer, save :: nuc => null()
type(Reaction), pointer, save :: rxn => null()
!$omp threadprivate(urr, nuc, rxn)
logical :: same_nuc ! do we know the xs for this nuclide at this energy?
type(UrrData), pointer, save :: urr => null()
type(Nuclide), pointer, save :: nuc => null()
type(Reaction), pointer, save :: rxn => null()
type(ListElemInt), pointer :: nuc_list => null()
!$omp threadprivate(urr, nuc, rxn, nuc_list)
micro_xs(i_nuclide) % use_ptable = .true.
@ -370,22 +376,48 @@ contains
(urr % energy(i_energy + 1) - urr % energy(i_energy))
! sample probability table using the cumulative distribution
r = prn()
i_table = 1
! if we're dealing with a nuclide that we've previously encountered at
! this energy but a different temperature, use the original random number to
! preserve correlation of temperature in probability tables
same_nuc = .false.
nuc_list => nuc % nuc_list
do
if (urr % prob(i_energy, URR_CUM_PROB, i_table) > r) exit
i_table = i_table + 1
if (E /= ZERO .and. E == micro_xs(nuc_list % data) % last_E) then
same_nuc = .true.
exit
end if
nuc_list => nuc_list % next
if (.not. associated(nuc_list % next)) exit
end do
if (same_nuc) then
r = micro_xs(nuc_list % data) % last_prn
else
r = prn()
micro_xs(i_nuclide) % last_prn = r
end if
i_low = 1
do
if (urr % prob(i_energy, URR_CUM_PROB, i_low) > r) exit
i_low = i_low + 1
end do
i_up = 1
do
if (urr % prob(i_energy + 1, URR_CUM_PROB, i_up) > r) exit
i_up = i_up + 1
end do
! determine elastic, fission, and capture cross sections from probability
! table
if (urr % interp == LINEAR_LINEAR) then
elastic = (ONE - f) * urr % prob(i_energy, URR_ELASTIC, i_table) + &
f * urr % prob(i_energy + 1, URR_ELASTIC, i_table)
fission = (ONE - f) * urr % prob(i_energy, URR_FISSION, i_table) + &
f * urr % prob(i_energy + 1, URR_FISSION, i_table)
capture = (ONE - f) * urr % prob(i_energy, URR_N_GAMMA, i_table) + &
f * urr % prob(i_energy + 1, URR_N_GAMMA, i_table)
elastic = (ONE - f) * urr % prob(i_energy, URR_ELASTIC, i_low) + &
f * urr % prob(i_energy + 1, URR_ELASTIC, i_up)
fission = (ONE - f) * urr % prob(i_energy, URR_FISSION, i_low) + &
f * urr % prob(i_energy + 1, URR_FISSION, i_up)
capture = (ONE - f) * urr % prob(i_energy, URR_N_GAMMA, i_low) + &
f * urr % prob(i_energy + 1, URR_N_GAMMA, i_up)
elseif (urr % interp == LOG_LOG) then
! Get logarithmic interpolation factor
f = log(E / urr % energy(i_energy)) / &
@ -393,26 +425,29 @@ contains
! Calculate elastic cross section/factor
elastic = ZERO
if (urr % prob(i_energy, URR_ELASTIC, i_table) > ZERO) then
if (urr % prob(i_energy, URR_ELASTIC, i_low) > ZERO .and. &
urr % prob(i_energy + 1, URR_ELASTIC, i_up) > ZERO) then
elastic = exp((ONE - f) * log(urr % prob(i_energy, URR_ELASTIC, &
i_table)) + f * log(urr % prob(i_energy + 1, URR_ELASTIC, &
i_table)))
i_low)) + f * log(urr % prob(i_energy + 1, URR_ELASTIC, &
i_up)))
end if
! Calculate fission cross section/factor
fission = ZERO
if (urr % prob(i_energy, URR_FISSION, i_table) > ZERO) then
if (urr % prob(i_energy, URR_FISSION, i_low) > ZERO .and. &
urr % prob(i_energy + 1, URR_FISSION, i_up) > ZERO) then
fission = exp((ONE - f) * log(urr % prob(i_energy, URR_FISSION, &
i_table)) + f * log(urr % prob(i_energy + 1, URR_FISSION, &
i_table)))
i_low)) + f * log(urr % prob(i_energy + 1, URR_FISSION, &
i_up)))
end if
! Calculate capture cross section/factor
capture = ZERO
if (urr % prob(i_energy, URR_N_GAMMA, i_table) > ZERO) then
if (urr % prob(i_energy, URR_N_GAMMA, i_low) > ZERO .and. &
urr % prob(i_energy + 1, URR_N_GAMMA, i_up) > ZERO) then
capture = exp((ONE - f) * log(urr % prob(i_energy, URR_N_GAMMA, &
i_table)) + f * log(urr % prob(i_energy + 1, URR_N_GAMMA, &
i_table)))
i_low)) + f * log(urr % prob(i_energy + 1, URR_N_GAMMA, &
i_up)))
end if
end if

View file

@ -39,7 +39,7 @@ contains
subroutine run_eigenvalue()
type(Particle) :: p
integer :: i_work
integer(8) :: i_work
if (master) call header("K EIGENVALUE SIMULATION", level=1)
@ -256,7 +256,7 @@ contains
& temp_sites(:) ! local array of extra sites on each node
#ifdef MPI
integer :: n ! number of sites to send/recv
integer(8) :: n ! number of sites to send/recv
integer :: neighbor ! processor to send/recv data from
integer :: request(20) ! communication request for send/recving sites
integer :: n_request ! number of communication requests
@ -834,8 +834,8 @@ contains
subroutine join_bank_from_threads()
integer :: total ! total number of fission bank sites
integer :: i ! loop index for threads
integer(8) :: total ! total number of fission bank sites
integer :: i ! loop index for threads
! Initialize the total number of fission bank sites
total = 0

View file

@ -159,7 +159,7 @@ contains
integer, intent(in) :: MT
logical :: fission_event
if (MT == N_FISSION .or. MT == N_F .or. MT == N_NF .or. MT == N_2NF &
if (MT == N_FISSION .or. MT == N_F .or. MT == N_NF .or. MT == N_2NF &
.or. MT == N_3NF) then
fission_event = .true.
else
@ -168,6 +168,28 @@ contains
end function is_fission
!===============================================================================
! IS_DISAPPEARANCE determines if a given MT number is that of a disappearance
! reaction, i.e. a reaction with no neutron in the exit channel
!===============================================================================
function is_disappearance(MT) result(dis)
integer, intent(in) :: MT
logical :: dis
if (MT >= N_GAMMA .and. MT <= N_DA) then
dis = .true.
elseif (MT >= N_P0 .and. MT <= N_AC) then
dis = .true.
elseif (any(MT == [N_TA, N_DT, N_P3HE, N_D3HE, N_3HEA, N_3P])) then
dis = .true.
else
dis = .false.
end if
end function is_disappearance
!===============================================================================
! IS_SCATTER determines if a given MT number is that of a scattering event
!===============================================================================
@ -178,7 +200,7 @@ contains
logical :: scatter_event
if (MT < 100) then
if (MT == N_FISSION .or. MT == N_F .or. MT == N_NF .or. MT == N_2NF &
if (MT == N_FISSION .or. MT == N_F .or. MT == N_NF .or. MT == N_2NF &
.or. MT == N_3NF) then
scatter_event = .false.
else

View file

@ -40,7 +40,10 @@ contains
#ifdef PETSC
! Finalize PETSc
if (cmfd_run) call PetscFinalize(mpi_err)
if (cmfd_run) then
call PetscFinalize(mpi_err)
call MPI_COMM_FREE(cmfd_comm, mpi_err)
end if
#endif
! Stop timers and show timing statistics

View file

@ -11,9 +11,6 @@ module fixed_source
use tally, only: synchronize_tallies, setup_active_usertallies
use tracking, only: transport
type(Bank), pointer :: source_site => null()
!$omp threadprivate(source_site)
contains
subroutine run_fixedsource()

View file

@ -892,7 +892,7 @@ contains
if (on_surface .or. tmp == ZERO) then
d = INFINITY
else
d = -(A*x + B*y + C*w - D)/tmp
d = -(A*x + B*y + C*z - D)/tmp
if (d < ZERO) d = INFINITY
end if

View file

@ -88,6 +88,9 @@ module global
! Default xs identifier (e.g. 70c)
character(3):: default_xs
! What to assume for expanding natural elements
integer :: default_expand = ENDF_BVII1
! ============================================================================
! TALLY-RELATED VARIABLES
@ -253,6 +256,10 @@ module global
! Mode to run in (fixed source, eigenvalue, plotting, etc)
integer :: run_mode = NONE
! Fixed source particle bank
type(Bank), pointer :: source_site => null()
!$omp threadprivate(source_site)
! Restart run
logical :: restart_run = .false.
integer :: restart_batch
@ -266,7 +273,7 @@ module global
character(MAX_FILE_LEN) :: path_output = '' ! Path to output directory
! Message used in message/warning/fatal_error
character(MAX_LINE_LEN) :: message
character(2*MAX_LINE_LEN) :: message
! Random number seed
integer(8) :: seed = 1_8
@ -300,6 +307,9 @@ module global
! Is CMFD active
logical :: cmfd_run = .false.
! CMFD communicator
integer :: cmfd_comm
! Timing objects
type(Timer) :: time_cmfd ! timer for whole cmfd calculation
@ -486,8 +496,29 @@ contains
call sab_dict % clear()
call xs_listing_dict % clear()
! Clear statepoint batch set
! Clear statepoint and sourcepoint batch set
call statepoint_batch % clear()
call sourcepoint_batch % clear()
! Deallocate entropy mesh
if (associated(entropy_mesh)) then
if (allocated(entropy_mesh % lower_left)) &
deallocate(entropy_mesh % lower_left)
if (allocated(entropy_mesh % upper_right)) &
deallocate(entropy_mesh % upper_right)
if (allocated(entropy_mesh % width)) deallocate(entropy_mesh % width)
deallocate(entropy_mesh)
end if
! Deallocate ufs
if (allocated(source_frac)) deallocate(source_frac)
if (associated(ufs_mesh)) then
if (allocated(ufs_mesh % lower_left)) deallocate(ufs_mesh % lower_left)
if (allocated(ufs_mesh % upper_right)) &
deallocate(ufs_mesh % upper_right)
if (allocated(ufs_mesh % width)) deallocate(ufs_mesh % width)
deallocate(ufs_mesh)
end if
end subroutine free_memory

View file

@ -1,6 +1,6 @@
module initialize
use ace, only: read_xs
use ace, only: read_xs, same_nuclide_list
use bank_header, only: Bank
use constants
use dict_header, only: DictIntInt, ElemKeyValueII
@ -104,6 +104,9 @@ contains
call read_xs()
call time_read_xs % stop()
! Create linked lists for multiple instances of the same nuclide
call same_nuclide_list()
! Construct unionized energy grid from cross-sections
if (grid_method == GRID_UNION) then
call time_unionize % start()
@ -211,13 +214,13 @@ contains
call MPI_GET_ADDRESS(b % uvw, bank_disp(3), mpi_err)
call MPI_GET_ADDRESS(b % E, bank_disp(4), mpi_err)
! Adjust displacements
! Adjust displacements
bank_disp = bank_disp - bank_disp(1)
! Define MPI_BANK for fission sites
bank_blocks = (/ 1, 3, 3, 1 /)
bank_types = (/ MPI_REAL8, MPI_REAL8, MPI_REAL8, MPI_REAL8 /)
call MPI_TYPE_CREATE_STRUCT(4, bank_blocks, bank_disp, &
call MPI_TYPE_CREATE_STRUCT(4, bank_blocks, bank_disp, &
bank_types, MPI_BANK, mpi_err)
call MPI_TYPE_COMMIT(MPI_BANK, mpi_err)
@ -308,13 +311,9 @@ contains
integer :: argc ! number of command line arguments
integer :: last_flag ! index of last flag
integer :: filetype
character(MAX_FILE_LEN) :: pwd ! present working directory
character(MAX_WORD_LEN), allocatable :: argv(:) ! command line arguments
type(BinaryOutput) :: sp
! Get working directory
call GET_ENVIRONMENT_VARIABLE("PWD", pwd)
! Check number of command line arguments and allocate argv
argc = COMMAND_ARGUMENT_COUNT()
@ -414,9 +413,9 @@ contains
! Read number of threads
i = i + 1
#ifdef _OPENMP
#ifdef _OPENMP
! Read and set number of OpenMP threads
n_threads = str_to_int(argv(i))
n_threads = int(str_to_int(argv(i)), 4)
if (n_threads < 1) then
message = "Invalid number of threads specified on command line."
call fatal_error()
@ -427,7 +426,7 @@ contains
call warning()
#endif
case ('-?', '-help', '--help')
case ('-?', '-h', '-help', '--help')
call print_usage()
stop
case ('-v', '-version', '--version')
@ -454,16 +453,12 @@ contains
! Determine directory where XML input files are
if (argc > 0 .and. last_flag < argc) then
path_input = argv(last_flag + 1)
! Need to add working directory if the given path is a relative path
if (.not. starts_with(path_input, "/")) then
path_input = trim(pwd) // "/" // trim(path_input)
end if
else
path_input = pwd
path_input = ''
end if
! Add slash at end of directory if it isn't there
if (.not. ends_with(path_input, "/")) then
if (.not. ends_with(path_input, "/") .and. len_trim(path_input) > 0) then
path_input = trim(path_input) // "/"
end if
@ -563,7 +558,7 @@ contains
integer :: m ! loop index for lattices
integer :: mid, lid ! material and lattice IDs
integer :: n_x, n_y, n_z ! size of lattice
integer :: i_array ! index in surfaces/materials array
integer :: i_array ! index in surfaces/materials array
integer :: id ! user-specified id
type(Cell), pointer :: c => null()
type(Lattice), pointer :: lat => null()
@ -634,7 +629,7 @@ contains
" specified on lattice " // trim(to_str(lid))
call fatal_error()
end if
else
message = "Specified fill " // trim(to_str(id)) // " on cell " // &
trim(to_str(c % id)) // " is neither a universe nor a lattice."
@ -805,7 +800,7 @@ contains
sum_percent = sum_percent + x*awr
end do
sum_percent = ONE / sum_percent
mat % density = -mat % density * N_AVOGADRO &
mat % density = -mat % density * N_AVOGADRO &
/ MASS_NEUTRON * sum_percent
end if
@ -866,7 +861,7 @@ contains
! Allocate source bank
allocate(source_bank(work), STAT=alloc_err)
! Check for allocation errors
! Check for allocation errors
if (alloc_err /= 0) then
message = "Failed to allocate source bank."
call fatal_error()
@ -894,7 +889,7 @@ contains
allocate(fission_bank(3*work), STAT=alloc_err)
#endif
! Check for allocation errors
! Check for allocation errors
if (alloc_err /= 0) then
message = "Failed to allocate fission bank."
call fatal_error()

View file

@ -33,10 +33,10 @@ contains
subroutine read_input_xml()
call read_settings_xml()
if ((run_mode /= MODE_PLOTTING)) call read_cross_sections_xml()
if (run_mode /= MODE_PLOTTING) call read_cross_sections_xml()
call read_geometry_xml()
call read_materials_xml()
call read_tallies_xml()
if (run_mode /= MODE_PLOTTING) call read_tallies_xml()
if (cmfd_run) call configure_cmfd()
end subroutine read_input_xml
@ -80,7 +80,11 @@ contains
filename = trim(path_input) // "settings.xml"
inquire(FILE=filename, EXIST=file_exists)
if (.not. file_exists) then
message = "Settings XML file '" // trim(filename) // "' does not exist!"
message = "Settings XML file '" // trim(filename) // "' does not exist! &
&In order to run OpenMC, you first need a set of input files; at a &
&minimum, this includes settings.xml, geometry.xml, and &
&materials.xml. Please consult the user's guide at &
&http://mit-crpg.github.io/openmc for further information."
call fatal_error()
end if
@ -98,7 +102,11 @@ contains
call get_environment_variable("CROSS_SECTIONS", env_variable)
if (len_trim(env_variable) == 0) then
message = "No cross_sections.xml file was specified in settings.xml &
&or in the CROSS_SECTIONS environment variable."
&or in the CROSS_SECTIONS environment variable. OpenMC needs a &
&cross_sections.xml file to identify where to find ACE cross &
&section libraries. Please consult the user's guide at &
&http://mit-crpg.github.io/openmc for information on how to set &
&up ACE cross section libraries."
call fatal_error()
else
path_cross_sections = trim(env_variable)
@ -177,7 +185,7 @@ contains
! If the number of particles was specified as a command-line argument, we
! don't set it here
if (n_particles == 0) n_particles = temp_long
if (n_particles == 0) n_particles = temp_long
! Copy batch information
call get_node_value(node_mode, "batches", n_batches)
@ -270,10 +278,10 @@ contains
else
! Spatial distribution for external source
if (check_for_node(node_source, "space")) then
if (check_for_node(node_source, "space")) then
! Get pointer to spatial distribution
call get_node_ptr(node_source, "space", node_dist)
call get_node_ptr(node_source, "space", node_dist)
! Check for type of spatial distribution
type = ''
@ -616,7 +624,7 @@ contains
elseif (check_for_node(node_sp, "interval")) then
! User gave an interval for writing state points
call get_node_value(node_sp, "interval", temp_int)
n_state_points = n_batches / temp_int
n_state_points = n_batches / temp_int
do i = 1, n_state_points
call statepoint_batch % add(temp_int * i)
end do
@ -640,7 +648,7 @@ contains
! Determine number of batches at which to store source points
if (check_for_node(node_sp, "batches")) then
n_source_points = get_arraysize_integer(node_sp, "batches")
n_source_points = get_arraysize_integer(node_sp, "batches")
else
n_source_points = 0
end if
@ -692,7 +700,7 @@ contains
end if
else
! If no <source_point> tag was present, by default we keep source bank in
! statepoint file and write it out at statepoints intervals
! statepoint file and write it out at statepoints intervals
source_separate = .false.
n_source_points = n_state_points
do i = 1, n_state_points
@ -778,6 +786,33 @@ contains
end if
end if
! Natural element expansion option
if (check_for_node(doc, "natural_elements")) then
call get_node_value(doc, "natural_elements", temp_str)
call lower_case(temp_str)
select case (temp_str)
case ('endf/b-vii.0')
default_expand = ENDF_BVII0
case ('endf/b-vii.1')
default_expand = ENDF_BVII1
case ('jeff-3.1.1')
default_expand = JEFF_311
case ('jeff-3.1.2')
default_expand = JEFF_312
case ('jeff-3.2')
default_expand = JEFF_32
case ('jendl-3.2')
default_expand = JENDL_32
case ('jendl-3.3')
default_expand = JENDL_33
case ('jendl-4.0')
default_expand = JENDL_40
case default
message = "Unknown natural element expansion option: " // trim(temp_str)
call fatal_error()
end select
end if
! Close settings XML file
call close_xmldoc(doc)
@ -909,7 +944,7 @@ contains
! Check to make sure that either material or fill was specified
if (c % material == NONE .and. c % fill == NONE) then
message = "Neither material nor fill was specified for cell " // &
message = "Neither material nor fill was specified for cell " // &
trim(to_str(c % id))
call fatal_error()
end if
@ -1104,7 +1139,7 @@ contains
n = get_arraysize_double(node_surf, "coeffs")
if (n < coeffs_reqd) then
message = "Not enough coefficients specified for surface: " // &
message = "Not enough coefficients specified for surface: " // &
trim(to_str(s % id))
call fatal_error()
elseif (n > coeffs_reqd) then
@ -1520,7 +1555,9 @@ contains
call get_node_value(node_ele, "name", name)
! Check for cross section
if (.not.check_for_node(node_ele, "xs")) then
if (check_for_node(node_ele, "xs")) then
call get_node_value(node_ele, "xs", temp_str)
else
if (default_xs == '') then
message = "No cross section specified for nuclide in material " &
// trim(to_str(mat % id))
@ -1578,7 +1615,7 @@ contains
! Check to make sure cross-section is continuous energy neutron table
n = len_trim(name)
if (name(n:n) /= 'c') then
message = "Cross-section table " // trim(name) // &
message = "Cross-section table " // trim(name) // &
" is not a continuous-energy neutron table."
call fatal_error()
end if
@ -1607,8 +1644,8 @@ contains
! Check to make sure either all atom percents or all weight percents are
! given
if (.not. (all(mat % atom_density > ZERO) .or. &
all(mat % atom_density < ZERO))) then
if (.not. (all(mat % atom_density >= ZERO) .or. &
all(mat % atom_density <= ZERO))) then
message = "Cannot mix atom and weight percents in material " // &
to_str(mat % id)
call fatal_error()
@ -1708,12 +1745,14 @@ contains
integer :: n ! size of arrays in mesh specification
integer :: n_words ! number of words read
integer :: n_filters ! number of filters
integer :: n_new ! number of new scores to add based on Pn tally
integer :: n_scores ! number of tot scores after adjusting for Pn tally
integer :: n_order ! Scattering order requested
integer :: n_new ! number of new scores to add based on Yn/Pn tally
integer :: n_scores ! number of tot scores after adjusting for Yn/Pn tally
integer :: n_bins ! Total new bins for this score
integer :: n_order ! Moment order requested
integer :: n_order_pos ! Position of Scattering order in score name string
integer :: MT ! user-specified MT for score
integer :: iarray3(3) ! temporary integer array
integer :: imomstr ! Index of MOMENT_STRS & MOMENT_N_STRS
logical :: file_exists ! does tallies.xml file exist?
real(8) :: rarray3(3) ! temporary double prec. array
character(MAX_LINE_LEN) :: filename
@ -2131,7 +2170,7 @@ contains
case default
! Specified tally filter is invalid, raise error
message = "Unknown filter type '" // &
message = "Unknown filter type '" // &
trim(temp_str) // "' on tally " // &
trim(to_str(t % id)) // "."
call fatal_error()
@ -2183,7 +2222,7 @@ contains
t % all_nuclides = .true.
else
! Any other case, e.g. <nuclides>U-235 Pu-239</nuclides>
n_words = get_arraysize_string(node_tal, "nuclides")
n_words = get_arraysize_string(node_tal, "nuclides")
allocate(t % nuclide_bins(n_words))
do j = 1, n_words
! Check if total material was specified
@ -2205,7 +2244,7 @@ contains
word = pair_list % key(1:150)
exit
end if
! Advance to next
pair_list => pair_list % next
end do
@ -2254,79 +2293,110 @@ contains
! READ DATA FOR SCORES
if (check_for_node(node_tal, "scores")) then
! Loop through scores and determine if a scatter-p# input was used
! to allow for proper pre-allocating of t % score_bins
! This scheme allows multiple scatter-p# to be requested by the user
! if so desired
n_words = get_arraysize_string(node_tal, "scores")
allocate(sarray(n_words))
call get_node_array(node_tal, "scores", sarray)
! Before we can allocate storage for scores, we must determine the
! number of additional scores required due to the moment scores
! (i.e., scatter-p#, flux-y#)
n_new = 0
do j = 1, n_words
call lower_case(sarray(j))
! Find if scores(j) is of the form 'scatter-p'
! If so, get the number and do a select case on that.
! Find if scores(j) is of the form 'moment-p' or 'moment-y' present in
! MOMENT_STRS(:)
! If so, check the order, store if OK, then reset the number to 'n'
score_name = trim(sarray(j))
if (starts_with(score_name,'scatter-p')) then
n_order_pos = scan(score_name,'0123456789')
n_order = int(str_to_int( &
score_name(n_order_pos:(len_trim(score_name)))),4)
if (n_order > SCATT_ORDER_MAX) then
! Throw a warning. Set to the maximum number.
! The above scheme will essentially take the absolute value
message = "Invalid scattering order of " // trim(to_str(n_order)) // &
" requested. Setting to the maximum permissible value, " // &
trim(to_str(SCATT_ORDER_MAX))
call warning()
n_order = SCATT_ORDER_MAX
sarray(j) = SCATT_ORDER_MAX_PNSTR
do imomstr = 1, size(MOMENT_STRS)
if (starts_with(score_name,trim(MOMENT_STRS(imomstr)))) then
n_order_pos = scan(score_name,'0123456789')
n_order = int(str_to_int( &
score_name(n_order_pos:(len_trim(score_name)))),4)
if (n_order > MAX_ANG_ORDER) then
! User requested too many orders; throw a warning and set to the
! maximum order.
! The above scheme will essentially take the absolute value
message = "Invalid scattering order of " // trim(to_str(n_order)) // &
" requested. Setting to the maximum permissible value, " // &
trim(to_str(MAX_ANG_ORDER))
call warning()
n_order = MAX_ANG_ORDER
sarray(j) = trim(MOMENT_STRS(imomstr)) // &
trim(to_str(MAX_ANG_ORDER))
end if
! Find total number of bins for this case
if (imomstr >= YN_LOC) then
n_bins = (n_order + 1)**2
else
n_bins = n_order + 1
end if
! We subtract one since n_words already included
n_new = n_new + n_bins - 1
exit
end if
n_new = n_new + n_order
end if
end do
end do
n_scores = n_words + n_new
! Allocate accordingly
! Allocate score storage accordingly
allocate(t % score_bins(n_scores))
allocate(t % scatt_order(n_scores))
t % scatt_order = 0
allocate(t % moment_order(n_scores))
t % moment_order = 0
j = 0
do l = 1, n_words
j = j + 1
! Get the input string in scores(l) but if scatter-n or scatter-pn
! then strip off the n, and store it as an integer to be used later
! Peform the select case on this modified (number removed) string
! Get the input string in scores(l) but if score is one of the moment
! scores then strip off the n and store it as an integer to be used
! later. Then perform the select case on this modified (number removed) string
score_name = sarray(l)
if (starts_with(score_name,'scatter-p')) then
n_order_pos = scan(score_name,'0123456789')
n_order = int(str_to_int( &
score_name(n_order_pos:(len_trim(score_name)))),4)
if (n_order > SCATT_ORDER_MAX) then
! Throw a warning. Set to the maximum number.
! The above scheme will essentially take the absolute value
message = "Invalid scattering order of " // trim(to_str(n_order)) // &
" requested. Setting to the maximum permissible value, " // &
trim(to_str(SCATT_ORDER_MAX))
call warning()
n_order = SCATT_ORDER_MAX
do imomstr = 1, size(MOMENT_STRS)
if (starts_with(score_name,trim(MOMENT_STRS(imomstr)))) then
n_order_pos = scan(score_name,'0123456789')
n_order = int(str_to_int( &
score_name(n_order_pos:(len_trim(score_name)))),4)
if (n_order > MAX_ANG_ORDER) then
! User requested too many orders; throw a warning and set to the
! maximum order.
! The above scheme will essentially take the absolute value
message = "Invalid scattering order of " // trim(to_str(n_order)) // &
" requested. Setting to the maximum permissible value, " // &
trim(to_str(MAX_ANG_ORDER))
call warning()
n_order = MAX_ANG_ORDER
end if
score_name = trim(MOMENT_STRS(imomstr)) // "n"
! Find total number of bins for this case
if (imomstr >= YN_LOC) then
n_bins = (n_order + 1)**2
else
n_bins = n_order + 1
end if
exit
end if
score_name = "scatter-pn"
else if (starts_with(score_name,'scatter-')) then
n_order_pos = scan(score_name,'0123456789')
n_order = int(str_to_int( &
score_name(n_order_pos:(len_trim(score_name)))),4)
if (n_order > SCATT_ORDER_MAX) then
! Throw a warning. Set to the maximum number.
! The above scheme will essentially take the absolute value
message = "Invalid scattering order of " // trim(to_str(n_order)) // &
" requested. Setting to the maximum permissible value, " // &
trim(to_str(SCATT_ORDER_MAX))
call warning()
n_order = SCATT_ORDER_MAX
end if
score_name = "scatter-n"
end do
! Now check the Moment_N_Strs, but only if we werent successful above
if (imomstr > size(MOMENT_STRS)) then
do imomstr = 1, size(MOMENT_N_STRS)
if (starts_with(score_name,trim(MOMENT_N_STRS(imomstr)))) then
n_order_pos = scan(score_name,'0123456789')
n_order = int(str_to_int( &
score_name(n_order_pos:(len_trim(score_name)))),4)
if (n_order > MAX_ANG_ORDER) then
! User requested too many orders; throw a warning and set to the
! maximum order.
! The above scheme will essentially take the absolute value
message = "Invalid scattering order of " // trim(to_str(n_order)) // &
" requested. Setting to the maximum permissible value, " // &
trim(to_str(MAX_ANG_ORDER))
call warning()
n_order = MAX_ANG_ORDER
end if
score_name = trim(MOMENT_N_STRS(imomstr)) // "n"
exit
end if
end do
end if
select case (trim(score_name))
case ('flux')
! Prohibit user from tallying flux for an individual nuclide
@ -2341,6 +2411,23 @@ contains
message = "Cannot tally flux with an outgoing energy filter."
call fatal_error()
end if
case ('flux-yn')
! Prohibit user from tallying flux for an individual nuclide
if (.not. (t % n_nuclide_bins == 1 .and. &
t % nuclide_bins(1) == -1)) then
message = "Cannot tally flux for an individual nuclide."
call fatal_error()
end if
if (t % find_filter(FILTER_ENERGYOUT) > 0) then
message = "Cannot tally flux with an outgoing energy filter."
call fatal_error()
end if
t % score_bins(j : j + n_bins - 1) = SCORE_FLUX_YN
t % moment_order(j : j + n_bins - 1) = n_order
j = j + n_bins - 1
case ('total')
t % score_bins(j) = SCORE_TOTAL
if (t % find_filter(FILTER_ENERGYOUT) > 0) then
@ -2348,9 +2435,21 @@ contains
&outgoing energy filter."
call fatal_error()
end if
case ('total-yn')
if (t % find_filter(FILTER_ENERGYOUT) > 0) then
message = "Cannot tally total reaction rate with an &
&outgoing energy filter."
call fatal_error()
end if
t % score_bins(j : j + n_bins - 1) = SCORE_TOTAL_YN
t % moment_order(j : j + n_bins - 1) = n_order
j = j + n_bins - 1
case ('scatter')
t % score_bins(j) = SCORE_SCATTER
case ('nu-scatter')
t % score_bins(j) = SCORE_NU_SCATTER
@ -2364,22 +2463,53 @@ contains
! Set tally estimator to analog
t % estimator = ESTIMATOR_ANALOG
end if
t % scatt_order(j) = n_order
t % moment_order(j) = n_order
case ('nu-scatter-n')
! Set tally estimator to analog
t % estimator = ESTIMATOR_ANALOG
if (n_order == 0) then
t % score_bins(j) = SCORE_NU_SCATTER
else
t % score_bins(j) = SCORE_NU_SCATTER_N
end if
t % moment_order(j) = n_order
case ('scatter-pn')
t % estimator = ESTIMATOR_ANALOG
! Setup P0:Pn
t % score_bins(j : j + n_order) = SCORE_SCATTER_PN
t % scatt_order(j : j + n_order) = n_order
j = j + n_order
t % score_bins(j : j + n_bins - 1) = SCORE_SCATTER_PN
t % moment_order(j : j + n_bins - 1) = n_order
j = j + n_bins - 1
case ('nu-scatter-pn')
t % estimator = ESTIMATOR_ANALOG
! Setup P0:Pn
t % score_bins(j : j + n_bins - 1) = SCORE_NU_SCATTER_PN
t % moment_order(j : j + n_bins - 1) = n_order
j = j + n_bins - 1
case ('scatter-yn')
t % estimator = ESTIMATOR_ANALOG
! Setup P0:Pn
t % score_bins(j : j + n_bins - 1) = SCORE_SCATTER_YN
t % moment_order(j : j + n_bins - 1) = n_order
j = j + n_bins - 1
case ('nu-scatter-yn')
t % estimator = ESTIMATOR_ANALOG
! Setup P0:Pn
t % score_bins(j : j + n_bins - 1) = SCORE_NU_SCATTER_YN
t % moment_order(j : j + n_bins - 1) = n_order
j = j + n_bins - 1
case('transport')
t % score_bins(j) = SCORE_TRANSPORT
! Set tally estimator to analog
t % estimator = ESTIMATOR_ANALOG
case ('diffusion')
message = "Diffusion score no longer supported for tallies, &
message = "Diffusion score no longer supported for tallies, &
&please remove"
call fatal_error()
case ('n1n')
@ -2482,14 +2612,14 @@ contains
t % score_bins(j) = MT
else
message = "Invalid MT on <scores>: " // &
trim(sarray(j))
trim(sarray(l))
call fatal_error()
end if
else
! Specified score was not an integer
message = "Unknown scoring function: " // &
trim(sarray(j))
trim(sarray(l))
call fatal_error()
end if
@ -2638,7 +2768,7 @@ contains
pl % path_plot = trim(path_input) // trim(to_str(pl % id)) // &
"_" // trim(filename) // ".voxel"
end select
! Copy plot pixel size
if (pl % type == PLOT_TYPE_SLICE) then
if (get_arraysize_integer(node_plot, "pixels") == 2) then
@ -2661,7 +2791,7 @@ contains
! Copy plot background color
if (check_for_node(node_plot, "background")) then
if (pl % type == PLOT_TYPE_VOXEL) then
message = "Background color ignored in voxel plot " // &
message = "Background color ignored in voxel plot " // &
trim(to_str(pl % id))
call warning()
end if
@ -2675,7 +2805,7 @@ contains
else
pl % not_found % rgb = (/ 255, 255, 255 /)
end if
! Copy plot basis
if (pl % type == PLOT_TYPE_SLICE) then
temp_str = 'xy'
@ -2690,12 +2820,12 @@ contains
case ("yz")
pl % basis = PLOT_BASIS_YZ
case default
message = "Unsupported plot basis '" // trim(temp_str) &
message = "Unsupported plot basis '" // trim(temp_str) &
// "' in plot " // trim(to_str(pl % id))
call fatal_error()
end select
end if
! Copy plotting origin
if (get_arraysize_double(node_plot, "origin") == 3) then
call get_node_array(node_plot, "origin", pl % origin)
@ -2762,13 +2892,13 @@ contains
! Copy user specified colors
if (n_cols /= 0) then
if (pl % type == PLOT_TYPE_VOXEL) then
message = "Color specifications ignored in voxel plot " // &
message = "Color specifications ignored in voxel plot " // &
trim(to_str(pl % id))
call warning()
end if
do j = 1, n_cols
! Get pointer to color spec XML node
@ -2778,7 +2908,7 @@ contains
if (get_arraysize_double(node_col, "rgb") /= 3) then
message = "Bad RGB " &
// "in plot " // trim(to_str(pl % id))
call fatal_error()
call fatal_error()
end if
! Ensure that there is an id for this color specification
@ -2821,13 +2951,13 @@ contains
call get_node_list(node_plot, "mask", node_mask_list)
n_masks = get_list_size(node_mask_list)
if (n_masks /= 0) then
if (pl % type == PLOT_TYPE_VOXEL) then
message = "Mask ignored in voxel plot " // &
message = "Mask ignored in voxel plot " // &
trim(to_str(pl % id))
call warning()
end if
select case(n_masks)
case default
message = "Mutliple masks" // &
@ -2848,14 +2978,14 @@ contains
end if
allocate(iarray(n_comp))
call get_node_array(node_mask, "components", iarray)
! First we need to change the user-specified identifiers to indices
! in the cell and material arrays
do j=1, n_comp
col_id = iarray(j)
if (pl % color_by == PLOT_COLOR_CELLS) then
if (cell_dict % has_key(col_id)) then
iarray(j) = cell_dict % get_key(col_id)
else
@ -2863,9 +2993,9 @@ contains
" specified in the mask in plot " // trim(to_str(pl % id))
call fatal_error()
end if
else if (pl % color_by == PLOT_COLOR_MATS) then
if (material_dict % has_key(col_id)) then
iarray(j) = material_dict % get_key(col_id)
else
@ -2873,10 +3003,10 @@ contains
" specified in the mask in plot " // trim(to_str(pl % id))
call fatal_error()
end if
end if
end if
end do
! Alter colors based on mask information
do j=1,size(pl % colors)
if (.not. any(j .eq. iarray)) then
@ -2891,9 +3021,9 @@ contains
end do
deallocate(iarray)
end select
end if
! Add plot to dictionary
@ -2933,7 +3063,7 @@ contains
"' does not exist!"
call fatal_error()
end if
message = "Reading cross sections XML file..."
call write_message(5)
@ -3114,8 +3244,7 @@ contains
call list_density % append(density * 0.801_8)
case ('c')
! The evaluation of Carbon in ENDF/B-VII.1 and JEFF 3.1.2 is a natural
! element, i.e. it's not possible to split into C-12 and C-13.
! No evaluations split up Carbon into isotopes yet
call list_names % append('6000.' // xs)
call list_density % append(density)
@ -3126,12 +3255,22 @@ contains
call list_density % append(density * 0.00364_8)
case ('o')
! O-18 does not exist in ENDF/B-VII.1 or JEFF 3.1.2 so its 0.205% has been
! added to O-16. The isotopic abundance for O-16 is ordinarily 99.757%.
call list_names % append('8016.' // xs)
call list_density % append(density * 0.99962_8)
call list_names % append('8017.' // xs)
call list_density % append(density * 0.00038_8)
if (default_expand == JEFF_32) then
call list_names % append('8016.' // xs)
call list_density % append(density * 0.99757_8)
call list_names % append('8017.' // xs)
call list_density % append(density * 0.00038_8)
call list_names % append('8018.' // xs)
call list_density % append(density * 0.00205_8)
elseif (default_expand >= JENDL_32 .and. default_expand <= JENDL_40) then
call list_names % append('8016.' // xs)
call list_density % append(density)
else
call list_names % append('8016.' // xs)
call list_density % append(density * 0.99962_8)
call list_names % append('8017.' // xs)
call list_density % append(density * 0.00038_8)
end if
case ('f')
call list_names % append('9019.' // xs)
@ -3236,13 +3375,17 @@ contains
call list_density % append(density * 0.0518_8)
case ('v')
! The evaluation of Vanadium in ENDF/B-VII.1 and JEFF 3.1.2 is a natural
! element. The IUPAC isotopic composition specifies the following
! breakdown which is not used:
! V-50 = 0.250%
! V-51 = 99.750%
call list_names % append('23000.' // xs)
call list_density % append(density)
if (default_expand == ENDF_BVII0 .or. default_expand == JEFF_311 &
.or. default_expand == JEFF_32 .or. &
(default_expand >= JENDL_32 .and. default_expand <= JENDL_33)) then
call list_names % append('23000.' // xs)
call list_density % append(density)
else
call list_names % append('23050.' // xs)
call list_density % append(density * 0.0025_8)
call list_names % append('23051.' // xs)
call list_density % append(density * 0.9975_8)
end if
case ('cr')
call list_names % append('24050.' // xs)
@ -3291,24 +3434,33 @@ contains
call list_density % append(density * 0.3085_8)
case ('zn')
! The evaluation of Zinc in ENDF/B-VII.1 is a natural element. The IUPAC
! isotopic composition specifies the following breakdown which is not used
! here:
! Zn-64 = 48.63%
! Zn-66 = 27.90%
! Zn-67 = 4.10%
! Zn-68 = 18.75%
! Zn-70 = 0.62%
call list_names % append('30000.' // xs)
call list_density % append(density)
if (default_expand == ENDF_BVII0 .or. default_expand == &
JEFF_311 .or. default_expand == JEFF_312) then
call list_names % append('30000.' // xs)
call list_density % append(density)
else
call list_names % append('30064.' // xs)
call list_density % append(density * 0.4917_8)
call list_names % append('30066.' // xs)
call list_density % append(density * 0.2773_8)
call list_names % append('30067.' // xs)
call list_density % append(density * 0.0404_8)
call list_names % append('30068.' // xs)
call list_density % append(density * 0.1845_8)
call list_names % append('30070.' // xs)
call list_density % append(density * 0.0061_8)
end if
case ('ga')
! JEFF 3.1.2 does not have evaluations for Ga-69 and Ga-71, only for
! natural Gallium, so this may cause problems.
call list_names % append('31069.' // xs)
call list_density % append(density * 0.60108_8)
call list_names % append('31071.' // xs)
call list_density % append(density * 0.39892_8)
if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then
call list_names % append('31000.' // xs)
call list_density % append(density)
else
call list_names % append('31069.' // xs)
call list_density % append(density * 0.60108_8)
call list_names % append('31071.' // xs)
call list_density % append(density * 0.39892_8)
end if
case ('ge')
call list_names % append('32070.' // xs)
@ -3719,24 +3871,43 @@ contains
call list_density % append(density * 0.3508_8)
case ('ta')
call list_names % append('73180.' // xs)
call list_density % append(density * 0.0001201_8)
call list_names % append('73181.' // xs)
call list_density % append(density * 0.9998799_8)
if (default_expand == ENDF_BVII0 .or. &
(default_expand >= JEFF_311 .and. default_expand <= JEFF_312) .or. &
(default_expand >= JENDL_32 .and. default_expand <= JENDL_40)) then
call list_names % append('73181.' // xs)
call list_density % append(density)
else
call list_names % append('73180.' // xs)
call list_density % append(density * 0.0001201_8)
call list_names % append('73181.' // xs)
call list_density % append(density * 0.9998799_8)
end if
case ('w')
! ENDF/B-VII.0 does not have W-180 so this may cause problems. However, it
! has been added as of ENDF/B-VII.1
call list_names % append('74180.' // xs)
call list_density % append(density * 0.0012_8)
call list_names % append('74182.' // xs)
call list_density % append(density * 0.2650_8)
call list_names % append('74183.' // xs)
call list_density % append(density * 0.1431_8)
call list_names % append('74184.' // xs)
call list_density % append(density * 0.3064_8)
call list_names % append('74186.' // xs)
call list_density % append(density * 0.2843_8)
if (default_expand == ENDF_BVII0 .or. default_expand == JEFF_311 &
.or. default_expand == JEFF_312 .or. &
(default_expand >= JENDL_32 .and. default_expand <= JENDL_33)) then
! Combine W-180 with W-182
call list_names % append('74182.' // xs)
call list_density % append(density * 0.2662_8)
call list_names % append('74183.' // xs)
call list_density % append(density * 0.1431_8)
call list_names % append('74184.' // xs)
call list_density % append(density * 0.3064_8)
call list_names % append('74186.' // xs)
call list_density % append(density * 0.2843_8)
else
call list_names % append('74180.' // xs)
call list_density % append(density * 0.0012_8)
call list_names % append('74182.' // xs)
call list_density % append(density * 0.2650_8)
call list_names % append('74183.' // xs)
call list_density % append(density * 0.1431_8)
call list_names % append('74184.' // xs)
call list_density % append(density * 0.3064_8)
call list_names % append('74186.' // xs)
call list_density % append(density * 0.2843_8)
end if
case ('re')
call list_names % append('75185.' // xs)
@ -3745,20 +3916,25 @@ contains
call list_density % append(density * 0.6260_8)
case ('os')
call list_names % append('76184.' // xs)
call list_density % append(density * 0.0002_8)
call list_names % append('76186.' // xs)
call list_density % append(density * 0.0159_8)
call list_names % append('76187.' // xs)
call list_density % append(density * 0.0196_8)
call list_names % append('76188.' // xs)
call list_density % append(density * 0.1324_8)
call list_names % append('76189.' // xs)
call list_density % append(density * 0.1615_8)
call list_names % append('76190.' // xs)
call list_density % append(density * 0.2626_8)
call list_names % append('76192.' // xs)
call list_density % append(density * 0.4078_8)
if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then
call list_names % append('76000.' // xs)
call list_density % append(density)
else
call list_names % append('76184.' // xs)
call list_density % append(density * 0.0002_8)
call list_names % append('76186.' // xs)
call list_density % append(density * 0.0159_8)
call list_names % append('76187.' // xs)
call list_density % append(density * 0.0196_8)
call list_names % append('76188.' // xs)
call list_density % append(density * 0.1324_8)
call list_names % append('76189.' // xs)
call list_density % append(density * 0.1615_8)
call list_names % append('76190.' // xs)
call list_density % append(density * 0.2626_8)
call list_names % append('76192.' // xs)
call list_density % append(density * 0.4078_8)
end if
case ('ir')
call list_names % append('77191.' // xs)
@ -3767,18 +3943,23 @@ contains
call list_density % append(density * 0.627_8)
case ('pt')
call list_names % append('78190.' // xs)
call list_density % append(density * 0.00012_8)
call list_names % append('78192.' // xs)
call list_density % append(density * 0.00782_8)
call list_names % append('78194.' // xs)
call list_density % append(density * 0.3286_8)
call list_names % append('78195.' // xs)
call list_density % append(density * 0.3378_8)
call list_names % append('78196.' // xs)
call list_density % append(density * 0.2521_8)
call list_names % append('78198.' // xs)
call list_density % append(density * 0.07356_8)
if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then
call list_names % append('78000.' // xs)
call list_density % append(density)
else
call list_names % append('78190.' // xs)
call list_density % append(density * 0.00012_8)
call list_names % append('78192.' // xs)
call list_density % append(density * 0.00782_8)
call list_names % append('78194.' // xs)
call list_density % append(density * 0.3286_8)
call list_names % append('78195.' // xs)
call list_density % append(density * 0.3378_8)
call list_names % append('78196.' // xs)
call list_density % append(density * 0.2521_8)
call list_names % append('78198.' // xs)
call list_density % append(density * 0.07356_8)
end if
case ('au')
call list_names % append('79197.' // xs)
@ -3801,10 +3982,15 @@ contains
call list_density % append(density * 0.0687_8)
case ('tl')
call list_names % append('81203.' // xs)
call list_density % append(density * 0.2952_8)
call list_names % append('81205.' // xs)
call list_density % append(density * 0.7048_8)
if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then
call list_names % append('81000.' // xs)
call list_density % append(density)
else
call list_names % append('81203.' // xs)
call list_density % append(density * 0.2952_8)
call list_names % append('81205.' // xs)
call list_density % append(density * 0.7048_8)
end if
case ('pb')
call list_names % append('82204.' // xs)

View file

@ -1,6 +1,6 @@
module math
use constants, only: PI, ONE, TWO
use constants, only: PI, ONE, TWO, ZERO
use random_lcg, only: prn
implicit none
@ -116,20 +116,20 @@ contains
!===============================================================================
! CALC_PN calculates the n-th order Legendre polynomial at the value of x.
! Since this function is called repeatedly during the neutron transport process,
! neither n or x is checked to see if they are in the applicable range.
! neither n or x is checked to see if they are in the applicable range.
! This is left to the client developer to use where applicable. x is to be in
! the domain of [-1,1], and 0<=n<=5. If x is outside of the range, the return
! value will be outside the expected range; if n is outside the stated range,
! value will be outside the expected range; if n is outside the stated range,
! the return value will be 1.0.
!===============================================================================
pure function calc_pn(n,x) result(pnx)
integer, intent(in) :: n ! Legendre order requested
real(8), intent(in) :: x ! Independent variable the Legendre is to be
real(8), intent(in) :: x ! Independent variable the Legendre is to be
! evaluated at; x must be in the domain [-1,1]
real(8) :: pnx ! The Legendre poly of order n evaluated at x
select case(n)
case(1)
pnx = x
@ -144,7 +144,7 @@ contains
case(6)
pnx = 14.4375_8 * (x ** 6) - 19.6875_8 * (x ** 4) + &
6.5625_8 * x * x - 0.3125_8
case(7)
case(7)
pnx = 26.8125_8 * (x ** 7) - 43.3125_8 * (x ** 5) + &
19.6875_8 * x * x * x - 2.1875_8 * x
case(8)
@ -160,9 +160,393 @@ contains
case default
pnx = ONE ! correct for case(0), incorrect for the rest
end select
end function calc_pn
!===============================================================================
! CALC_RN calculates the n-th order spherical harmonics for a given angle
! (in terms of (u,v,w)). All Rn,m values are provided (where -n<=m<=n)
!===============================================================================
pure function calc_rn(n,uvw) result(rn)
integer, intent(in) :: n ! Order requested
real(8), intent(in) :: uvw(3) ! Direction of travel, assumed to be on unit sphere
real(8) :: rn(2*n + 1) ! The resultant R_n(uvw)
real(8) :: phi, w ! Azimuthal and Cosine of Polar angles (from uvw)
real(8) :: w2m1 ! (w^2 - 1), frequently used in these
w = uvw(3) ! z = cos(polar)
if (uvw(1) == ZERO) then
phi = ZERO
else
! phi = atan(uvw(2) / uvw(1))
phi = atan2(uvw(2), uvw(1))
end if
w2m1 = (ONE - w**2)
select case(n)
case (0)
! l = 0, m = 0
rn(1) = ONE
case (1)
! l = 1, m = -1
rn(1) = ONE*sqrt(w2m1) * sin(phi)
! l = 1, m = 0
rn(2) = ONE * w
! l = 1, m = 1
rn(3) = ONE*sqrt(w2m1) * cos(phi)
case (2)
! l = 2, m = -2
rn(1) = 0.288675134594813_8 * (-3.0_8 * w**2 + 3.0_8) * sin(TWO*phi)
! l = 2, m = -1
rn(2) = 1.73205080756888_8 * w*sqrt(w2m1) * sin(phi)
! l = 2, m = 0
rn(3) = 1.5_8 * w**2 - 0.5_8
! l = 2, m = 1
rn(4) = 1.73205080756888_8 * w*sqrt(w2m1) * cos(phi)
! l = 2, m = 2
rn(5) = 0.288675134594813_8 * (-3.0_8 * w**2 + 3.0_8) * cos(TWO*phi)
case (3)
! l = 3, m = -3
rn(1) = 0.790569415042095_8 * (w2m1)**(3.0_8/TWO) * sin(3.0_8 * phi)
! l = 3, m = -2
rn(2) = 1.93649167310371_8 * w*(w2m1) * sin(TWO*phi)
! l = 3, m = -1
rn(3) = 0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - 3.0_8/TWO) * &
sin(phi)
! l = 3, m = 0
rn(4) = 2.5_8 * w**3 - 1.5_8 * w
! l = 3, m = 1
rn(5) = 0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - 3.0_8/TWO) * &
cos(phi)
! l = 3, m = 2
rn(6) = 1.93649167310371_8 * w*(w2m1) * cos(TWO*phi)
! l = 3, m = 3
rn(7) = 0.790569415042095_8 * (w2m1)**(3.0_8/TWO) * cos(3.0_8* phi)
case (4)
! l = 4, m = -4
rn(1) = 0.739509972887452_8 * (w2m1)**2 * sin(4.0_8*phi)
! l = 4, m = -3
rn(2) = 2.09165006633519_8 * w*(w2m1)**(3.0_8/TWO) * sin(3.0_8* phi)
! l = 4, m = -2
rn(3) = 0.074535599249993_8 * (w2m1)*((105.0_8/TWO)*w**2 - 15.0_8/TWO) * &
sin(TWO*phi)
! l = 4, m = -1
rn(4) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w) * &
sin(phi)
! l = 4, m = 0
rn(5) = 4.375_8 * w**4 - 3.75_8 * w**2 + 0.375_8
! l = 4, m = 1
rn(6) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w) * &
cos(phi)
! l = 4, m = 2
rn(7) = 0.074535599249993_8 * (w2m1)*((105.0_8/TWO)*w**2 - 15.0_8/TWO) * &
cos(TWO*phi)
! l = 4, m = 3
rn(8) = 2.09165006633519_8 * w*(w2m1)**(3.0_8/TWO) * cos(3.0_8* phi)
! l = 4, m = 4
rn(9) = 0.739509972887452_8 * (w2m1)**2 * cos(4.0_8*phi)
case (5)
! l = 5, m = -5
rn(1) = 0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * sin(5.0_8*phi)
! l = 5, m = -4
rn(2) = 2.21852991866236_8 * w*(w2m1)**2 * sin(4.0_8*phi)
! l = 5, m = -3
rn(3) = 0.00996023841111995_8 * (w2m1)**(3.0_8/TWO)* &
((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * sin(3.0_8*phi)
! l = 5, m = -2
rn(4) = 0.0487950036474267_8 * (w2m1)*((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * &
sin(TWO*phi)
! l = 5, m = -1
rn(5) = 0.258198889747161_8*sqrt(w2m1)* &
((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) * sin(phi)
! l = 5, m = 0
rn(6) = 7.875_8 * w**5 - 8.75_8 * w**3 + 1.875_8 * w
! l = 5, m = 1
rn(7) = 0.258198889747161_8*sqrt(w2m1)* &
((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) * cos(phi)
! l = 5, m = 2
rn(8) = 0.0487950036474267_8 * (w2m1)* &
((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * cos(TWO*phi)
! l = 5, m = 3
rn(9) = 0.00996023841111995_8 * (w2m1)**(3.0_8/TWO)* &
((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * cos(3.0_8*phi)
! l = 5, m = 4
rn(10) = 2.21852991866236_8 * w*(w2m1)**2 * cos(4.0_8*phi)
! l = 5, m = 5
rn(11) = 0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * cos(5.0_8* phi)
case (6)
! l = 6, m = -6
rn(1) = 0.671693289381396_8 * (w2m1)**3 * sin(6.0_8*phi)
! l = 6, m = -5
rn(2) = 2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * sin(5.0_8*phi)
! l = 6, m = -4
rn(3) = 0.00104990131391452_8 * (w2m1)**2 * &
((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * sin(4.0_8*phi)
! l = 6, m = -3
rn(4) = 0.00575054632785295_8 * (w2m1)**(3.0_8/TWO) * &
((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * sin(3.0_8*phi)
! l = 6, m = -2
rn(5) = 0.0345032779671177_8 * (w2m1) * &
((3465.0_8/8.0_8)*w**4 - 945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) * sin(TWO*phi)
! l = 6, m = -1
rn(6) = 0.218217890235992_8*sqrt(w2m1) * &
((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) * sin(phi)
! l = 6, m = 0
rn(7) = 14.4375_8 * w**6 - 19.6875_8 * w**4 + 6.5625_8 * w**2 - 0.3125_8
! l = 6, m = 1
rn(8) = 0.218217890235992_8*sqrt(w2m1) * &
((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) * cos(phi)
! l = 6, m = 2
rn(9) = 0.0345032779671177_8 * (w2m1) * &
((3465.0_8/8.0_8)*w**4 -945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) * cos(TWO*phi)
! l = 6, m = 3
rn(10) = 0.00575054632785295_8 * (w2m1)**(3.0_8/TWO) * &
((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * cos(3.0_8*phi)
! l = 6, m = 4
rn(11) = 0.00104990131391452_8 * (w2m1)**2 * &
((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * cos(4.0_8*phi)
! l = 6, m = 5
rn(12) = 2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * cos(5.0_8*phi)
! l = 6, m = 6
rn(13) = 0.671693289381396_8 * (w2m1)**3 * cos(6.0_8*phi)
case (7)
! l = 7, m = -7
rn(1) = 0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * sin(7.0_8*phi)
! l = 7, m = -6
rn(2) = 2.42182459624969_8 * w*(w2m1)**3 * sin(6.0_8*phi)
! l = 7, m = -5
rn(3) = 9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* &
((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * sin(5.0_8*phi)
! l = 7, m = -4
rn(4) = 0.000548293079133141_8 * (w2m1)**2* &
((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * sin(4.0_8*phi)
! l = 7, m = -3
rn(5) = 0.00363696483726654_8 * (w2m1)**(3.0_8/TWO)* &
((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* &
sin(3.0_8*phi)
! l = 7, m = -2
rn(6) = 0.025717224993682_8 * (w2m1)* &
((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* &
sin(TWO*phi)
! l = 7, m = -1
rn(7) = 0.188982236504614_8*sqrt(w2m1)* &
((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + &
(945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * sin(phi)
! l = 7, m = 0
rn(8) = 26.8125_8 * w**7 - 43.3125_8 * w**5 + 19.6875_8 * w**3 -2.1875_8 * w
! l = 7, m = 1
rn(9) = 0.188982236504614_8*sqrt(w2m1)* &
((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + &
(945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * cos(phi)
! l = 7, m = 2
rn(10) = 0.025717224993682_8 * (w2m1)* &
((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* &
cos(TWO*phi)
! l = 7, m = 3
rn(11) = 0.00363696483726654_8 * (w2m1)**(3.0_8/TWO)* &
((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* &
cos(3.0_8*phi)
! l = 7, m = 4
rn(12) = 0.000548293079133141_8 * (w2m1)**2 * &
((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * cos(4.0_8*phi)
! l = 7, m = 5
rn(13) = 9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* &
((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * cos(5.0_8*phi)
! l = 7, m = 6
rn(14) = 2.42182459624969_8 * w*(w2m1)**3 * cos(6.0_8*phi)
! l = 7, m = 7
rn(15) = 0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * cos(7.0_8*phi)
case (8)
! l = 8, m = -8
rn(1) = 0.626706654240044_8 * (w2m1)**4 * sin(8.0_8*phi)
! l = 8, m = -7
rn(2) = 2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * sin(7.0_8*phi)
! l = 8, m = -6
rn(3) = 6.77369783729086d-6*(w2m1)**3* &
((2027025.0_8/TWO)*w**2 - 135135.0_8/TWO) * sin(6.0_8*phi)
! l = 8, m = -5
rn(4) = 4.38985792528482d-5*(w2m1)**(5.0_8/TWO)* &
((675675.0_8/TWO)*w**3 - 135135.0_8/TWO*w) * sin(5.0_8*phi)
! l = 8, m = -4
rn(5) = 0.000316557156832328_8 * (w2m1)**2* &
((675675.0_8/8.0_8)*w**4 - 135135.0_8/4.0_8 * w**2 + 10395.0_8/8.0_8) * sin(4.0_8*phi)
! l = 8, m = -3
rn(6) = 0.00245204119306875_8 * (w2m1)**(3.0_8/TWO)* &
((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 + (10395.0_8/8.0_8)*w) * sin(3.0_8*phi)
! l = 8, m = -2
rn(7) = 0.0199204768222399_8 * (w2m1)* &
((45045.0_8/16.0_8)*w**6- 45045.0_8/16.0_8 * w**4 + &
(10395.0_8/16.0_8)*w**2 - 315.0_8/16.0_8) * sin(TWO*phi)
! l = 8, m = -1
rn(8) = 0.166666666666667_8*sqrt(w2m1)* &
((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + &
(3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * sin(phi)
! l = 8, m = 0
rn(9) = 50.2734375_8 * w**8 - 93.84375_8 * w**6 + 54.140625_8 * w**4 -&
9.84375_8 * w**2 + 0.2734375_8
! l = 8, m = 1
rn(10) = 0.166666666666667_8*sqrt(w2m1)* &
((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + &
(3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * cos(phi)
! l = 8, m = 2
rn(11) = 0.0199204768222399_8 * (w2m1)*((45045.0_8/16.0_8)*w**6- &
45045.0_8/16.0_8 * w**4 + (10395.0_8/16.0_8)*w**2 - &
315.0_8/16.0_8) * cos(TWO*phi)
! l = 8, m = 3
rn(12) = 0.00245204119306875_8 * (w2m1)**(3.0_8/TWO)* &
((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 + &
(10395.0_8/8.0_8)*w) * cos(3.0_8*phi)
! l = 8, m = 4
rn(13) = 0.000316557156832328_8 * (w2m1)**2*((675675.0_8/8.0_8)*w**4 - &
135135.0_8/4.0_8 * w**2 + 10395.0_8/8.0_8) * cos(4.0_8*phi)
! l = 8, m = 5
rn(14) = 4.38985792528482d-5*(w2m1)**(5.0_8/TWO)*((675675.0_8/TWO)*w**3 - &
135135.0_8/TWO*w) * cos(5.0_8*phi)
! l = 8, m = 6
rn(15) = 6.77369783729086d-6*(w2m1)**3*((2027025.0_8/TWO)*w**2 - &
135135.0_8/TWO) * cos(6.0_8*phi)
! l = 8, m = 7
rn(16) = 2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * cos(7.0_8*phi)
! l = 8, m = 8
rn(17) = 0.626706654240044_8 * (w2m1)**4 * cos(8.0_8*phi)
case (9)
! l = 9, m = -9
rn(1) = 0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * sin(9.0_8*phi)
! l = 9, m = -8
rn(2) = 2.58397773170915_8 * w*(w2m1)**4 * sin(8.0_8*phi)
! l = 9, m = -7
rn(3) = 4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* &
((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * sin(7.0_8*phi)
! l = 9, m = -6
rn(4) = 3.02928976464514d-6*(w2m1)**3* &
((11486475.0_8/TWO)*w**3 - 2027025.0_8/TWO*w) * sin(6.0_8*phi)
! l = 9, m = -5
rn(5) = 2.34647776186144d-5*(w2m1)**(5.0_8/TWO)* &
((11486475.0_8/8.0_8)*w**4 - 2027025.0_8/4.0_8 * w**2 + &
135135.0_8/8.0_8) * sin(5.0_8*phi)
! l = 9, m = -4
rn(6) = 0.000196320414650061_8 * (w2m1)**2*((2297295.0_8/8.0_8)*w**5 - &
675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * sin(4.0_8*phi)
! l = 9, m = -3
rn(7) = 0.00173385495536766_8 * (w2m1)**(3.0_8/TWO)* &
((765765.0_8/16.0_8)*w**6 - 675675.0_8/16.0_8 * w**4 + &
(135135.0_8/16.0_8)*w**2 - 3465.0_8/16.0_8) * sin(3.0_8*phi)
! l = 9, m = -2
rn(8) = 0.0158910431540932_8 * (w2m1)*((109395.0_8/16.0_8)*w**7- &
135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 - 3465.0_8/16.0_8 * w)* &
sin(TWO*phi)
! l = 9, m = -1
rn(9) = 0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - &
45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 - 3465.0_8/32.0_8 * w**2 + 315.0_8/128.0_8) * sin(phi)
! l = 9, m = 0
rn(10) = 94.9609375_8 * w**9 - 201.09375_8 * w**7 + 140.765625_8 * w**5- &
36.09375_8 * w**3 + 2.4609375_8 * w
! l = 9, m = 1
rn(11) = 0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - &
45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 -3465.0_8/32.0_8 * w**2 + 315.0_8/128.0_8) * cos(phi)
! l = 9, m = 2
rn(12) = 0.0158910431540932_8 * (w2m1)*((109395.0_8/16.0_8)*w**7 - &
135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 - 3465.0_8/ 16.0_8 * w) * &
cos(TWO*phi)
! l = 9, m = 3
rn(13) = 0.00173385495536766_8 * (w2m1)**(3.0_8/TWO)*((765765.0_8/16.0_8)*w**6 - &
675675.0_8/16.0_8 * w**4 + (135135.0_8/16.0_8)*w**2 - 3465.0_8/16.0_8)* &
cos(3.0_8*phi)
! l = 9, m = 4
rn(14) = 0.000196320414650061_8 * (w2m1)**2*((2297295.0_8/8.0_8)*w**5 - &
675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * cos(4.0_8*phi)
! l = 9, m = 5
rn(15) = 2.34647776186144d-5*(w2m1)**(5.0_8/TWO)*((11486475.0_8/8.0_8)* &
w**4 - 2027025.0_8/4.0_8 * w**2 + 135135.0_8/8.0_8) * cos(5.0_8*phi)
! l = 9, m = 6
rn(16) = 3.02928976464514d-6*(w2m1)**3*((11486475.0_8/TWO)*w**3 - &
2027025.0_8/TWO*w) * cos(6.0_8*phi)
! l = 9, m = 7
rn(17) = 4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* &
((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * cos(7.0_8*phi)
! l = 9, m = 8
rn(18) = 2.58397773170915_8 * w*(w2m1)**4 * cos(8.0_8*phi)
! l = 9, m = 9
rn(19) = 0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * cos(9.0_8*phi)
case (10)
! l = 10, m = -10
rn(1) = 0.593627917136573_8 * (w2m1)**5 * sin(10.0_8*phi)
! l = 10, m = -9
rn(2) = 2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * sin(9.0_8*phi)
! l = 10, m = -8
rn(3) = 2.49953651452314d-8*(w2m1)**4*((654729075.0_8/TWO)*w**2 - &
34459425.0_8/TWO) * sin(8.0_8*phi)
! l = 10, m = -7
rn(4) = 1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* &
((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * sin(7.0_8*phi)
! l = 10, m = -6
rn(5) = 1.51464488232257d-6*(w2m1)**3*((218243025.0_8/8.0_8)*w**4 - &
34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * sin(6.0_8*phi)
! l = 10, m = -5
rn(6) = 1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* &
((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + &
(2027025.0_8/8.0_8)*w) * sin(5.0_8*phi)
! l = 10, m = -4
rn(7) = 0.000128521880085575_8 * (w2m1)**2*((14549535.0_8/16.0_8)*w**6 - &
11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - &
45045.0_8/16.0_8) * sin(4.0_8*phi)
! l = 10, m = -3
rn(8) = 0.00127230170115096_8 * (w2m1)**(3.0_8/TWO)* &
((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + &
(675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * sin(3.0_8*phi)
! l = 10, m = -2
rn(9) = 0.012974982402692_8 * (w2m1)*((2078505.0_8/128.0_8)*w**8 - &
765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 - &
45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * sin(TWO*phi)
! l = 10, m = -1
rn(10) = 0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - &
109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 - &
15015.0_8/32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * sin(phi)
! l = 10, m = 0
rn(11) = 180.42578125_8 * w**10 - 427.32421875_8 * w**8 +351.9140625_8 * w**6 - &
117.3046875_8 * w**4 + 13.53515625_8 * w**2 -0.24609375_8
! l = 10, m = 1
rn(12) = 0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - &
109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 -15015.0_8/ &
32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * cos(phi)
! l = 10, m = 2
rn(13) = 0.012974982402692_8 * (w2m1)*((2078505.0_8/128.0_8)*w**8 - &
765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 -&
45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * cos(TWO*phi)
! l = 10, m = 3
rn(14) = 0.00127230170115096_8 * (w2m1)**(3.0_8/TWO)* &
((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + &
(675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * cos(3.0_8*phi)
! l = 10, m = 4
rn(15) = 0.000128521880085575_8 * (w2m1)**2*((14549535.0_8/16.0_8)*w**6 - &
11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - &
45045.0_8/16.0_8) * cos(4.0_8*phi)
! l = 10, m = 5
rn(16) = 1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* &
((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + &
(2027025.0_8/8.0_8)*w) * cos(5.0_8*phi)
! l = 10, m = 6
rn(17) = 1.51464488232257d-6*(w2m1)**3*((218243025.0_8/8.0_8)*w**4 - &
34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * cos(6.0_8*phi)
! l = 10, m = 7
rn(18) = 1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* &
((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * cos(7.0_8*phi)
! l = 10, m = 8
rn(19) = 2.49953651452314d-8*(w2m1)**4* &
((654729075.0_8/TWO)*w**2 - 34459425.0_8/TWO) * cos(8.0_8*phi)
! l = 10, m = 9
rn(20) = 2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * cos(9.0_8*phi)
! l = 10, m = 10
rn(21) = 0.593627917136573_8 * (w2m1)**5 * cos(10.0_8*phi)
case default
rn = ONE
end select
end function calc_rn
!===============================================================================
! MAXWELL_SPECTRUM samples an energy from the Maxwell fission distribution based
! on a direct sampling scheme. The probability distribution function for a

View file

@ -36,7 +36,9 @@ module matrix_header
procedure :: copy => matrix_copy
end type matrix
#ifdef PETSC
integer :: petsc_err
#endif
contains
@ -270,6 +272,7 @@ contains
! MATRIX_SETUP_PETSC configures the row/col vectors and links to a PETSc object
!===============================================================================
#ifdef PETSC
subroutine matrix_setup_petsc(self)
class(Matrix), intent(inout) :: self ! matrix instance
@ -279,50 +282,49 @@ contains
self % col = self % col - 1
! Link to petsc
#ifdef PETSC
call MatCreateSeqAIJWithArrays(PETSC_COMM_WORLD, self % n, self % n, &
self % row, self % col, self % val, self % petsc_mat, petsc_err)
#endif
! Petsc is now active
self % petsc_active = .true.
end subroutine matrix_setup_petsc
#endif
!===============================================================================
! MATRIX_WRITE_PETSC_BINARY writes a PETSc matrix binary file
!===============================================================================
#ifdef PETSC
subroutine matrix_write_petsc_binary(self, filename)
character(*), intent(in) :: filename ! file name to write to
class(Matrix), intent(in) :: self ! matrix instance
#ifdef PETSC
type(PetscViewer) :: viewer ! a petsc viewer instance
call PetscViewerBinaryOpen(PETSC_COMM_WORLD, trim(filename), &
FILE_MODE_WRITE, viewer, petsc_err)
call MatView(self % petsc_mat, viewer, petsc_err)
call PetscViewerDestroy(viewer, petsc_err)
#endif
end subroutine matrix_write_petsc_binary
#endif
!===============================================================================
! MATRIX_TRANSPOSE uses PETSc to transpose a matrix
!===============================================================================
#ifdef PETSC
subroutine matrix_transpose(self)
class(Matrix), intent(inout) :: self ! matrix instance
#ifdef PETSC
call MatTranspose(self % petsc_mat, MAT_REUSE_MATRIX, self % petsc_mat, &
petsc_err)
#endif
end subroutine matrix_transpose
#endif
!===============================================================================
! MATRIX_VECTOR_MULTIPLY allow a vector to multiply the matrix

View file

@ -184,7 +184,7 @@ contains
write(OUTPUT_UNIT,*) ' -s, --threads Number of OpenMP threads'
write(OUTPUT_UNIT,*) ' -t, --track Write tracks for all particles'
write(OUTPUT_UNIT,*) ' -v, --version Show version information'
write(OUTPUT_UNIT,*) ' -?, --help Show this message'
write(OUTPUT_UNIT,*) ' -h, --help Show this message'
end if
end subroutine print_usage
@ -672,7 +672,7 @@ contains
integer :: j ! index in filters array
integer :: id ! user-specified id
integer :: unit_ ! unit to write to
integer :: n ! scattering order to include in name
integer :: n ! moment order to include in name
character(MAX_LINE_LEN) :: string
character(MAX_WORD_LEN) :: pn_string
type(Cell), pointer :: c => null()
@ -825,20 +825,63 @@ contains
select case (t % score_bins(j))
case (SCORE_FLUX)
string = trim(string) // ' flux'
case (SCORE_FLUX_YN)
pn_string = ' flux'
string = trim(string) // pn_string
do n = 1, t % moment_order(j)
pn_string = ' flux-y' // trim(to_str(n))
string = trim(string) // pn_string
end do
j = j + n - 1
case (SCORE_TOTAL)
string = trim(string) // ' total'
case (SCORE_TOTAL_YN)
pn_string = ' total'
string = trim(string) // pn_string
do n = 1, t % moment_order(j)
pn_string = ' total-y' // trim(to_str(n))
string = trim(string) // pn_string
end do
j = j + n - 1
case (SCORE_SCATTER)
string = trim(string) // ' scatter'
case (SCORE_NU_SCATTER)
string = trim(string) // ' nu-scatter'
case (SCORE_SCATTER_N)
pn_string = ' scatter-' // trim(to_str(t % scatt_order(j)))
pn_string = ' scatter-' // trim(to_str(t % moment_order(j)))
string = trim(string) // pn_string
case (SCORE_SCATTER_PN)
pn_string = ' scatter'
string = trim(string) // pn_string
do n = 1, t % scatt_order(j)
pn_string = ' scatter-' // trim(to_str(n))
do n = 1, t % moment_order(j)
pn_string = ' scatter-p' // trim(to_str(n))
string = trim(string) // pn_string
end do
j = j + n - 1
case (SCORE_NU_SCATTER_N)
pn_string = ' nu-scatter-' // trim(to_str(t % moment_order(j)))
string = trim(string) // pn_string
case (SCORE_NU_SCATTER_PN)
pn_string = ' nu-scatter'
string = trim(string) // pn_string
do n = 1, t % moment_order(j)
pn_string = ' nu-scatter-p' // trim(to_str(n))
string = trim(string) // pn_string
end do
j = j + n - 1
case (SCORE_SCATTER_YN)
pn_string = ' scatter'
string = trim(string) // pn_string
do n = 1, t % moment_order(j)
pn_string = ' scatter-y' // trim(to_str(n))
string = trim(string) // pn_string
end do
j = j + n - 1
case (SCORE_NU_SCATTER_YN)
pn_string = ' nu-scatter'
string = trim(string) // pn_string
do n = 1, t % moment_order(j)
pn_string = ' nu-scatter-y' // trim(to_str(n))
string = trim(string) // pn_string
end do
j = j + n - 1
@ -1614,13 +1657,14 @@ contains
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 scattering orders
integer :: n_order ! loop index for moment orders
integer :: nm_order ! loop index for Ynm moment orders
real(8) :: t_value ! t-values for confidence intervals
real(8) :: alpha ! significance level for CI
character(MAX_FILE_LEN) :: filename ! name of output file
character(15) :: filter_name(N_FILTER_TYPES) ! names of tally filters
character(27) :: score_names(N_SCORE_TYPES) ! names of scoring function
character(27) :: score_name ! names of scoring function
character(36) :: score_names(N_SCORE_TYPES) ! names of scoring function
character(36) :: score_name ! names of scoring function
! to be applied at write-time
type(TallyObject), pointer :: t
@ -1642,8 +1686,6 @@ contains
score_names(abs(SCORE_TOTAL)) = "Total Reaction Rate"
score_names(abs(SCORE_SCATTER)) = "Scattering Rate"
score_names(abs(SCORE_NU_SCATTER)) = "Scattering Production Rate"
score_names(abs(SCORE_SCATTER_N)) = ""
score_names(abs(SCORE_SCATTER_PN)) = ""
score_names(abs(SCORE_TRANSPORT)) = "Transport Rate"
score_names(abs(SCORE_N_1N)) = "(n,1n) Rate"
score_names(abs(SCORE_ABSORPTION)) = "Absorption Rate"
@ -1651,6 +1693,14 @@ contains
score_names(abs(SCORE_NU_FISSION)) = "Nu-Fission Rate"
score_names(abs(SCORE_KAPPA_FISSION)) = "Kappa-Fission Rate"
score_names(abs(SCORE_EVENTS)) = "Events"
score_names(abs(SCORE_FLUX_YN)) = "Flux Moment"
score_names(abs(SCORE_TOTAL_YN)) = "Total Reaction Rate Moment"
score_names(abs(SCORE_SCATTER_N)) = "Scattering Rate Moment"
score_names(abs(SCORE_SCATTER_PN)) = "Scattering Rate Moment"
score_names(abs(SCORE_SCATTER_YN)) = "Scattering Rate Moment"
score_names(abs(SCORE_NU_SCATTER_N)) = "Scattering Prod. Rate Moment"
score_names(abs(SCORE_NU_SCATTER_PN)) = "Scattering Prod. Rate Moment"
score_names(abs(SCORE_NU_SCATTER_YN)) = "Scattering Prod. Rate Moment"
! Create filename for tally output
filename = trim(path_output) // "tallies.out"
@ -1777,34 +1827,42 @@ contains
do l = 1, t % n_user_score_bins
k = k + 1
score_index = score_index + 1
if (t % score_bins(k) == SCORE_SCATTER_N) then
if (t % scatt_order(k) == 0) then
score_name = "Scattering Rate"
else
score_name = 'P' // trim(to_str(t % scatt_order(k))) // &
' Scattering Moment'
end if
select case(t % score_bins(k))
case (SCORE_SCATTER_N, SCORE_NU_SCATTER_N)
score_name = 'P' // trim(to_str(t % moment_order(k))) // " " // &
score_names(abs(t % score_bins(k)))
write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') &
repeat(" ", indent), score_name, &
to_str(t % results(score_index,filter_index) % sum), &
trim(to_str(t % results(score_index,filter_index) % sum_sq))
else if (t % score_bins(k) == SCORE_SCATTER_PN) then
score_name = "Scattering Rate"
write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') &
repeat(" ", indent), score_name, &
to_str(t % results(score_index,filter_index) % sum), &
trim(to_str(t % results(score_index,filter_index) % sum_sq))
do n_order = 1, t % scatt_order(k)
case (SCORE_SCATTER_PN, SCORE_NU_SCATTER_PN)
score_index = score_index - 1
do n_order = 0, t % moment_order(k)
score_index = score_index + 1
score_name = 'P' // trim(to_str(n_order)) // &
' Scattering Moment'
score_name = 'P' // trim(to_str(n_order)) // " " //&
score_names(abs(t % score_bins(k)))
write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') &
repeat(" ", indent), score_name, &
to_str(t % results(score_index,filter_index) % sum), &
trim(to_str(t % results(score_index,filter_index) % sum_sq))
end do
k = k + n_order - 1
else
k = k + t % moment_order(k)
case (SCORE_SCATTER_YN, SCORE_NU_SCATTER_YN, SCORE_FLUX_YN, &
SCORE_TOTAL_YN)
score_index = score_index - 1
do n_order = 0, t % moment_order(k)
do nm_order = -n_order, n_order
score_index = score_index + 1
score_name = 'Y' // trim(to_str(n_order)) // ',' // &
trim(to_str(nm_order)) // " " // score_names(abs(t % score_bins(k)))
write(UNIT=UNIT_TALLY, FMT='(1X,2A,1X,A,"+/- ",A)') &
repeat(" ", indent), score_name, &
to_str(t % results(score_index,filter_index) % sum), &
trim(to_str(t % results(score_index,filter_index) % sum_sq))
end do
end do
k = k + (t % moment_order(k) + 1)**2 - 1
case default
if (t % score_bins(k) > 0) then
score_name = reaction_name(t % score_bins(k))
else
@ -1814,7 +1872,7 @@ contains
repeat(" ", indent), score_name, &
to_str(t % results(score_index,filter_index) % sum), &
trim(to_str(t % results(score_index,filter_index) % sum_sq))
end if
end select
end do
indent = indent - 2

File diff suppressed because it is too large Load diff

View file

@ -30,7 +30,7 @@ module particle_header
! Pointer to next (more local) set of coordinates
type(LocalCoord), pointer :: next => null()
end type LocalCoord
!===============================================================================
! PARTICLE describes the state of a particle being transported through the
! geometry
@ -53,6 +53,7 @@ module particle_header
! Pre-collision physical data
real(8) :: last_xyz(3) ! previous coordinates
real(8) :: last_uvw(3) ! previous direction coordinates
real(8) :: last_wgt ! pre-collision particle weight
real(8) :: last_E ! pre-collision energy
real(8) :: absorb_wgt ! weight absorbed for survival biasing
@ -96,7 +97,7 @@ contains
type(LocalCoord), pointer :: coord
if (associated(coord)) then
if (associated(coord)) then
! recursively deallocate lower coordinates
if (associated(coord % next)) call deallocate_coord(coord%next)

View file

@ -1,4 +1,4 @@
module particle_restart
module particle_restart
use, intrinsic :: ISO_FORTRAN_ENV
@ -28,6 +28,7 @@ contains
subroutine run_particle_restart()
integer(8) :: particle_seed
integer :: previous_run_mode
type(Particle) :: p
! Set verbosity high
@ -37,14 +38,20 @@ contains
call p % initialize()
! Read in the restart information
call read_particle_restart(p)
call read_particle_restart(p, previous_run_mode)
! Set all tallies to 0 for now (just tracking errors)
n_tallies = 0
! Compute random number seed
particle_seed = ((current_batch - 1)*gen_per_batch + &
current_gen - 1)*n_particles + p % id
select case (previous_run_mode)
case (MODE_EIGENVALUE)
particle_seed = ((current_batch - 1)*gen_per_batch + &
current_gen - 1)*n_particles + p % id
case (MODE_FIXEDSOURCE)
particle_seed = p % id
end select
call set_particle_seed(particle_seed)
! Transport neutron
@ -59,9 +66,10 @@ contains
! READ_PARTICLE_RESTART reads the particle restart file
!===============================================================================
subroutine read_particle_restart(p)
subroutine read_particle_restart(p, previous_run_mode)
integer :: int_scalar
integer, intent(inout) :: previous_run_mode
type(Particle), intent(inout) :: p
! Write meessage
@ -79,6 +87,7 @@ contains
call pr % read_data(gen_per_batch, 'gen_per_batch')
call pr % read_data(current_gen, 'current_gen')
call pr % read_data(n_particles, 'n_particles')
call pr % read_data(previous_run_mode, 'run_mode')
call pr % read_data(p % id, 'id')
call pr % read_data(p % wgt, 'weight')
call pr % read_data(p % E, 'energy')
@ -88,6 +97,7 @@ contains
! Set particle last attributes
p % last_wgt = p % wgt
p % last_xyz = p % coord % xyz
p % last_uvw = p % coord % uvw
p % last_E = p % E
! Close hdf5 file

View file

@ -38,11 +38,17 @@ contains
filename = trim(filename) // '.binary'
#endif
!$omp critical
! Create file
call pr % file_create(filename)
! Get information about source particle
src => source_bank(current_work)
select case (run_mode)
case (MODE_EIGENVALUE)
src => source_bank(current_work)
case (MODE_FIXEDSOURCE)
src => source_site
end select
! Write data to file
call pr % write_data(FILETYPE_PARTICLE_RESTART, 'filetype')
@ -51,6 +57,7 @@ contains
call pr % write_data(gen_per_batch, 'gen_per_batch')
call pr % write_data(current_gen, 'current_gen')
call pr % write_data(n_particles, 'n_particles')
call pr % write_data(run_mode, 'run_mode')
call pr % write_data(p % id, 'id')
call pr % write_data(src % wgt, 'weight')
call pr % write_data(src % E, 'energy')
@ -59,6 +66,7 @@ contains
! Close file
call pr % file_close()
!$omp end critical
end subroutine write_particle_restart

View file

@ -36,6 +36,7 @@ contains
! Store pre-collision particle properties
p % last_wgt = p % wgt
p % last_E = p % E
p % last_uvw = p % coord0 % uvw
! Add to collision counter for particle
p % n_collision = p % n_collision + 1
@ -98,9 +99,17 @@ contains
! If survival biasing is being used, the following subroutine adjusts the
! weight of the particle. Otherwise, it checks to see if absorption occurs
call absorption(p, i_nuclide)
if (micro_xs(i_nuclide) % absorption > ZERO) then
call absorption(p, i_nuclide)
else
p % absorb_wgt = ZERO
end if
if (.not. p % alive) return
! Sample a scattering reaction and determine the secondary energy of the
! exiting neutron
call scatter(p, i_nuclide)
! Play russian roulette if survival biasing is turned on
if (survival_biasing) then
@ -108,11 +117,6 @@ contains
if (.not. p % alive) return
end if
! Sample a scattering reaction and determine the secondary energy of the
! exiting neutron
call scatter(p, i_nuclide)
end subroutine sample_reaction
!===============================================================================
@ -293,6 +297,7 @@ contains
p % last_wgt = p % wgt
else
p % wgt = ZERO
p % last_wgt = ZERO
p % alive = .false.
end if
end if
@ -866,6 +871,14 @@ contains
nu = int(nu_t) + 1
end if
! Check for fission bank size getting hit
if (n_bank + nu > size(fission_bank)) then
message = "Maximum number of sites in fission bank reached. This can &
&result in irreproducible results using different numbers of &
&processes/threads."
call warning()
end if
! Bank source neutrons
if (nu == 0 .or. n_bank == size(fission_bank)) return
p % fission = .true. ! Fission neutrons will be banked
@ -1156,7 +1169,7 @@ contains
! calculate cosine
mu0 = rxn % adist % data(lc + k)
mu1 = rxn % adist % data(lc + k+1)
mu = mu0 + (32.0_8 * xi - k) * (mu1 - mu0)
mu = mu0 + (32.0_8 * xi - k + ONE) * (mu1 - mu0)
elseif (type == ANGLE_TABULAR) then
interp = int(rxn % adist % data(lc + 1))

View file

@ -10,6 +10,7 @@ module plot
use plot_header
use ppmlib, only: Image, init_image, allocate_image, &
deallocate_image, set_pixel
use progress_header, only: ProgressBar
use string, only: to_str
implicit none
@ -109,8 +110,9 @@ contains
real(8) :: in_pixel
real(8) :: out_pixel
real(8) :: xyz(3)
type(Image) :: img
type(Particle) :: p
type(Image) :: img
type(Particle) :: p
type(ProgressBar) :: progress
! Initialize and allocate space for image
call init_image(img)
@ -149,13 +151,14 @@ contains
p % coord % universe = BASE_UNIVERSE
do y = 1, img % height
call progress % set_value(dble(y)/dble(img % height)*100.)
do x = 1, img % width
! get pixel color
call position_rgb(p, pl, rgb, id)
! Create a pixel at (x,y) with color (r,g,b)
call set_pixel(img, x, y, rgb(1), rgb(2), rgb(3))
call set_pixel(img, x-1, y-1, rgb(1), rgb(2), rgb(3))
! Advance pixel in first direction
p % coord0 % xyz(in_i) = p % coord0 % xyz(in_i) + in_pixel
@ -172,6 +175,9 @@ contains
! Free up space
call deallocate_image(img)
! Clear particle
call p % clear()
end subroutine create_ppm
!===============================================================================
@ -228,7 +234,8 @@ contains
integer :: id ! id of cell or material
real(8) :: vox(3) ! x, y, and z voxel widths
real(8) :: ll(3) ! lower left starting point for each sweep direction
type(Particle) :: p
type(Particle) :: p
type(ProgressBar) :: progress
! compute voxel widths in each direction
vox = pl % width/dble(pl % pixels)
@ -253,6 +260,7 @@ contains
ll = ll + vox / 2.0
do x = 1, pl % pixels(1)
call progress % set_value(dble(x)/dble(pl % pixels(1))*100.)
do y = 1, pl % pixels(2)
do z = 1, pl % pixels(3)

102
src/progress_header.F90 Normal file
View file

@ -0,0 +1,102 @@
module progress_header
use, intrinsic :: ISO_FORTRAN_ENV, only: OUTPUT_UNIT
implicit none
#ifdef UNIX
interface
function check_isatty(fd) bind(C, name = 'isatty')
use, intrinsic :: ISO_C_BINDING, only: c_int
integer(c_int) :: check_isatty
integer(c_int), value :: fd
end function check_isatty
end interface
#endif
!===============================================================================
! PROGRESSBAR
!===============================================================================
type ProgressBar
private
character(len=72) :: bar="???% | " // &
" |"
contains
procedure :: set_value => bar_set_value
end type ProgressBar
contains
!===============================================================================
! IS_TERMINAL checks if output is currently being output to a terminal. Relies
! on a POSIX implementation of isatty, and defaults to false if that is not
! available
!===============================================================================
function is_terminal() result(istty)
logical :: istty
istty = .true.
#ifdef UNIX
if (check_isatty(1) == 0) istty = .false.
#else
istty = .false.
#endif
end function is_terminal
!===============================================================================
! BAR_SET_VALUE prints the progress bar without advancing. The value is
! specified as percent completion, from 0 to 100. If the value is ever set to
! 100 or above, the bar is set to 100 and a newline is written.
!===============================================================================
subroutine bar_set_value(self, val)
class(ProgressBar), intent(inout) :: self
real(8), intent(in) :: val
integer :: i
if (.not. is_terminal()) return
! set the percentage
if (val >= 100.) then
write(self % bar(1:3), "(I3)") 100
else if (val <= 0.) then
write(self % bar(1:3), "(I3)") 0
else
write(self % bar(1:3), "(I3)") int(val)
end if
! set the bar width
if (val >= 100.) then
do i=1,65
write(self % bar(i+6:i+6), '(A)') '='
end do
else
do i=1,int(dble(65)*val/100.)
write(self % bar(i+6:i+6), '(A)') '='
end do
end if
write(OUTPUT_UNIT, '(A1,A1,A72)', ADVANCE='no') '+', char(13), self % bar
flush(OUTPUT_UNIT)
if (val >= 100.) then
! make new line
write(OUTPUT_UNIT, "(A)") ""
flush(OUTPUT_UNIT)
! reset the bar in case we want to use this instance again
self % bar = "???% | " // &
" |"
end if
end subroutine bar_set_value
end module progress_header

View file

@ -1,15 +1,12 @@
module random_lcg
use constants
implicit none
private
save
! Random number streams
integer, parameter :: N_STREAMS = 2
integer, parameter :: STREAM_TRACKING = 1
integer, parameter :: STREAM_TALLIES = 2
integer(8) :: prn_seed0 ! original seed
integer(8) :: prn_seed(N_STREAMS) ! current seed
integer(8) :: prn_mult ! multiplication factor, g
@ -21,7 +18,7 @@ module random_lcg
real(8) :: prn_norm ! 2^(-M)
integer :: stream ! current RNG stream
!$omp threadprivate(prn_seed)
!$omp threadprivate(prn_seed, stream)
public :: prn
public :: initialize_prng
@ -63,11 +60,13 @@ contains
integer :: i
stream = STREAM_TRACKING
prn_seed0 = seed
!$omp parallel
do i = 1, N_STREAMS
prn_seed(i) = prn_seed0 + i - 1
end do
stream = STREAM_TRACKING
!$omp end parallel
prn_mult = 2806196910506780709_8
prn_add = 1_8
prn_bits = 63

View file

@ -38,6 +38,8 @@ element settings {
attribute upper_right { list { xsd:double+ } })
}? &
element natural_elements { xsd:string { maxLength = "20" } }? &
element no_reduce { xsd:boolean }? &
element output {

View file

@ -10,7 +10,7 @@ module source
use output, only: write_message
use output_interface, only: BinaryOutput
use particle_header, only: Particle
use random_lcg, only: prn, set_particle_seed
use random_lcg, only: prn, set_particle_seed, prn_set_stream
use string, only: to_str
#ifdef MPI
@ -101,6 +101,9 @@ contains
! Set weight to one by default
site % wgt = ONE
! Set the random number generator to the source stream.
call prn_set_stream(STREAM_SOURCE)
! Sample position
select case (external_source % type_space)
case (SRC_SPACE_BOX)
@ -189,6 +192,9 @@ contains
call fatal_error()
end select
! Set the random number generator back to the tracking stream.
call prn_set_stream(STREAM_TRACKING)
end subroutine sample_external_source
!===============================================================================
@ -256,6 +262,7 @@ contains
p % coord % xyz = src % xyz
p % coord % uvw = src % uvw
p % last_xyz = src % xyz
p % last_uvw = src % uvw
p % E = src % E
p % last_E = src % E

View file

@ -16,7 +16,7 @@ module state_point
use error, only: fatal_error, warning
use global
use output, only: write_message, time_stamp
use string, only: to_str
use string, only: to_str, zero_padded, count_digits
use output_interface
use tally_header, only: TallyObject
@ -44,7 +44,7 @@ contains
! Set filename for state point
filename = trim(path_output) // 'statepoint.' // &
trim(to_str(current_batch))
& zero_padded(current_batch, count_digits(n_batches))
! Append appropriate extension
#ifdef HDF5
@ -58,7 +58,7 @@ contains
call write_message(1)
if (master) then
! Create statepoint file
! Create statepoint file
call sp % file_create(filename)
! Write file type
@ -216,12 +216,12 @@ contains
group="tallies/tally" // to_str(i), length=t % n_nuclide_bins)
deallocate(temp_array)
! Write number of score bins, score bins, and scatt order
! Write number of score bins, score bins, and moment order
call sp % write_data(t % n_score_bins, "n_score_bins", &
group="tallies/tally" // to_str(i))
call sp % write_data(t % score_bins, "score_bins", &
group="tallies/tally" // to_str(i), length=t % n_score_bins)
call sp % write_data(t % scatt_order, "scatt_order", &
call sp % write_data(t % moment_order, "moment_order", &
group="tallies/tally" // to_str(i), length=t % n_score_bins)
! Write number of user score bins
@ -305,7 +305,9 @@ contains
if (source_separate) then
! Set filename
filename = trim(path_output) // 'source.' // trim(to_str(current_batch))
filename = trim(path_output) // 'source.' // &
& zero_padded(current_batch, count_digits(n_batches))
#ifdef HDF5
filename = trim(filename) // '.h5'
#else
@ -326,7 +328,7 @@ contains
! Set filename for state point
filename = trim(path_output) // 'statepoint.' // &
trim(to_str(current_batch))
& zero_padded(current_batch, count_digits(n_batches))
#ifdef HDF5
filename = trim(filename) // '.h5'
#else
@ -409,7 +411,7 @@ contains
! Copy global tallies into temporary array for reducing
n_bins = 2 * N_GLOBAL_TALLIES
global_temp(1,:) = global_tallies(:) % sum
global_temp(2,:) = global_tallies(:) % sum_sq
global_temp(2,:) = global_tallies(:) % sum_sq
if (master) then
! The MPI_IN_PLACE specifier allows the master to copy values into a
@ -430,7 +432,7 @@ contains
tallyresult_temp(:,1) % sum = global_temp(1,:)
tallyresult_temp(:,1) % sum_sq = global_temp(2,:)
! Write out global tallies sum and sum_sq
call sp % write_tally_result(tallyresult_temp, "global_tallies", &
n1=N_GLOBAL_TALLIES, n2=1)
@ -484,7 +486,7 @@ contains
allocate(tallyresult_temp(m,n))
tallyresult_temp(:,:) % sum = tally_temp(1,:,:)
tallyresult_temp(:,:) % sum_sq = tally_temp(2,:,:)
! Write reduced tally results to file
call sp % write_tally_result(t % results, "results", &
group="tallies/tally" // to_str(i), n1=m, n2=n)
@ -525,7 +527,7 @@ contains
integer :: int_array(3)
integer, allocatable :: temp_array(:)
logical :: source_present
real(8) :: real_array(3)
real(8) :: real_array(3)
type(TallyObject), pointer :: t => null()
! Write message
@ -720,7 +722,7 @@ contains
group="tallies/tally" // to_str(i))
call sp % read_data(t % score_bins, "score_bins", &
group="tallies/tally" // to_str(i), length=t % n_score_bins)
call sp % read_data(t % scatt_order, "scatt_order", &
call sp % read_data(t % moment_order, "moment_order", &
group="tallies/tally" // to_str(i), length=t % n_score_bins)
! Write number of user score bins
@ -741,7 +743,7 @@ contains
if (path_source_point == path_state_point .and. .not. source_present) then
message = "Source bank must be contained in statepoint restart file"
call fatal_error()
end if
end if
! Read tallies to master
if (master) then
@ -779,20 +781,20 @@ contains
end if
end if
! Read source if in eigenvalue mode
! Read source if in eigenvalue mode
if (run_mode == MODE_EIGENVALUE) then
! Check if source was written out separately
if (.not. source_present) then
! Close statepoint file
! Close statepoint file
call sp % file_close()
! Write message
message = "Loading source file " // trim(path_source_point) // "..."
call write_message(1)
! Open source file
! Open source file
call sp % file_open(path_source_point, 'r', serial = .false.)
! Read file type

View file

@ -1,7 +1,7 @@
module string
use constants, only: MAX_WORDS, MAX_LINE_LEN, ERROR_INT, ERROR_REAL
use error, only: warning
use error, only: fatal_error, warning
use global, only: message
implicit none
@ -184,6 +184,39 @@ contains
end subroutine upper_case
!===============================================================================
! ZERO_PADDED returns a string of the input integer padded with zeros to the
! desired number of digits. Do not include the sign in n_digits for negative
! integers.
!===============================================================================
function zero_padded(num, n_digits) result(str)
integer, intent(in) :: num
integer, intent(in) :: n_digits
character(11) :: str
character(8) :: zp_form
! Make sure n_digits is reasonable. 10 digits is the maximum needed for the
! largest integer(4).
if (n_digits > 10) then
message = 'zero_padded called with an unreasonably large n_digits (>10)'
call fatal_error()
end if
! Write a format string of the form '(In.m)' where n is the max width and
! m is the min width. If a sign is present, then n must be one greater
! than m.
if (num < 0) then
write(zp_form, '("(I", I0, ".", I0, ")")') n_digits+1, n_digits
else
write(zp_form, '("(I", I0, ".", I0, ")")') n_digits, n_digits
end if
! Format the number.
write(str, zp_form) num
end function zero_padded
!===============================================================================
! IS_NUMBER determines whether a string of characters is all 0-9 characters
!===============================================================================
@ -268,6 +301,25 @@ contains
end function ends_with
!===============================================================================
! COUNT_DIGITS returns the number of digits needed to represent the input
! integer.
!===============================================================================
function count_digits(num) result(n_digits)
integer, intent(in) :: num
integer :: n_digits
n_digits = 1
do while (num / 10**(n_digits) /= 0 .and. abs(num / 10 **(n_digits-1)) /= 1&
&.and. n_digits /= 10)
! Note that 10 digits is the maximum needed to represent an integer(4) so
! the loop automatically exits when n_digits = 10.
n_digits = n_digits + 1
end do
end function count_digits
!===============================================================================
! INT4_TO_STR converts an integer(4) to a string.
!===============================================================================

View file

@ -4,7 +4,7 @@ module tally
use constants
use error, only: fatal_error
use global
use math, only: t_percentile, calc_pn
use math, only: t_percentile, calc_pn, calc_rn
use mesh, only: get_mesh_bin, bin_to_mesh_indices, &
get_mesh_indices, mesh_indices_to_bin, &
mesh_intersects_2d, mesh_intersects_3d
@ -41,8 +41,9 @@ contains
integer :: i_tally
integer :: j ! loop index for scoring bins
integer :: k ! loop index for nuclide bins
integer :: n ! loop index for scattering order
integer :: l ! scoring bin loop index, allowing for changing
integer :: n ! loop index for legendre order
integer :: num_nm ! Number of N,M orders in harmonic
integer :: l ! scoring bin loop index, allowing for changing
! position during the loop
integer :: filter_index ! single index for single bin
integer :: score_bin ! scoring bin, e.g. SCORE_FLUX
@ -139,7 +140,51 @@ contains
! estimator since there is no way to count 'events' exactly for
! the flux
score = last_wgt / material_xs % total
if (survival_biasing) then
! We need to account for the fact that some weight was already
! absorbed
score = last_wgt + p % absorb_wgt
else
score = last_wgt
end if
score = score / material_xs % total
case (SCORE_FLUX_YN)
! All events score to a flux bin. We actually use a collision
! estimator since there is no way to count 'events' exactly for
! the flux
score_index = score_index - 1
! get the score
if (survival_biasing) then
! We need to account for the fact that some weight was already
! absorbed
score = last_wgt + p % absorb_wgt
else
score = last_wgt
end if
score = score / material_xs % total
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % last_uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_TOTAL)
! All events will score to the total reaction rate. We can just
@ -154,6 +199,41 @@ contains
score = last_wgt
end if
case (SCORE_TOTAL_YN)
! All events will score to the total reaction rate. We can just
! use the weight of the particle entering the collision as the
! score
score_index = score_index - 1
! get the score
if (survival_biasing) then
! We need to account for the fact that some weight was already
! absorbed
score = last_wgt + p % absorb_wgt
else
score = last_wgt
end if
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % last_uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_SCATTER)
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) cycle SCORE_LOOP
@ -164,7 +244,7 @@ contains
score = last_wgt
case (SCORE_NU_SCATTER)
case (SCORE_NU_SCATTER)
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) cycle SCORE_LOOP
@ -173,7 +253,7 @@ contains
! reaction with neutrons in the exit channel
score = wgt
case (SCORE_SCATTER_N)
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) cycle SCORE_LOOP
@ -181,33 +261,129 @@ contains
! Find the scattering order for a singly requested moment, and
! store its moment contribution.
if (t % scatt_order(j) == 1) then
if (t % moment_order(j) == 1) then
score = last_wgt * mu ! avoid function call overhead
else
score = last_wgt * calc_pn(t % scatt_order(j), mu)
score = last_wgt * calc_pn(t % moment_order(j), mu)
endif
case (SCORE_SCATTER_PN)
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) then
j = j + t % scatt_order(j)
j = j + t % moment_order(j)
cycle SCORE_LOOP
end if
score_index = score_index - 1
! Find the scattering order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % scatt_order(j)
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + 1
! get the score and tally it
score = last_wgt * calc_pn(n, mu)
!$omp critical
t % results(score_index, filter_index) % value = &
t % results(score_index, filter_index) % value + score
!$omp end critical
end do
j = j + t % scatt_order(j)
j = j + t % moment_order(j)
cycle SCORE_LOOP
case (SCORE_SCATTER_YN)
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) then
j = j + t % moment_order(j)
cycle SCORE_LOOP
end if
score_index = score_index - 1
! Calculate the number of moments from t % moment_order
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! get the score of the scattering moment
score = last_wgt * calc_pn(n, mu)
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % last_uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_NU_SCATTER_N)
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) cycle SCORE_LOOP
! Find the scattering order for a singly requested moment, and
! store its moment contribution.
if (t % moment_order(j) == 1) then
score = wgt * mu ! avoid function call overhead
else
score = wgt * calc_pn(t % moment_order(j), mu)
endif
case (SCORE_NU_SCATTER_PN)
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) then
j = j + t % moment_order(j)
cycle SCORE_LOOP
end if
score_index = score_index - 1
! Find the scattering order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + 1
! get the score and tally it
score = wgt * calc_pn(n, mu)
!$omp critical
t % results(score_index, filter_index) % value = &
t % results(score_index, filter_index) % value + score
!$omp end critical
end do
j = j + t % moment_order(j)
cycle SCORE_LOOP
case (SCORE_NU_SCATTER_YN)
! Skip any event where the particle didn't scatter
if (p % event /= EVENT_SCATTER) then
j = j + t % moment_order(j)
cycle SCORE_LOOP
end if
score_index = score_index - 1
! Calculate the number of moments from t % moment_order
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! get the score of the scattering moment
score = wgt * calc_pn(n, mu)
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % last_uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_TRANSPORT)
@ -220,7 +396,7 @@ contains
! Score total rate - p1 scatter rate Note estimator needs to be
! adjusted since tallying is only occuring when a scatter has
! happend. Effectively this means multiplying the estimator by
! happened. Effectively this means multiplying the estimator by
! total/scatter macro
score = (macro_total - mu*macro_scatt)*(ONE/macro_scatt)
@ -257,18 +433,23 @@ contains
! calculate fraction of absorptions that would have resulted in
! fission
score = p % absorb_wgt * micro_xs(p % event_nuclide) % fission / &
micro_xs(p % event_nuclide) % absorption
if (micro_xs(p % event_nuclide) % absorption > ZERO) then
score = p % absorb_wgt * micro_xs(p % event_nuclide) % fission / &
micro_xs(p % event_nuclide) % absorption
else
score = ZERO
end if
else
! Skip any non-fission events
if (.not. p % fission) cycle SCORE_LOOP
! Skip any non-absorption events
if (p % event == EVENT_SCATTER) cycle SCORE_LOOP
! All fission events will contribute, so again we can use
! particle's weight entering the collision as the estimate for the
! fission reaction rate
score = last_wgt
score = last_wgt * micro_xs(p % event_nuclide) % fission / &
micro_xs(p % event_nuclide) % absorption
end if
case (SCORE_NU_FISSION)
@ -277,8 +458,25 @@ contains
! calculate fraction of absorptions that would have resulted in
! nu-fission
score = p % absorb_wgt * micro_xs(p % event_nuclide) % &
nu_fission / micro_xs(p % event_nuclide) % absorption
if (t % find_filter(FILTER_ENERGYOUT) > 0) then
! Normally, we only need to make contributions to one scoring
! bin. However, in the case of fission, since multiple fission
! neutrons were emitted with different energies, multiple
! outgoing energy bins may have been scored to. The following
! logic treats this special case and results to multiple bins
call score_fission_eout(p, t, score_index)
cycle SCORE_LOOP
else
if (micro_xs(p % event_nuclide) % absorption > ZERO) then
score = p % absorb_wgt * micro_xs(p % event_nuclide) % &
nu_fission / micro_xs(p % event_nuclide) % absorption
else
score = ZERO
end if
end if
else
! Skip any non-fission events
@ -305,28 +503,31 @@ contains
end if
end if
case (SCORE_KAPPA_FISSION)
if (survival_biasing) then
! No fission events occur if survival biasing is on -- need to
! calculate fraction of absorptions that would have resulted in
! fission and multiply by Q
! fission scale by kappa-fission
if (micro_xs(p % event_nuclide) % absorption > ZERO) then
score = p % absorb_wgt * &
micro_xs(p % event_nuclide) % kappa_fission / &
micro_xs(p % event_nuclide) % absorption
else
score = ZERO
end if
score = p % absorb_wgt * &
micro_xs(p % event_nuclide) % kappa_fission / &
micro_xs(p % event_nuclide) % absorption
else
! Skip any non-fission events
if (.not. p % fission) cycle SCORE_LOOP
! Skip any non-absorption events
if (p % event == EVENT_SCATTER) cycle SCORE_LOOP
! All fission events will contribute, so again we can use
! particle's weight entering the collision as the estimate for
! the fission energy production rate
n = nuclides(p % event_nuclide) % index_fission(1)
score = last_wgt * &
nuclides(p % event_nuclide) % reactions(n) % Q_value
micro_xs(p % event_nuclide) % kappa_fission / &
micro_xs(p % event_nuclide) % absorption
end if
case (SCORE_EVENTS)
! Simply count number of scoring events
@ -383,7 +584,7 @@ contains
integer :: k ! loop index for bank sites
integer :: bin_energyout ! original outgoing energy bin
integer :: i_filter ! index for matching filter bin combination
real(8) :: score ! actualy score
real(8) :: score ! actual score
real(8) :: E_out ! energy of fission bank site
! save original outgoing energy bin and score index
@ -446,6 +647,9 @@ contains
integer :: k ! loop index for nuclide bins
integer :: l ! loop index for nuclides in material
integer :: m ! loop index for reactions
integer :: n ! loop index for legendre order
integer :: num_nm ! Number of N,M orders in harmonic
integer :: q ! loop index for scoring bins
integer :: filter_index ! single index for single bin
integer :: i_nuclide ! index in nuclides array (from bins)
integer :: i_nuc ! index in nuclides array (from material)
@ -498,7 +702,9 @@ contains
filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1
if (t % all_nuclides) then
call score_all_nuclides(p, i_tally, flux, filter_index)
if (p % material /= MATERIAL_VOID) then
call score_all_nuclides(p, i_tally, flux, filter_index)
end if
else
NUCLIDE_BIN_LOOP: do k = 1, t % n_nuclide_bins
@ -506,30 +712,39 @@ contains
i_nuclide = t % nuclide_bins(k)
if (i_nuclide > 0) then
! Get pointer to current material
mat => materials(p % material)
if (p % material /= MATERIAL_VOID) then
! Get pointer to current material
mat => materials(p % material)
! Determine if nuclide is actually in material
NUCLIDE_MAT_LOOP: do j = 1, mat % n_nuclides
! If index of nuclide matches the j-th nuclide listed in the
! material, break out of the loop
if (i_nuclide == mat % nuclide(j)) exit
! Determine if nuclide is actually in material
NUCLIDE_MAT_LOOP: do j = 1, mat % n_nuclides
! If index of nuclide matches the j-th nuclide listed in the
! material, break out of the loop
if (i_nuclide == mat % nuclide(j)) exit
! If we've reached the last nuclide in the material, it means
! the specified nuclide to be tallied is not in this material
if (j == mat % n_nuclides) then
cycle NUCLIDE_BIN_LOOP
end if
end do NUCLIDE_MAT_LOOP
! If we've reached the last nuclide in the material, it means
! the specified nuclide to be tallied is not in this material
if (j == mat % n_nuclides) then
cycle NUCLIDE_BIN_LOOP
end if
end do NUCLIDE_MAT_LOOP
atom_density = mat % atom_density(j)
atom_density = mat % atom_density(j)
else
atom_density = ZERO
end if
end if
! Determine score for each bin
SCORE_LOOP: do j = 1, t % n_score_bins
j = 0
SCORE_LOOP: do q = 1, t % n_user_score_bins
j = j + 1
! determine what type of score bin
score_bin = t % score_bins(j)
! determine scoring bin index
score_index = (k - 1)*t % n_score_bins + j
if (i_nuclide > 0) then
! ================================================================
! DETERMINE NUCLIDE CROSS SECTION
@ -539,11 +754,58 @@ contains
! For flux, we need no cross section
score = flux
case (SCORE_FLUX_YN)
score_index = score_index - 1
! For flux, we need no cross section
score = flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_TOTAL)
! Total cross section is pre-calculated
score = micro_xs(i_nuclide) % total * &
atom_density * flux
case (SCORE_TOTAL_YN)
score_index = score_index - 1
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_SCATTER)
! Scattering cross section is pre-calculated
score = (micro_xs(i_nuclide) % total - &
@ -623,10 +885,60 @@ contains
! For flux, we need no cross section
score = flux
case (SCORE_FLUX_YN)
score_index = score_index - 1
! For flux, we need no cross section
score = flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_TOTAL)
! Total cross section is pre-calculated
score = material_xs % total * flux
case (SCORE_TOTAL_YN)
score_index = score_index - 1
! Total cross section is pre-calculated
score = material_xs % total * flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_SCATTER)
! Scattering cross section is pre-calculated
score = (material_xs % total - material_xs % absorption) * flux
@ -665,7 +977,7 @@ contains
do l = 1, mat % n_nuclides
! Get atom density
atom_density = mat % atom_density(l)
! Get index in nuclides array
i_nuc = mat % nuclide(l)
@ -703,9 +1015,6 @@ contains
end select
end if
! Determine scoring bin index
score_index = (k - 1)*t % n_score_bins + j
! Add score to tally
!$omp critical
t % results(score_index, filter_index) % value = &
@ -746,6 +1055,9 @@ contains
integer :: i ! loop index for nuclides in material
integer :: j ! loop index for scoring bin types
integer :: m ! loop index for reactions in nuclide
integer :: n ! loop index for legendre order
integer :: num_nm ! Number of N,M orders in harmonic
integer :: q ! loop index for scoring bins
integer :: i_nuclide ! index in nuclides array
integer :: score_bin ! type of score, e.g. SCORE_FLUX
integer :: score_index ! scoring bin index
@ -776,18 +1088,73 @@ contains
atom_density = mat % atom_density(i)
! Loop over score types for each bin
SCORE_LOOP: do j = 1, t % n_score_bins
j = 0
SCORE_LOOP: do q = 1, t % n_user_score_bins
j = j + 1
! determine what type of score bin
score_bin = t % score_bins(j)
! Determine macroscopic nuclide cross section
! Determine scoring bin index based on what the index of the nuclide
! is in the nuclides array
score_index = (i_nuclide - 1)*t % n_score_bins + j
! Determine macroscopic nuclide cross section
select case(score_bin)
case (SCORE_FLUX)
score = flux
case (SCORE_FLUX_YN)
score_index = score_index - 1
! For flux, we need no cross section
score = flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_TOTAL)
score = micro_xs(i_nuclide) % total * atom_density * flux
case (SCORE_TOTAL_YN)
score_index = score_index - 1
score = micro_xs(i_nuclide) % total * atom_density * flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_SCATTER)
score = (micro_xs(i_nuclide) % total - &
micro_xs(i_nuclide) % absorption) * atom_density * flux
@ -812,7 +1179,7 @@ contains
! sections that are used often (e.g. n2n, ngamma, etc. for depletion),
! it might make sense to optimize this section or pre-calculate cross
! sections
if (score_bin > 1) then
! Set default score
score = ZERO
@ -847,10 +1214,6 @@ contains
end if
end select
! Determine scoring bin index based on what the index of the nuclide
! is in the nuclides array
score_index = (i_nuclide - 1)*t % n_score_bins + j
! Add score to tally
!$omp critical
t % results(score_index, filter_index) % value = &
@ -865,18 +1228,74 @@ contains
! SCORE TOTAL MATERIAL REACTION RATES
! Loop over score types for each bin
MATERIAL_SCORE_LOOP: do j = 1, t % n_score_bins
j = 0
MATERIAL_SCORE_LOOP: do q = 1, t % n_user_score_bins
j = j + 1
! determine what type of score bin
score_bin = t % score_bins(j)
! Determine macroscopic material cross section
! Determine scoring bin index based on what the index of the nuclide
! is in the nuclides array
score_index = n_nuclides_total*t % n_score_bins + j
! Determine macroscopic material cross section
select case(score_bin)
case (SCORE_FLUX)
score = flux
case (SCORE_FLUX_YN)
score_index = score_index - 1
! For flux, we need no cross section
score = flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle MATERIAL_SCORE_LOOP
case (SCORE_TOTAL)
score = material_xs % total * flux
case (SCORE_TOTAL_YN)
score_index = score_index - 1
! Total cross section is pre-calculated
score = material_xs % total * flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle MATERIAL_SCORE_LOOP
case (SCORE_SCATTER)
score = (material_xs % total - material_xs % absorption) * flux
@ -899,7 +1318,7 @@ contains
! Any other cross section has to be calculated on-the-fly. This is
! somewhat costly since it requires a loop over each nuclide in a
! material and each reaction in the nuclide
if (score_bin > 1) then
! Set default score
score = ZERO
@ -947,10 +1366,6 @@ contains
end if
end select
! Determine scoring bin index based on what the index of the nuclide
! is in the nuclides array
score_index = n_nuclides_total*t % n_score_bins + j
! Add score to tally
!$omp critical
t % results(score_index, filter_index) % value = &
@ -977,6 +1392,9 @@ contains
integer :: j ! loop index for direction
integer :: k ! loop index for mesh cell crossings
integer :: b ! loop index for nuclide bins
integer :: n ! loop index for legendre order
integer :: num_nm ! Number of N,M orders in harmonic
integer :: q ! loop index for scoring bins
integer :: ijk0(3) ! indices of starting coordinates
integer :: ijk1(3) ! indices of ending coordinates
integer :: ijk_cross(3) ! indices of mesh cell crossed
@ -1167,48 +1585,110 @@ contains
filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1
if (t % all_nuclides) then
! Score reaction rates for each nuclide in material
call score_all_nuclides(p, i_tally, flux, filter_index)
if (p % material /= MATERIAL_VOID) then
! Score reaction rates for each nuclide in material
call score_all_nuclides(p, i_tally, flux, filter_index)
end if
else
NUCLIDE_BIN_LOOP: do b = 1, t % n_nuclide_bins
! Get index of nuclide in nuclides array
i_nuclide = t % nuclide_bins(b)
if (i_nuclide > 0) then
! Get pointer to current material
mat => materials(p % material)
if (p % material /= MATERIAL_VOID) then
! Get pointer to current material
mat => materials(p % material)
! Determine if nuclide is actually in material
NUCLIDE_MAT_LOOP: do j = 1, mat % n_nuclides
! If index of nuclide matches the j-th nuclide listed in
! the material, break out of the loop
if (i_nuclide == mat % nuclide(j)) exit
! Determine if nuclide is actually in material
NUCLIDE_MAT_LOOP: do j = 1, mat % n_nuclides
! If index of nuclide matches the j-th nuclide listed in
! the material, break out of the loop
if (i_nuclide == mat % nuclide(j)) exit
! If we've reached the last nuclide in the material, it
! means the specified nuclide to be tallied is not in this
! material
if (j == mat % n_nuclides) then
cycle NUCLIDE_BIN_LOOP
end if
end do NUCLIDE_MAT_LOOP
! If we've reached the last nuclide in the material, it
! means the specified nuclide to be tallied is not in this
! material
if (j == mat % n_nuclides) then
cycle NUCLIDE_BIN_LOOP
end if
end do NUCLIDE_MAT_LOOP
atom_density = mat % atom_density(j)
atom_density = mat % atom_density(j)
else
atom_density = ZERO
end if
end if
! Determine score for each bin
SCORE_LOOP: do j = 1, t % n_score_bins
j = 0
SCORE_LOOP: do q = 1, t % n_user_score_bins
j = j + 1
! determine what type of score bin
score_bin = t % score_bins(j)
! Determine scoring bin index
score_index = (b - 1)*t % n_score_bins + j
if (i_nuclide > 0) then
! Determine macroscopic nuclide cross section
! Determine macroscopic nuclide cross section
select case(score_bin)
case (SCORE_FLUX)
score = flux
case (SCORE_FLUX_YN)
score_index = score_index - 1
score = flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_TOTAL)
score = micro_xs(i_nuclide) % total * &
atom_density * flux
case (SCORE_TOTAL_YN)
score_index = score_index - 1
! Total cross section is pre-calculated
score = micro_xs(i_nuclide) % total * &
atom_density * flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_SCATTER)
score = (micro_xs(i_nuclide) % total - &
micro_xs(i_nuclide) % absorption) * &
@ -1233,12 +1713,63 @@ contains
end select
else
! Determine macroscopic material cross section
! Determine macroscopic material cross section
select case(score_bin)
case (SCORE_FLUX)
score = flux
case (SCORE_FLUX_YN)
score_index = score_index - 1
score = flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_TOTAL)
score = material_xs % total * flux
case (SCORE_TOTAL_YN)
score_index = score_index - 1
! Total cross section is pre-calculated
score = material_xs % total * flux
num_nm = 1
! Find the order for a collection of requested moments
! and store the moment contribution of each
do n = 0, t % moment_order(j)
! determine scoring bin index
score_index = score_index + num_nm
! Update number of total n,m bins for this n (m = [-n: n])
num_nm = 2 * n + 1
! multiply score by the angular flux moments and store
!$omp critical
t % results(score_index: score_index + num_nm - 1, filter_index) % value = &
t % results(score_index: score_index + num_nm - 1, filter_index) % value + &
score * calc_rn(n, p % coord0 % uvw)
!$omp end critical
end do
j = j + (t % moment_order(j) + 1)**2 - 1
cycle SCORE_LOOP
case (SCORE_SCATTER)
score = (material_xs % total - material_xs % absorption) * flux
case (SCORE_ABSORPTION)
@ -1258,9 +1789,6 @@ contains
end select
end if
! Determine scoring bin index
score_index = (b - 1)*t % n_score_bins + j
! Add score to tally
!$omp critical
t % results(score_index, filter_index) % value = &

View file

@ -47,7 +47,7 @@ module tally_header
!===============================================================================
! TALLYFILTER describes a filter that limits what events score to a tally. For
! example, a cell filter indicates that only particles in a specified cell
! should score to the tally.
! should score to the tally.
!===============================================================================
type TallyFilter
@ -55,7 +55,7 @@ module tally_header
integer :: n_bins = 0
integer, allocatable :: int_bins(:)
real(8), allocatable :: real_bins(:) ! Only used for energy filters
! Type-Bound procedures
contains
procedure :: clear => tallyfilter_clear ! Deallocates TallyFilter
@ -105,7 +105,7 @@ module tally_header
! scattering response.
integer :: n_score_bins = 0
integer, allocatable :: score_bins(:)
integer, allocatable :: scatt_order(:)
integer, allocatable :: moment_order(:)
integer :: n_user_score_bins = 0
! Results for each bin -- the first dimension of the array is for scores
@ -122,14 +122,14 @@ module tally_header
! Number of realizations of tally random variables
integer :: n_realizations = 0
! Type-Bound procedures
contains
procedure :: clear => tallyobject_clear ! Deallocates TallyObject
end type TallyObject
contains
!===============================================================================
! TALLYFILTER_CLEAR deallocates a TallyFilter element and sets it to its as
! initialized state.
@ -137,16 +137,16 @@ module tally_header
subroutine tallyfilter_clear(this)
class(TallyFilter), intent(inout) :: this ! The TallyFilter to be cleared
this % type = NONE
this % n_bins = 0
if (allocated(this % int_bins)) &
deallocate(this % int_bins)
if (allocated(this % real_bins)) &
deallocate(this % real_bins)
end subroutine tallyfilter_clear
!===============================================================================
! TALLYOBJECT_CLEAR deallocates a TallyObject element and sets it to its as
! initialized state.
@ -154,44 +154,44 @@ module tally_header
subroutine tallyobject_clear(this)
class(TallyObject), intent(inout) :: this ! The TallyObject to be cleared
integer :: i ! Loop Index
! This routine will go through each item in TallyObject and set the value
! to its default, as-initialized values, including deallocations.
this % label = ""
if (allocated(this % filters)) then
do i = 1, size(this % filters)
call this % filters(i) % clear()
end do
deallocate(this % filters)
end if
if (allocated(this % stride)) &
deallocate(this % stride)
this % find_filter = 0
this % n_nuclide_bins = 0
if (allocated(this % nuclide_bins)) &
deallocate(this % nuclide_bins)
this % all_nuclides = .false.
this % n_score_bins = 0
if (allocated(this % score_bins)) &
deallocate(this % score_bins)
if (allocated(this % scatt_order)) &
deallocate(this % scatt_order)
if (allocated(this % moment_order)) &
deallocate(this % moment_order)
this % n_user_score_bins = 0
if (allocated(this % results)) &
deallocate(this % results)
this % reset = .false.
this % n_realizations = 0
end subroutine tallyobject_clear
end module tally_header

View file

@ -66,7 +66,7 @@ contains
total_weight = total_weight + p % wgt
!$omp end critical
! Force calculation of cross-sections by setting last energy to zero
! Force calculation of cross-sections by setting last energy to zero
micro_xs % last_E = ZERO
! Prepare to write out particle track.

View file

@ -1,291 +0,0 @@
# IUPAC Isotopic Compositions of the Element 2009
# Pure. Appl. Chem., Vol 83, No. 2, pp. 397-410 (2011)
# doi:10.1351/PAC-REP-10-06-02
1 H 1 0.999885
1 H 2 0.000115
2 He 3 1.34e-06
2 He 4 0.99999866
3 Li 6 0.0759
3 Li 7 0.9241
4 Be 9 1.0
5 B 10 0.199
5 B 11 0.801
6 C 12 0.9893
6 C 13 0.0107
7 N 14 0.99636
7 N 15 0.00364
8 O 16 0.99757
8 O 17 0.00038
8 O 18 0.00205
9 F 19 1.0
10 Ne 20 0.9048
10 Ne 21 0.0027
10 Ne 22 0.0925
11 Na 23 1.0
12 Mg 24 0.7899
12 Mg 25 0.1
12 Mg 26 0.1101
13 Al 27 1.0
14 Si 28 0.92223
14 Si 29 0.04685
14 Si 30 0.03092
15 P 31 1.0
16 S 32 0.9499
16 S 33 0.0075
16 S 34 0.0425
16 S 36 0.0001
17 Cl 35 0.7576
17 Cl 37 0.2424
18 Ar 36 0.003336
18 Ar 38 0.000629
18 Ar 40 0.996035
19 K 39 0.932581
19 K 40 0.000117
19 K 41 0.067302
20 Ca 40 0.96941
20 Ca 42 0.00647
20 Ca 43 0.00135
20 Ca 44 0.02086
20 Ca 46 4e-05
20 Ca 48 0.00187
21 Sc 45 1.0
22 Ti 46 0.0825
22 Ti 47 0.0744
22 Ti 48 0.7372
22 Ti 49 0.0541
22 Ti 50 0.0518
23 V 50 0.0025
23 V 51 0.9975
24 Cr 50 0.04345
24 Cr 52 0.83789
24 Cr 53 0.09501
24 Cr 54 0.02365
25 Mn 55 1.0
26 Fe 54 0.05845
26 Fe 56 0.91754
26 Fe 57 0.02119
26 Fe 58 0.00282
27 Co 59 1.0
28 Ni 58 0.68077
28 Ni 60 0.26223
28 Ni 61 0.011399
28 Ni 62 0.036346
28 Ni 64 0.009255
29 Cu 63 0.6915
29 Cu 65 0.3085
30 Zn 64 0.4917
30 Zn 66 0.2773
30 Zn 67 0.0404
30 Zn 68 0.1845
30 Zn 70 0.0061
31 Ga 69 0.60108
31 Ga 71 0.39892
32 Ge 70 0.2057
32 Ge 72 0.2745
32 Ge 73 0.0775
32 Ge 74 0.3650
32 Ge 76 0.0773
33 As 75 1.0
34 Se 74 0.0089
34 Se 76 0.0937
34 Se 77 0.0763
34 Se 78 0.2377
34 Se 80 0.4961
34 Se 82 0.0873
35 Br 79 0.5069
35 Br 81 0.4931
36 Kr 78 0.00355
36 Kr 80 0.02286
36 Kr 82 0.11593
36 Kr 83 0.11500
36 Kr 84 0.56987
36 Kr 86 0.17279
37 Rb 85 0.7217
37 Rb 87 0.2783
38 Sr 84 0.0056
38 Sr 86 0.0986
38 Sr 87 0.07
38 Sr 88 0.8258
39 Y 89 1.0
40 Zr 90 0.5145
40 Zr 91 0.1122
40 Zr 92 0.1715
40 Zr 94 0.1738
40 Zr 96 0.028
41 Nb 93 1.0
42 Mo 92 0.1453
42 Mo 94 0.0915
42 Mo 95 0.1584
42 Mo 96 0.1667
42 Mo 97 0.0960
42 Mo 98 0.2439
42 Mo 100 0.0982
44 Ru 96 0.0554
44 Ru 98 0.0187
44 Ru 99 0.1276
44 Ru 100 0.126
44 Ru 101 0.1706
44 Ru 102 0.3155
44 Ru 104 0.1862
45 Rh 103 1.0
46 Pd 102 0.0102
46 Pd 104 0.1114
46 Pd 105 0.2233
46 Pd 106 0.2733
46 Pd 108 0.2646
46 Pd 110 0.1172
47 Ag 107 0.51839
47 Ag 109 0.48161
48 Cd 106 0.0125
48 Cd 108 0.0089
48 Cd 110 0.1249
48 Cd 111 0.128
48 Cd 112 0.2413
48 Cd 113 0.1222
48 Cd 114 0.2873
48 Cd 116 0.0749
49 In 113 0.0429
49 In 115 0.9571
50 Sn 112 0.0097
50 Sn 114 0.0066
50 Sn 115 0.0034
50 Sn 116 0.1454
50 Sn 117 0.0768
50 Sn 118 0.2422
50 Sn 119 0.0859
50 Sn 120 0.3258
50 Sn 122 0.0463
50 Sn 124 0.0579
51 Sb 121 0.5721
51 Sb 123 0.4279
52 Te 120 0.0009
52 Te 122 0.0255
52 Te 123 0.0089
52 Te 124 0.0474
52 Te 125 0.0707
52 Te 126 0.1884
52 Te 128 0.3174
52 Te 130 0.3408
53 I 127 1.0
54 Xe 124 0.000952
54 Xe 126 0.000890
54 Xe 128 0.019102
54 Xe 129 0.264006
54 Xe 130 0.040710
54 Xe 131 0.212324
54 Xe 132 0.269086
54 Xe 134 0.104357
54 Xe 136 0.088573
55 Cs 133 1.0
56 Ba 130 0.00106
56 Ba 132 0.00101
56 Ba 134 0.02417
56 Ba 135 0.06592
56 Ba 136 0.07854
56 Ba 137 0.11232
56 Ba 138 0.71698
57 La 138 0.0008881
57 La 139 0.9991119
58 Ce 136 0.00185
58 Ce 138 0.00251
58 Ce 140 0.8845
58 Ce 142 0.11114
59 Pr 141 1.0
60 Nd 142 0.27152
60 Nd 143 0.12174
60 Nd 144 0.23798
60 Nd 145 0.08293
60 Nd 146 0.17189
60 Nd 148 0.05756
60 Nd 150 0.05638
62 Sm 144 0.0307
62 Sm 147 0.1499
62 Sm 148 0.1124
62 Sm 149 0.1382
62 Sm 150 0.0738
62 Sm 152 0.2675
62 Sm 154 0.2275
63 Eu 151 0.4781
63 Eu 153 0.5219
64 Gd 152 0.002
64 Gd 154 0.0218
64 Gd 155 0.148
64 Gd 156 0.2047
64 Gd 157 0.1565
64 Gd 158 0.2484
64 Gd 160 0.2186
65 Tb 159 1.0
66 Dy 156 0.00056
66 Dy 158 0.00095
66 Dy 160 0.02329
66 Dy 161 0.18889
66 Dy 162 0.25475
66 Dy 163 0.24896
66 Dy 164 0.28260
67 Ho 165 1.0
68 Er 162 0.00139
68 Er 164 0.01601
68 Er 166 0.33503
68 Er 167 0.22869
68 Er 168 0.26978
68 Er 170 0.14910
69 Tm 169 1.0
70 Yb 168 0.00123
70 Yb 170 0.02982
70 Yb 171 0.1409
70 Yb 172 0.2168
70 Yb 173 0.16103
70 Yb 174 0.32026
70 Yb 176 0.12996
71 Lu 175 0.97401
71 Lu 176 0.02599
72 Hf 174 0.0016
72 Hf 176 0.0526
72 Hf 177 0.186
72 Hf 178 0.2728
72 Hf 179 0.1362
72 Hf 180 0.3508
73 Ta 180 0.0001201
73 Ta 181 0.9998799
74 W 180 0.0012
74 W 182 0.265
74 W 183 0.1431
74 W 184 0.3064
74 W 186 0.2843
75 Re 185 0.374
75 Re 187 0.626
76 Os 184 0.0002
76 Os 186 0.0159
76 Os 187 0.0196
76 Os 188 0.1324
76 Os 189 0.1615
76 Os 190 0.2626
76 Os 192 0.4078
77 Ir 191 0.373
77 Ir 193 0.627
78 Pt 190 0.00012
78 Pt 192 0.00782
78 Pt 194 0.3286
78 Pt 195 0.3378
78 Pt 196 0.2521
78 Pt 198 0.07356
79 Au 197 1.0
80 Hg 196 0.0015
80 Hg 198 0.0997
80 Hg 199 0.1687
80 Hg 200 0.231
80 Hg 201 0.1318
80 Hg 202 0.2986
80 Hg 204 0.0687
81 Tl 203 0.2952
81 Tl 205 0.7048
82 Pb 204 0.014
82 Pb 206 0.241
82 Pb 207 0.221
82 Pb 208 0.524
83 Bi 209 1.0
90 Th 232 1.0
91 Pa 231 1.0
92 U 234 5.4e-05
92 U 235 0.007204
92 U 238 0.992742

View file

@ -1,286 +0,0 @@
# IUPAC Isotopic Compositions of the Element 2009
# Pure. Appl. Chem., Vol 83, No. 2, pp. 397-410 (2011)
# doi:10.1351/PAC-REP-10-06-02
# Modified to use only nuclides which exist in ENDF/B-VII.1
1 H 1 0.999885
1 H 2 0.000115
2 He 3 1.34e-06
2 He 4 0.99999866
3 Li 6 0.0759
3 Li 7 0.9241
4 Be 9 1.0
5 B 10 0.199
5 B 11 0.801
6 C Nat 1.0
7 N 14 0.99636
7 N 15 0.00364
8 O 16 0.99757
8 O 17 0.00038
8 O 18 0.00205
9 F 19 1.0
10 Ne 20 0.9048
10 Ne 21 0.0027
10 Ne 22 0.0925
11 Na 23 1.0
12 Mg 24 0.7899
12 Mg 25 0.1
12 Mg 26 0.1101
13 Al 27 1.0
14 Si 28 0.92223
14 Si 29 0.04685
14 Si 30 0.03092
15 P 31 1.0
16 S 32 0.9499
16 S 33 0.0075
16 S 34 0.0425
16 S 36 0.0001
17 Cl 35 0.7576
17 Cl 37 0.2424
18 Ar 36 0.003336
18 Ar 38 0.000629
18 Ar 40 0.996035
19 K 39 0.932581
19 K 40 0.000117
19 K 41 0.067302
20 Ca 40 0.96941
20 Ca 42 0.00647
20 Ca 43 0.00135
20 Ca 44 0.02086
20 Ca 46 4e-05
20 Ca 48 0.00187
21 Sc 45 1.0
22 Ti 46 0.0825
22 Ti 47 0.0744
22 Ti 48 0.7372
22 Ti 49 0.0541
22 Ti 50 0.0518
23 V Nat 1.0
24 Cr 50 0.04345
24 Cr 52 0.83789
24 Cr 53 0.09501
24 Cr 54 0.02365
25 Mn 55 1.0
26 Fe 54 0.05845
26 Fe 56 0.91754
26 Fe 57 0.02119
26 Fe 58 0.00282
27 Co 59 1.0
28 Ni 58 0.68077
28 Ni 60 0.26223
28 Ni 61 0.011399
28 Ni 62 0.036346
28 Ni 64 0.009255
29 Cu 63 0.6915
29 Cu 65 0.3085
30 Zn Nat 1.0
31 Ga 69 0.60108
31 Ga 71 0.39892
32 Ge 70 0.2057
32 Ge 72 0.2745
32 Ge 73 0.0775
32 Ge 74 0.3650
32 Ge 76 0.0773
33 As 75 1.0
34 Se 74 0.0089
34 Se 76 0.0937
34 Se 77 0.0763
34 Se 78 0.2377
34 Se 80 0.4961
34 Se 82 0.0873
35 Br 79 0.5069
35 Br 81 0.4931
36 Kr 78 0.00355
36 Kr 80 0.02286
36 Kr 82 0.11593
36 Kr 83 0.11500
36 Kr 84 0.56987
36 Kr 86 0.17279
37 Rb 85 0.7217
37 Rb 87 0.2783
38 Sr 84 0.0056
38 Sr 86 0.0986
38 Sr 87 0.07
38 Sr 88 0.8258
39 Y 89 1.0
40 Zr 90 0.5145
40 Zr 91 0.1122
40 Zr 92 0.1715
40 Zr 94 0.1738
40 Zr 96 0.028
41 Nb 93 1.0
42 Mo 92 0.1453
42 Mo 94 0.0915
42 Mo 95 0.1584
42 Mo 96 0.1667
42 Mo 97 0.0960
42 Mo 98 0.2439
42 Mo 100 0.0982
44 Ru 96 0.0554
44 Ru 98 0.0187
44 Ru 99 0.1276
44 Ru 100 0.126
44 Ru 101 0.1706
44 Ru 102 0.3155
44 Ru 104 0.1862
45 Rh 103 1.0
46 Pd 102 0.0102
46 Pd 104 0.1114
46 Pd 105 0.2233
46 Pd 106 0.2733
46 Pd 108 0.2646
46 Pd 110 0.1172
47 Ag 107 0.51839
47 Ag 109 0.48161
48 Cd 106 0.0125
48 Cd 108 0.0089
48 Cd 110 0.1249
48 Cd 111 0.128
48 Cd 112 0.2413
48 Cd 113 0.1222
48 Cd 114 0.2873
48 Cd 116 0.0749
49 In 113 0.0429
49 In 115 0.9571
50 Sn 112 0.0097
50 Sn 114 0.0066
50 Sn 115 0.0034
50 Sn 116 0.1454
50 Sn 117 0.0768
50 Sn 118 0.2422
50 Sn 119 0.0859
50 Sn 120 0.3258
50 Sn 122 0.0463
50 Sn 124 0.0579
51 Sb 121 0.5721
51 Sb 123 0.4279
52 Te 120 0.0009
52 Te 122 0.0255
52 Te 123 0.0089
52 Te 124 0.0474
52 Te 125 0.0707
52 Te 126 0.1884
52 Te 128 0.3174
52 Te 130 0.3408
53 I 127 1.0
54 Xe 124 0.000952
54 Xe 126 0.000890
54 Xe 128 0.019102
54 Xe 129 0.264006
54 Xe 130 0.040710
54 Xe 131 0.212324
54 Xe 132 0.269086
54 Xe 134 0.104357
54 Xe 136 0.088573
55 Cs 133 1.0
56 Ba 130 0.00106
56 Ba 132 0.00101
56 Ba 134 0.02417
56 Ba 135 0.06592
56 Ba 136 0.07854
56 Ba 137 0.11232
56 Ba 138 0.71698
57 La 138 0.0008881
57 La 139 0.9991119
58 Ce 136 0.00185
58 Ce 138 0.00251
58 Ce 140 0.8845
58 Ce 142 0.11114
59 Pr 141 1.0
60 Nd 142 0.27152
60 Nd 143 0.12174
60 Nd 144 0.23798
60 Nd 145 0.08293
60 Nd 146 0.17189
60 Nd 148 0.05756
60 Nd 150 0.05638
62 Sm 144 0.0307
62 Sm 147 0.1499
62 Sm 148 0.1124
62 Sm 149 0.1382
62 Sm 150 0.0738
62 Sm 152 0.2675
62 Sm 154 0.2275
63 Eu 151 0.4781
63 Eu 153 0.5219
64 Gd 152 0.002
64 Gd 154 0.0218
64 Gd 155 0.148
64 Gd 156 0.2047
64 Gd 157 0.1565
64 Gd 158 0.2484
64 Gd 160 0.2186
65 Tb 159 1.0
66 Dy 156 0.00056
66 Dy 158 0.00095
66 Dy 160 0.02329
66 Dy 161 0.18889
66 Dy 162 0.25475
66 Dy 163 0.24896
66 Dy 164 0.28260
67 Ho 165 1.0
68 Er 162 0.00139
68 Er 164 0.01601
68 Er 166 0.33503
68 Er 167 0.22869
68 Er 168 0.26978
68 Er 170 0.14910
69 Tm 169 1.0
70 Yb 168 0.00123
70 Yb 170 0.02982
70 Yb 171 0.1409
70 Yb 172 0.2168
70 Yb 173 0.16103
70 Yb 174 0.32026
70 Yb 176 0.12996
71 Lu 175 0.97401
71 Lu 176 0.02599
72 Hf 174 0.0016
72 Hf 176 0.0526
72 Hf 177 0.186
72 Hf 178 0.2728
72 Hf 179 0.1362
72 Hf 180 0.3508
73 Ta 180 0.0001201
73 Ta 181 0.9998799
74 W 180 0.0012
74 W 182 0.265
74 W 183 0.1431
74 W 184 0.3064
74 W 186 0.2843
75 Re 185 0.374
75 Re 187 0.626
76 Os 184 0.0002
76 Os 186 0.0159
76 Os 187 0.0196
76 Os 188 0.1324
76 Os 189 0.1615
76 Os 190 0.2626
76 Os 192 0.4078
77 Ir 191 0.373
77 Ir 193 0.627
78 Pt 190 0.00012
78 Pt 192 0.00782
78 Pt 194 0.3286
78 Pt 195 0.3378
78 Pt 196 0.2521
78 Pt 198 0.07356
79 Au 197 1.0
80 Hg 196 0.0015
80 Hg 198 0.0997
80 Hg 199 0.1687
80 Hg 200 0.231
80 Hg 201 0.1318
80 Hg 202 0.2986
80 Hg 204 0.0687
81 Tl 203 0.2952
81 Tl 205 0.7048
82 Pb 204 0.014
82 Pb 206 0.241
82 Pb 207 0.221
82 Pb 208 0.524
83 Bi 209 1.0
90 Th 232 1.0
91 Pa 231 1.0
92 U 234 5.4e-05
92 U 235 0.007204
92 U 238 0.992742

View file

@ -1,65 +0,0 @@
#!/usr/bin/env python2
import sys
import os
# Add color for posix systems
if os.name == 'posix':
colorOn = '\x1b[34m'
colorOff = '\x1b[0m'
else:
colorOn = ''
colorOff = ''
if len(sys.argv) <= 1:
print("Usage:")
sys.exit()
source = sys.argv[1:]
source.sort()
totalCode = 0
totalComment = 0
totalSpace = 0
for sourceFile in source:
code = 0
comment = 0
space = 0
ending = sourceFile[sourceFile.rindex('.') + 1:]
if ending == 'c':
commentChar = '/*'
elif ending == 'f':
commentChar = '!'
elif ending == 'f90':
commentChar = '!'
elif ending == 'F90':
commentChar = '!'
for line in open(sourceFile, 'r'):
line = line.strip()
if line.startswith(commentChar):
comment += 1
elif line == '':
space += 1
else:
code += 1
total = comment + space + code
totalCode += code
totalComment += comment
totalSpace += space
print(colorOn + sourceFile + colorOff)
print("Code: {0} ({1:4.1f}%)".format(code, 100.0*float(code)/total))
print("Comments: {0} ({1:4.1f}%)".format(comment, 100.0*float(comment)/total))
print("Spaces: {0} ({1:4.1f}%)\n".format(space, 100.0*float(space)/total))
total = totalCode + totalComment + totalSpace
print(colorOn + "TOTAL COUNT" + colorOff)
print("Code: {0} ({1:4.1f}%)".format(totalCode, 100.0*float(totalCode)/total))
print("Comments: {0} ({1:4.1f}%)".format(totalComment, 100.0*float(totalComment)/total))
print("Spaces: {0} ({1:4.1f}%)".format(totalSpace, 100.0*float(totalSpace)/total))
print("Total: {0}\n".format(total))

View file

@ -1,25 +0,0 @@
#!/usr/bin/env python2
import glob
import re
dependencies = {}
for src in glob.iglob('*.F90'):
module = src.strip('.F90')
deps = set()
d = re.findall(r'\n\s*use\s+(\w+)',
open(src, 'r').read())
for name in d:
if name in ['mpi', 'hdf5', 'h5lt', 'petscsys', 'petscmat', 'petscksp',
'petscsnes', 'petscvec', 'omp_lib', 'fox_dom']:
continue
deps.add(name)
if deps:
dependencies[module] = sorted(list(deps))
for module in sorted(dependencies.keys()):
for dep in dependencies[module]:
print("{0}.o: {1}.o".format(module, dep))
print('')

77
src/utils/convert_binary.py Executable file
View file

@ -0,0 +1,77 @@
#!/usr/bin/env python
from __future__ import division
from struct import pack
import sys
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()
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])

View file

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python
import os
import sys

View file

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python
import os
import sys

View file

@ -1,160 +0,0 @@
#!/usr/bin/python2
# Filename: eigenfunction_rms.py
# import packages
import statepoint
import numpy as np
import os
import sys
def main(tally_id, score_id, batch_start, batch_end, name):
# read in statepoint header data
sp = statepoint.StatePoint('statepoint.ref.binary')
# read in results
sp.read_results()
# extract reference mean
mean_ref = extract_mean(sp, tally_id, score_id)
# write gnuplot file
write_src_gnuplot('testsrc_pin','Pin mesh',mean_ref,np.size(mean_ref,0))
# preallocate arrays
hists = np.zeros(batch_end - batch_start + 1)
norms = np.zeros(batch_end - batch_start + 1)
i = batch_start
while i <= batch_end:
# process statepoint
sp = statepoint.StatePoint('statepoint.'+str(i)+'.binary')
sp.read_results()
# extract mean
mean = extract_mean(sp, tally_id, score_id)
# calculate L2 norm
norm = np.linalg.norm(mean - mean_ref)
# get history information
n_inactive = sp.n_inactive
current_batch = sp.current_batch
n_particles = sp.n_particles
gen_per_batch = sp.gen_per_batch
n_histories = (current_batch - n_inactive)*n_particles*gen_per_batch
# batch in vectors
hists[i - batch_start] = n_histories
norms[i - batch_start] = norm
# print
print 'Batch: '+str(i)+' Histories: '+str(n_histories)+' Norm: '+str(norm)
i += 1
# write out gnuplot file
write_norm_gnuplot(name,hists,norms,np.size(hists))
def extract_mean(sp, tally_id,score_id):
# extract results
results = sp.extract_results(tally_id,score_id)
# extract means and copy
mean = results['mean'].copy()
# reshape and integrate over energy
mean = mean.reshape(results['bin_max'],order='F')
mean = np.sum(mean,0)
mean = np.sum(mean,0)
mean = mean/mean.sum()*(mean > 1.e-8).sum()
return mean
def write_norm_gnuplot(path,xdat,ydat,size):
# Header String for GNUPLOT
headerstr = """#!/usr/bin/env gnuplot
set terminal pdf enhanced
set output '{output}'
set ylabel 'L-2 norm'
set xlabel 'Histories'
set log x
set log y
""".format(output=path+'.pdf')
# Write out the plot string
pltstr = "plot '-' using 1:2 with lines"
# Write out the data string
i = 0
datastr = ''
while i < size:
datastr = datastr + '{0} {1}\n'.format(xdat[i],ydat[i])
i += 1
# Concatenate all
outstr = headerstr + '\n' + pltstr + '\n' + datastr
# Write File
with open(path+".plot",'w') as f:
f.write(outstr)
# Run GNUPLOT
os.system('gnuplot ' + path+".plot")
def write_src_gnuplot(path,name,src,size):
# Header String for GNUPLOT
headerstr = """#!/usr/bin/env gnuplot
set terminal pdf enhanced
set output '{output}'
set palette defined (0 '#000090', 1 '#000fff', 2 '#0090ff', 3 '#0fffee', 4 '#90ff70', 5 '#ffee00', 6 '#ff7000', 7 '#ee0000', 8 '#7f0000')
set view map
set size ratio -1
set lmargin at screen 0.10
set rmargin at screen 0.90
set bmargin at screen 0.15
set tmargin at screen 0.90
unset xtics
unset ytics
set title '{title}'""".format(output=path+'.pdf',title=name)
# Write out the plot string
pltstr = "splot '-' matrix with image "
# Write out the data string
i = 0
datastr = ''
while i < size:
j = 0
while j < size:
datastr = datastr + '{0} '.format(src[i,j][0])
j += 1
datastr = datastr + '\n'
i += 1
# replace all nan with zero
datastr = datastr.replace('nan','0.0')
# Concatenate all
outstr = headerstr + '\n' + pltstr + '\n' + datastr
# Write File
with open(path+".plot",'w') as f:
f.write(outstr)
# Run GNUPLOT
os.system('gnuplot ' + path+".plot")
if __name__ == "__main__":
tally_id = int(sys.argv[1])
score_id = sys.argv[2]
batch_start = int(sys.argv[3])
batch_end = int(sys.argv[4])
name = sys.argv[5]
main(tally_id, score_id, batch_start, batch_end, name)

View file

@ -1,7 +1,12 @@
#!/usr/bin/env python2
#!/usr/bin/env python
# This script reads a cross_sections.out file, adds up the memory usage for
# each nuclide and S(a,b) table, and displays the total memory usage
"""
This script reads a cross_sections.out file, adds up the memory usage for each
nuclide and S(a,b) table, and displays the total memory usage.
"""
from __future__ import print_function
import sys
import os

View file

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python
import struct
@ -30,6 +30,7 @@ class Particle(object):
self.gen_per_batch = self._get_int(path='gen_per_batch')[0]
self.current_gen = self._get_int(path='current_gen')[0]
self.n_particles = self._get_long(path='n_particles')[0]
self.run_mode = self._get_int(path='run_mode')[0]
# Read particle properties
self.id = self._get_long(path='id')[0]
@ -50,9 +51,9 @@ class Particle(object):
def _get_long(self, n=1, path=None):
if self._hdf5:
return [long(v) for v in self._f[path].value]
return [int(v) for v in self._f[path].value]
else:
return [long(v) for v in self._get_data(n, 'q', 8)]
return [int(v) for v in self._get_data(n, 'q', 8)]
def _get_float(self, n=1, path=None):
if self._hdf5:

View file

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python
"""Python script to plot tally data generated by OpenMC."""
@ -15,12 +15,16 @@ from statepoint import *
if sys.version_info[0] < 3:
import Tkinter as tk
import tkFileDialog as filedialog
import tkFont as font
import tkMessageBox as messagebox
import ttk as ttk
else:
import tkinter as tk
import tkFileDialog
import tkFont
import tkMessageBox
import ttk
import tkinter.filedialog as filedialog
import tkinter.font as font
import tkinter.messagebox as messagebox
import tkinter.ttk as ttk
class MeshPlotter(tk.Frame):
@ -111,8 +115,9 @@ class MeshPlotter(tk.Frame):
self.scoreBox.bind('<<ComboboxSelected>>', self.redraw)
# Filter label
font = tkFont.Font(weight='bold')
labelFilters = tk.Label(self.selectFrame, text='Filters:', font=font)
boldfont = font.Font(weight='bold')
labelFilters = tk.Label(self.selectFrame, text='Filters:',
font=boldfont)
labelFilters.grid(row=5, column=0, sticky=tk.W)
def update(self, event=None):
@ -296,8 +301,8 @@ class MeshPlotter(tk.Frame):
self.meshTallies.append(itally)
if not self.meshTallies:
tkMessageBox.showerror("Invalid StatePoint File",
"File does not contain mesh tallies!")
messagebox.showerror("Invalid StatePoint File",
"File does not contain mesh tallies!")
sys.exit(1)
@ -308,16 +313,16 @@ if __name__ == '__main__':
# If no filename given as command-line argument, open file dialog
if len(sys.argv) < 2:
filename = tkFileDialog.askopenfilename(title='Select statepoint file',
initialdir='.')
filename = filedialog.askopenfilename(title='Select statepoint file',
initialdir='.')
else:
filename = sys.argv[1]
if filename:
# Check to make sure file exists
if not os.path.isfile(filename):
tkMessageBox.showerror("File not found",
"Could not find regular file: " + filename)
messagebox.showerror("File not found",
"Could not find regular file: " + filename)
sys.exit(1)
app = MeshPlotter(root, filename)

View file

@ -3,7 +3,7 @@
from distutils.core import setup
setup(name='statepoint',
version='0.5.4',
version='0.6.0',
description='OpenMC StatePoint',
author='Paul Romano',
author_email='paul.k.romano@gmail.com',

View file

@ -1,16 +0,0 @@
#!/usr/bin/env python2
import sys
if len(sys.argv) != 3:
print("Must supply element and atom/b-cm")
sys.exit(1)
element = sys.argv[1]
ao = float(sys.argv[2])
for line in open('abundances_modified.txt', 'r'):
words = line.split()
if words[1] == element:
print('<nuclide name="{0}-{1}" ao="{2:10.4e}" />'.format(
element, words[2], float(words[3])*ao))

View file

@ -6,81 +6,89 @@ from collections import OrderedDict
import numpy as np
import scipy.stats
REVISION_STATEPOINT = 12
filter_types = {1: 'universe', 2: 'material', 3: 'cell', 4: 'cellborn',
5: 'surface', 6: 'mesh', 7: 'energyin', 8: 'energyout'}
score_types = {-1: 'flux',
-2: 'total',
-3: 'scatter',
-4: 'nu-scatter',
-5: 'scatter-n',
-6: 'scatter-pn',
-7: 'transport',
-8: 'n1n',
-9: 'absorption',
-10: 'fission',
-11: 'nu-fission',
-12: 'kappa-fission',
-13: 'current',
-14: 'events',
1: '(n,total)',
2: '(n,elastic)',
4: '(n,level)',
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)',
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)',
201: '(n,Xn)',
202: '(n,Xgamma)',
203: '(n,Xp)',
204: '(n,Xd)',
205: '(n,Xt)',
206: '(n,X3He)',
207: '(n,Xa)',
444: '(damage)',
649: '(n,pc)',
699: '(n,dc)',
749: '(n,tc)',
799: '(n,3Hec)',
849: '(n,tc)'}
-2: 'total',
-3: 'scatter',
-4: 'nu-scatter',
-5: 'scatter-n',
-6: 'scatter-pn',
-7: 'nu-scatter-n',
-8: 'nu-scatter-pn',
-9: 'transport',
-10: 'n1n',
-11: 'absorption',
-12: 'fission',
-13: 'nu-fission',
-14: 'kappa-fission',
-15: 'current',
-16: 'flux-yn',
-17: 'total-yn',
-18: 'scatter-yn',
-19: 'nu-scatter-yn',
-20: 'events',
1: '(n,total)',
2: '(n,elastic)',
4: '(n,level)',
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)',
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)',
201: '(n,Xn)',
202: '(n,Xgamma)',
203: '(n,Xp)',
204: '(n,Xd)',
205: '(n,Xt)',
206: '(n,X3He)',
207: '(n,Xa)',
444: '(damage)',
649: '(n,pc)',
699: '(n,dc)',
749: '(n,tc)',
799: '(n,3Hec)',
849: '(n,tc)'}
score_types.update({MT: '(n,n' + str(MT-50) + ')' for MT in range(51,91)})
score_types.update({MT: '(n,p' + str(MT-600) + ')' for MT in range(600,649)})
score_types.update({MT: '(n,d' + str(MT-650) + ')' for MT in range(650,699)})
@ -151,7 +159,7 @@ class StatePoint(object):
# Read statepoint revision
self.revision = self._get_int(path='revision')[0]
if self.revision != 11:
if self.revision != REVISION_STATEPOINT:
raise Exception('Statepoint Revision is not consistent.')
# Read OpenMC version
@ -287,21 +295,21 @@ class StatePoint(object):
t.n_scores = self._get_int(path=base+'n_score_bins')[0]
t.scores = [score_types[j] for j in self._get_int(
t.n_scores, path=base+'score_bins')]
t.scatt_order = self._get_int(t.n_scores, path=base+'scatt_order')
t.moment_order = self._get_int(t.n_scores, path=base+'moment_order')
# Read number of user score bins
t.n_user_scores = self._get_int(path=base+'n_user_score_bins')[0]
# Set up stride
stride = 1
for f in t.filters.values()[::-1]:
for f in list(t.filters.values())[::-1]:
f.stride = stride
stride *= f.length
# Source bank present
source_present = self._get_int(path='source_present')[0]
if source_present == 1:
self.source_present = True
self.source_present = True
else:
self.source_present = False
@ -493,15 +501,15 @@ class StatePoint(object):
try:
tally = self.tallies[tally_id-1]
except:
print 'Tally does not exist'
print('Tally does not exist')
return
# get the score index if it is present
try:
idx = tally.scores.index(score_str)
except ValueError:
print 'Score does not exist'
print tally.scores
print('Score does not exist')
print(tally.scores)
return
# create numpy array for mean and 95% CI
@ -535,7 +543,7 @@ class StatePoint(object):
# get bounds of filter bins
for akey in tally.filters.keys():
idx = tally.filters.keys().index(akey)
idx = list(tally.filters.keys()).index(akey)
filtmax[n_filters - idx] = tally.filters[akey].length
# compute bin info
@ -546,11 +554,11 @@ class StatePoint(object):
np.prod(filtmax[0:i+2]))/(np.prod(filtmax[0:i+1]))) + 1
# append in dictionary bin with filter
data.update({tally.filters.keys()[n_filters - i - 1]:
filters[:,n_filters - i - 1]})
data.update({list(tally.filters.keys())[n_filters - i - 1]:
filters[:,n_filters - i - 1]})
# check for mesh
if tally.filters.keys()[n_filters - i - 1] == 'mesh':
if list(tally.filters.keys())[n_filters - i - 1] == 'mesh':
dims = list(self.meshes[tally.filters['mesh'].bins[0] - 1].dimension)
dims.reverse()
dims = np.asarray(dims)
@ -564,12 +572,12 @@ class StatePoint(object):
np.prod(meshmax[0:3]))/(np.prod(meshmax[0:2]))) + 1
mesh_bins[:,0] = np.floor(((filters[:,n_filters - i - 1] - 1) %
np.prod(meshmax[0:4]))/(np.prod(meshmax[0:3]))) + 1
data.update({'mesh':zip(mesh_bins[:,0],mesh_bins[:,1],
mesh_bins[:,2])})
data.update({'mesh': list(zip(mesh_bins[:,0], mesh_bins[:,1],
mesh_bins[:,2]))})
i += 1
# add in maximum bin filters and order
b = tally.filters.keys()
b = list(tally.filters.keys())
b.reverse()
filtmax = list(filtmax[1:])
try:
@ -596,9 +604,9 @@ class StatePoint(object):
def _get_long(self, n=1, path=None):
if self._hdf5:
return [long(v) for v in self._f[path].value]
return [int(v) for v in self._f[path].value]
else:
return [long(v) for v in self._get_data(n, 'q', 8)]
return [int(v) for v in self._get_data(n, 'q', 8)]
def _get_float(self, n=1, path=None):
if self._hdf5:

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python2
from __future__ import division
from __future__ import division, print_function
import sys
import itertools
@ -17,7 +17,7 @@ err = False
def parse_options():
"""Process command line arguments"""
def tallies_callback(option, opt, value, parser):
"""Option parser function for list of tallies"""
@ -42,7 +42,7 @@ def parse_options():
except:
p.print_help()
err = True
def filters_callback(option, opt, value, parser):
"""Option parser function for list of filters"""
global err
@ -59,7 +59,7 @@ def parse_options():
except:
p.print_help()
err = True
from optparse import OptionParser
usage = r"""%prog [options] <statepoint_file>
@ -98,12 +98,12 @@ You can list the available tallies, scores, and filters with the -l option:
p.add_option('-o', '--output', action='store', dest='output',
default='tally', help='path to output SILO file.')
p.add_option('-e', '--error', dest='valerr', default=False,
action='store_true',
action='store_true',
help='Flag to extract errors instead of values.')
p.add_option('-v', '--vtk', action='store_true', dest='vtk',
default=False, help='Flag to convert to VTK instead of SILO.')
parsed = p.parse_args()
if not parsed[1]:
p.print_help()
return parsed, err
@ -118,35 +118,35 @@ You can list the available tallies, scores, and filters with the -l option:
################################################################################
def main(file_, o):
"""Main program"""
sp = StatePoint(file_)
sp.read_results()
validate_options(sp, o)
if o.list:
print_available(sp)
return
if o.vtk:
if not o.output[-4:] == ".vtm": o.output += ".vtm"
else:
if not o.output[-5:] == ".silo": o.output += ".silo"
if o.vtk:
try:
import vtk
except:
print 'The vtk python bindings do not appear to be installed properly.\n'+\
'On Ubuntu: sudo apt-get install python-vtk\n'+\
'See: http://www.vtk.org/'
print('The vtk python bindings do not appear to be installed properly.\n'
'On Ubuntu: sudo apt-get install python-vtk\n'
'See: http://www.vtk.org/')
return
else:
try:
import silomesh
except:
print 'The silomesh package does not appear to be installed properly.\n'+\
'See: https://github.com/nhorelik/silomesh/'
print('The silomesh package does not appear to be installed properly.\n'
'See: https://github.com/nhorelik/silomesh/')
return
if o.vtk:
@ -158,20 +158,20 @@ def main(file_, o):
# Tally loop #################################################################
for tally in sp.tallies:
# skip non-mesh tallies or non-user-specified tallies
if o.tallies and not tally.id in o.tallies: continue
if not 'mesh' in tally.filters: continue
print "Processing Tally {}...".format(tally.id)
print("Processing Tally {}...".format(tally.id))
# extract filter options and mesh parameters for this tally
filtercombos = get_filter_combos(tally)
meshparms = get_mesh_parms(sp, tally)
nx,ny,nz = meshparms[:3]
ll = meshparms[3:6]
ur = meshparms[6:9]
if o.vtk:
ww = [(u-l)/n for u,l,n in zip(ur,ll,(nx,ny,nz))]
grid = grid = vtk.vtkImageData()
@ -180,17 +180,17 @@ def main(file_, o):
grid.SetSpacing(*ww)
else:
silomesh.init_mesh('Tally_{}'.format(tally.id), *meshparms)
# Score loop ###############################################################
for sid,score in enumerate(tally.scores):
# skip non-user-specified scrores for this tally
if o.scores and tally.id in o.scores and not sid in o.scores[tally.id]:
continue
# Filter loop ############################################################
for filterspec in filtercombos:
# skip non-user-specified filter bins
skip = False
if o.filters and tally.id in o.filters:
@ -200,7 +200,7 @@ def main(file_, o):
skip = True
break
if skip: continue
# find and sanitize the variable name for this score
varname = get_sanitized_filterspec_name(tally, score, filterspec)
if o.vtk:
@ -209,9 +209,9 @@ def main(file_, o):
dataforvtk = {}
else:
silomesh.init_var(varname)
lbl = "\t Score {}.{} {}:\t\t{}".format(tally.id, sid+1, score, varname)
# Mesh fill loop #######################################################
for x in range(1,nx+1):
sys.stdout.write(lbl+" {0}%\r".format(int(x/nx*100)))
@ -226,27 +226,27 @@ def main(file_, o):
dataforvtk[i] = float(val)
else:
silomesh.set_value(float(val), x, y, z)
# end mesh fill loop
print
print()
if o.vtk:
for i in range(nx*ny*nz):
vtkdata.InsertNextValue(dataforvtk[i])
grid.GetCellData().AddArray(vtkdata)
del vtkdata
else:
silomesh.finalize_var()
# end filter loop
# end score loop
if o.vtk:
blocks.SetBlock(block_idx, grid)
block_idx += 1
else:
silomesh.finalize_mesh()
# end tally loop
if o.vtk:
writer = vtk.vtkXMLMultiBlockDataWriter()
@ -259,7 +259,7 @@ def main(file_, o):
################################################################################
def get_sanitized_filterspec_name(tally, score, filterspec):
"""Returns a name fit for silo vars for a given filterspec, tally and score"""
comboname = "_"+" ".join(["{}_{}".format(filter_, bin)
for filter_, bin in filterspec[1:]])
if len(filterspec[1:]) == 0: comboname = ''
@ -274,16 +274,16 @@ def get_filter_combos(tally):
Each combo has the mesh spec as the first element, to be set later.
These filter specs correspond with the second argument to StatePoint.get_value
"""
specs = []
if len(tally.filters) == 1:
return [[['mesh', [1, 1, 1]]]]
filters = tally.filters.keys()
filters = list(tally.filters.keys())
filters.pop(filters.index('mesh'))
nbins = [tally.filters[f].length for f in filters]
combos = [ [b] for b in range(nbins[0])]
for i,b in enumerate(nbins[1:]):
prod = list(itertools.product(combos, range(b)))
@ -311,25 +311,25 @@ def get_mesh_parms(sp, tally):
################################################################################
def print_available(sp):
"""Prints available tallies/scores in a statepoint"""
print "Available tally and score indices:"
print("Available tally and score indices:")
for tally in sp.tallies:
mesh = ""
if not 'mesh' in tally.filters: mesh = "(no mesh)"
print "\tTally {} {}".format(tally.id, mesh)
scores = ["{}.{}: {}".format(tally.id, sid, score)
print("\tTally {} {}".format(tally.id, mesh))
scores = ["{}.{}: {}".format(tally.id, sid, score)
for sid, score in enumerate(tally.scores)]
for score in scores:
print "\t\tScore {}".format(score)
print("\t\tScore {}".format(score))
for filter_ in tally.filters:
if filter_ == 'mesh': continue
for bin in range(tally.filters[filter_].length):
print "\t\t\tFilters: {}.{}.{}".format(tally.id, filter_, bin)
print("\t\t\tFilters: {}.{}.{}".format(tally.id, filter_, bin))
################################################################################
def validate_options(sp,o):
"""Validates specified tally/score options for the current statepoint"""
available_tallies = [t.id for t in sp.tallies]
if o.tallies:
for otally in o.tallies:
@ -345,7 +345,7 @@ def validate_options(sp,o):
for oscore in o.scores[otally]:
if oscore > len(tally.scores):
warnings.warn('No score {} in tally {}'.format(oscore, otally))
if o.scores:
for otally in o.scores.keys():
if not otally in available_tallies:
@ -355,7 +355,7 @@ def validate_options(sp,o):
warnings.warn(
'Skipping scores for tally {}, excluded by tally list'.format(otally))
continue
if o.filters:
for otally in o.filters.keys():
if not otally in available_tallies:
@ -380,7 +380,7 @@ def validate_options(sp,o):
warnings.warn(
'No bin {} in tally {} filter {}'.format(bin, otally, filter_))
################################################################################
################################################################################
# monkeypatch to suppress the source echo produced by warnings
def formatwarning(message, category, filename, lineno, line):
return "{}:{}: {}: {}\n".format(filename, lineno, category.__name__, message)

View file

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python
import sys

View file

@ -1,5 +1,6 @@
#!/usr/bin/env python2
#!/usr/bin/env python
from __future__ import print_function
from sys import argv
from math import sqrt

View file

@ -1,4 +1,6 @@
#!/usr/bin/env python2
#!/usr/bin/env python
from __future__ import print_function, division
from sys import argv
from math import sqrt
@ -56,7 +58,7 @@ for t in sp.tallies:
nx, ny, nz = m.dimension
# Calculate number of score bins
ns = t.total_score_bins * t.total_filter_bins / (nx*ny*nz)
ns = t.total_score_bins * t.total_filter_bins // (nx*ny*nz)
assert n_bins == nx*ny*nz*ns
# Create lists for tallies

View file

@ -1,4 +1,4 @@
#!/usr/bin/env python2
#!/usr/bin/env python
# This program takes OpenMC statepoint binary files and creates a variety of
# outputs from them which should provide the user with an idea of the
@ -15,6 +15,7 @@
# fileType, printxs, showImg, and savetoCSV. See the options block for more
# information.
from __future__ import print_function
from math import sqrt, pow
from glob import glob

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python2
from __future__ import division
from __future__ import division, print_function
import struct
import sys
@ -25,7 +25,7 @@ def parse_options():
################################################################################
def main(file_, o):
print file_
print(file_)
fh = open(file_,'rb')
header = get_header(fh)
meshparms = header['dimension'] + header['lower_left'] + header['upper_right']
@ -36,18 +36,18 @@ def main(file_, o):
try:
import vtk
except:
print 'The vtk python bindings do not appear to be installed properly.\n'+\
'On Ubuntu: sudo apt-get install python-vtk\n'+\
'See: http://www.vtk.org/'
print('The vtk python bindings do not appear to be installed properly.\n'
'On Ubuntu: sudo apt-get install python-vtk\n'
'See: http://www.vtk.org/')
return
origin = [(l+w*n/2.) for n,l,w in zip((nx,ny,nz),ll,header['width'])]
grid = vtk.vtkImageData()
grid.SetDimensions(nx+1,ny+1,nz+1)
grid.SetOrigin(*ll)
grid.SetSpacing(*header['width'])
data = vtk.vtkDoubleArray()
data.SetName("id")
data.SetNumberOfTuples(nx*ny*nz)
@ -60,7 +60,7 @@ def main(file_, o):
id_ = get_int(fh)[0]
data.SetValue(i, id_)
grid.GetCellData().AddArray(data)
writer = vtk.vtkXMLImageDataWriter()
writer.SetInput(grid)
if not o.output[-4:] == ".vti": o.output += ".vti"
@ -72,8 +72,8 @@ def main(file_, o):
try:
import silomesh
except:
print 'The silomesh package does not appear to be installed properly.\n'+\
'See: https://github.com/nhorelik/silomesh/'
print('The silomesh package does not appear to be installed properly.\n'
'See: https://github.com/nhorelik/silomesh/')
return
if not o.output[-5:] == ".silo": o.output += ".silo"
silomesh.init_silo(o.output)
@ -86,10 +86,10 @@ def main(file_, o):
for z in range(1,nz+1):
id_ = get_int(fh)[0]
silomesh.set_value(float(id_), x, y, z)
print
print()
silomesh.finalize_var()
silomesh.finalize_mesh()
silomesh.finalize_silo()
silomesh.finalize_silo()
################################################################################
def get_header(file_):

View file

@ -89,40 +89,40 @@ contains
! VECTOR_SETUP_PETSC links the data to a PETSc vector
!===============================================================================
#ifdef PETSC
subroutine vector_setup_petsc(self)
class(Vector), intent(inout) :: self ! vector instance
! Link to PETSc
#ifdef PETSC
call VecCreateSeqWithArray(PETSC_COMM_WORLD, 1, self % n, self % val, &
self % petsc_vec, petsc_err)
#endif
! Set that PETSc is now active
self % petsc_active = .true.
end subroutine vector_setup_petsc
#endif
!===============================================================================
! VECTOR_WRITE_PETSC_BINARY writes the PETSc vector to a binary file
!===============================================================================
#ifdef PETSC
subroutine vector_write_petsc_binary(self, filename)
character(*), intent(in) :: filename ! name of file to write to
class(Vector), intent(in) :: self ! vector instance
#ifdef PETSC
type(PetscViewer) :: viewer ! PETSc viewer instance
call PetscViewerBinaryOpen(PETSC_COMM_WORLD, trim(filename), &
FILE_MODE_WRITE, viewer, petsc_err)
call VecView(self % petsc_vec, viewer, petsc_err)
call PetscViewerDestroy(viewer, petsc_err)
#endif
end subroutine vector_write_petsc_binary
#endif
!===============================================================================
! VECTOR_COPY allocates a separate vector and copies

View file

@ -1,71 +0,0 @@
FoX - Fortran XML library
FoX was originally derived from the xmlf90 codebase,
(c) Alberto Garcia & Jon Wakelin, 2003-2004.
FoX also includes externally-written code from
Scott Ladd <scott.ladd@coyotegulch.com>, which is licensed
as shown in the file utils/fox_m_utils_mtprng.f90
This version of FoX is:
(c) 2005-2009 Toby White <tow@uszla.me.uk>
(c) 2007-2009 Gen-Tao Chiang <gtc25@cam.ac.uk>
(c) 2008-2012 Andrew Walker <a.walker@ucl.ac.uk>
All rights reserved.
* Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This distribution also includes code wrtten by Scott Ladd
utils/,
! This computer program source file is supplied "AS IS". Scott Robert <br />
! Ladd (hereinafter referred to as "Author") disclaims all warranties, <br />
! expressed or implied, including, without limitation, the warranties <br />
! of merchantability and of fitness for any purpose. The Author <br />
! assumes no liability for direct, indirect, incidental, special, <br />
! exemplary, or consequential damages, which may result from the use <br />
! of this software, even if advised of the possibility of such damage. <br />
! <br />
! The Author hereby grants anyone permission to use, copy, modify, and <br />
! distribute this source code, or portions hereof, for any purpose, <br />
! without fee, subject to the following restrictions: <br />
! <br />
! 1. The origin of this source code must not be misrepresented. <br />
! <br />
! 2. Altered versions must be plainly marked as such and must not <br />
! be misrepresented as being the original source. <br />
! <br />
! 3. This Copyright notice may not be removed or altered from any <br />
! source or altered source distribution. <br />
! <br />
! The Author specifically permits (without fee) and encourages the use <br />
! of this source code for entertainment, education, or decoration. If <br />
! you use this source code in a product, acknowledgment is not required <br />
! but would be appreciated.

View file

@ -1,32 +0,0 @@
xml_lib = lib/libxml.a
#===============================================================================
# Targets
#===============================================================================
$(xml_lib):
mkdir -p include
mkdir -p lib
cd fsys; make MACHINE=$(MACHINE) F90=$(F90) F90FLAGS="$(F90FLAGS)"
cd utils; make MACHINE=$(MACHINE) F90=$(F90) F90FLAGS="$(F90FLAGS)"
cd common; make MACHINE=$(MACHINE) F90=$(F90) F90FLAGS="$(F90FLAGS)"
cd wxml; make MACHINE=$(MACHINE) F90=$(F90) F90FLAGS="$(F90FLAGS)"
cd sax; make MACHINE=$(MACHINE) F90=$(F90) F90FLAGS="$(F90FLAGS)"
cd dom; make MACHINE=$(MACHINE) F90=$(F90) F90FLAGS="$(F90FLAGS)"
cd lib; ar rcs libxml.a *.o; rm -f *.o
clean:
cd fsys; make clean
cd utils; make clean
cd common; make clean
cd wxml; make clean
cd sax; make clean
cd dom; make clean
@rm -r -f include
@rm -r -f lib
#===============================================================================
# Rules
#===============================================================================
.PHONY: clean

View file

@ -1,3 +0,0 @@
This directory contains source code from FoX - A Fortran Library for XML
Current version is 4.1.2
www1.gly.bris.ac.uk/~walker/FoX/

View file

@ -1,55 +0,0 @@
module FoX_common
use fox_m_fsys_array_str
use fox_m_fsys_format
use fox_m_fsys_parse_input
use fox_m_fsys_count_parse_input
use m_common_attrs
use m_common_error
implicit none
private
#ifdef DUMMYLIB
character(len=*), parameter :: FoX_version = '4.1.2-dummy'
#else
character(len=*), parameter :: FoX_version = '4.1.2'
#endif
public :: FoX_version
public :: rts
public :: countrts
public :: str
public :: operator(//)
public :: FoX_set_fatal_errors
public :: FoX_get_fatal_errors
public :: FoX_set_fatal_warnings
public :: FoX_get_fatal_warnings
#ifndef DUMMYLIB
public :: str_vs
public :: vs_str
public :: alloc
public :: concat
#endif
!These are all exported through SAX now
public :: dictionary_t
!SAX functions
public :: getIndex
public :: getLength
public :: getLocalName
public :: getQName
public :: getURI
public :: getValue
public :: getType
public :: isSpecified
public :: isDeclared
public :: setSpecified
public :: setDeclared
!For convenience
public :: hasKey
end module FoX_common

View file

@ -1,59 +0,0 @@
source = $(wildcard *.F90)
objects = $(source:.F90=.o)
#===============================================================================
# Compiler Options
#===============================================================================
# Ignore unusd variables
ifeq ($(MACHINE),bluegene)
override F90 = xlf2003
endif
ifeq ($(F90),ifort)
override F90FLAGS += -warn nounused
endif
#===============================================================================
# Targets
#===============================================================================
all: $(objects)
mv *.mod ../include
mv *.o ../lib
clean:
@rm -f *.o *.mod
neat:
@rm -f *.o *.mod
#===============================================================================
# Rules
#===============================================================================
.SUFFIXES: .F90 .o
.PHONY: clean neat
%.o: %.F90
$(F90) $(F90FLAGS) -c -I../include $<
#===============================================================================
# Dependencies
#===============================================================================
FoX_common.o: m_common_attrs.o
m_common_attrs.o: m_common_element.o m_common_error.o
m_common_buffer.o: m_common_charset.o m_common_error.o
m_common_element.o: m_common_charset.o m_common_content_model.o m_common_error.o m_common_namecheck.o
m_common_elstack.o: m_common_content_model.o m_common_error.o
m_common_entities.o: m_common_charset.o m_common_error.o
m_common_entity_expand.o: m_common_entities.o m_common_error.o
m_common_entity_expand.o: m_common_namecheck.o m_common_struct.o
m_common_io.o: m_common_error.o
m_common_namecheck.o: m_common_charset.o
m_common_namespaces.o: m_common_attrs.o m_common_charset.o m_common_error.o
m_common_namespaces.o: m_common_namecheck.o m_common_struct.o
m_common_notations.o: m_common_error.o
m_common_struct.o: m_common_charset.o m_common_element.o m_common_entities.o
m_common_struct.o: m_common_notations.o

File diff suppressed because it is too large Load diff

View file

@ -1,261 +0,0 @@
module m_common_buffer
#ifndef DUMMYLIB
use fox_m_fsys_format, only: str
use m_common_charset, only: XML1_0
use m_common_error, only: FoX_error, FoX_warning
implicit none
private
! At this point we use a fixed-size buffer.
! Note however that buffer overflows will only be
! triggered by overly long *unbroken* pcdata values, or
! by overly long attribute values. Hopefully
! element or attribute names are "short enough".
!
! In a forthcoming implementation it could be made dynamical...
! MAX_BUFF_SIZE cannot be bigger than the maximum available
! record length for a compiler. In practice, this means
! 1024 seems to be the biggest available size.
integer, parameter :: MAX_BUFF_SIZE = 1024
type buffer_t
private
integer :: size
character(len=MAX_BUFF_SIZE) :: str
integer :: unit
integer :: xml_version
end type buffer_t
public :: buffer_t
public :: add_to_buffer
public :: print_buffer, str, char, len
public :: buffer_to_chararray
public :: reset_buffer
public :: dump_buffer
interface str
module procedure buffer_to_str
end interface
interface char
module procedure buffer_to_str
end interface
interface len
module procedure buffer_length
end interface
contains
subroutine reset_buffer(buffer, unit, xml_version)
type(buffer_t), intent(inout) :: buffer
integer, intent(in), optional :: unit
integer, intent(in) :: xml_version
buffer%size = 0
if (present(unit)) then
buffer%unit = unit
else
buffer%unit = 6
endif
buffer%xml_version = xml_version
end subroutine reset_buffer
subroutine print_buffer(buffer)
type(buffer_t), intent(in) :: buffer
write(unit=6,fmt="(a)") buffer%str(:buffer%size)
end subroutine print_buffer
function buffer_to_str(buffer) result(str)
type(buffer_t), intent(in) :: buffer
character(len=buffer%size) :: str
str = buffer%str(:buffer%size)
end function buffer_to_str
function buffer_to_chararray(buffer) result(str)
type(buffer_t), intent(in) :: buffer
character(len=1), dimension(buffer%size) :: str
integer :: i
do i = 1, buffer%size
str(i) = buffer%str(i:i)
enddo
end function buffer_to_chararray
function buffer_length(buffer) result(length)
type(buffer_t), intent(in) :: buffer
integer :: length
length = buffer%size
end function buffer_length
subroutine dump_buffer(buffer, lf)
type(buffer_t), intent(inout) :: buffer
logical, intent(in), optional :: lf
integer :: i, n
logical :: lf_
if (present(lf)) then
lf_ = lf
else
lf_ = .true.
endif
i = scan(buffer%str(:buffer%size), achar(10)//achar(13))
n = 1
do while (i>0)
write(buffer%unit, '(a)', advance="yes") buffer%str(n:n+i-2)
n = n + i
if (n>buffer%size) exit
i = scan(buffer%str(n:), achar(10)//achar(13))
enddo
if (n<=buffer%size) then
if (lf_) then
write(buffer%unit, '(a)', advance="yes") buffer%str(n:buffer%size)
else
write(buffer%unit, '(a)', advance="no") buffer%str(n:buffer%size)
endif
endif
buffer%size = 0
end subroutine dump_buffer
subroutine check_buffer(s, version)
character(len=*), intent(in) :: s
integer, intent(in) :: version
integer :: i
!FIXME this is almost a duplicate of logic in wxml/m_wxml_escape.f90
! We have to do it this way (with achar etc) in case the native
! platform encoding is not ASCII
do i = 1, len(s)
select case (iachar(s(i:i)))
case (0)
call FoX_error("Tried to output a NUL character")
case (1:8,11:12,14:31)
if (version==XML1_0) then
call FoX_error("Tried to output a character invalid under XML 1.0: &#"//str(iachar(s(i:i)))//";")
endif
case (128:)
!TOHW we should maybe just disallow this ...
call FoX_warning("emitting non-ASCII character. Platform-dependent result!")
end select
enddo
end subroutine check_buffer
subroutine add_to_buffer(s, buffer, ws_significant)
character(len=*), intent(in) :: s
type(buffer_t), intent(inout) :: buffer
logical, intent(in), optional :: ws_significant
character(len=(buffer%size+len(s))) :: s2
integer :: i, n, len_b
logical :: warning, ws_
! Is whitespace significant in this context?
! We have to assume so unless told otherwise.
if (present(ws_significant)) then
ws_ = ws_significant
else
ws_ = .true.
endif
! FIXME The algorithm below unilaterally forces all
! line feeds and carriage returns to native EOL, regardless
! of input document. Thus it is impossible to output a
! document containing a literal non-native newline character
! Ideally we would put this under the control of the user.
! We check if whitespace is significant. If not, we can
! adjust the buffer without worrying about it.
! But if we are not told, we warn about it.
! And if we are told it definitely is - then we error out.
! If we overreach our buffer size, we will be unable to
! output any more characters without a newline.
! Go through new string, insert newlines
! at spaces just before MAX_BUFF_SIZE chars
! until we have less than MAX_BUFF_SIZE left to go,
! then put that in the buffer.
! If no whitespace is found in the newly-added string, then
! insert a new line immediately before it (at the end of the
! current buffer)
call check_buffer(s, buffer%xml_version)
s2 = buffer%str(:buffer%size)//s
! output as much of this using existing newlines as possible.
warning = .false.
n = 1
do while (n<=len(s2))
! Note this is an XML-1.0 only definition of newline
i = scan(s2(n:), achar(10)//achar(13))
if (i>0) then
! turn that newline into an output newline ...
write(buffer%unit, '(a)') s2(n:n+i-2)
n = n + i
elseif (n<=len(s2)-MAX_BUFF_SIZE) then
! We need to insert a newline, or we'll overrun the buffer
! No suitable newline, so convert a space or tab into a newline.
i = scan(s2(n:n+MAX_BUFF_SIZE-1), achar(9)//achar(32), back=.true.)
! If no space or tab is present, we fail.
if (i>0.and..not.present(ws_significant)) then
! We can insert a newline, but we don't know whether it is significant. Warn:
if (.not.warning) then
! We only output this warning once.
call FoX_warning( &
"Fortran made FoX insert a newline. "// &
"If whitespace might be significant, check your output.")
warning = .true.
endif
elseif (i==0) then
call FoX_error( &
"Fortran made FoX insert a newline but it can't. Stopping now.")
elseif (ws_) then
call FoX_error( &
"Fortran made FoX insert a newline but whitespace is significant. Stopping now.")
else
continue ! without error or warning, because whitespace is not significant
endif
write(buffer%unit, '(a)') s2(n:n+i-1)
n = n + i
else
! We don't need to do anything, just add the remainder to the buffer.
exit
endif
enddo
len_b = len(s2) - n + 1
buffer%str(:len_b) = s2(n:)
buffer%size = len_b
end subroutine add_to_buffer
#endif
end module m_common_buffer

View file

@ -1,447 +0,0 @@
module m_common_charset
#ifndef DUMMYLIB
! Written to use ASCII charset only. Full UNICODE would
! take much more work and need a proper unicode library.
use fox_m_fsys_string, only: toLower
implicit none
private
!!$ character(len=1), parameter :: ASCII = &
!!$achar(0)//achar(1)//achar(2)//achar(3)//achar(4)//achar(5)//achar(6)//achar(7)//achar(8)//achar(9)//&
!!$achar(10)//achar(11)//achar(12)//achar(13)//achar(14)//achar(15)//achar(16)//achar(17)//achar(18)//achar(19)//&
!!$achar(20)//achar(21)//achar(22)//achar(23)//achar(24)//achar(25)//achar(26)//achar(27)//achar(28)//achar(29)//&
!!$achar(30)//achar(31)//achar(32)//achar(33)//achar(34)//achar(35)//achar(36)//achar(37)//achar(38)//achar(39)//&
!!$achar(40)//achar(41)//achar(42)//achar(43)//achar(44)//achar(45)//achar(46)//achar(47)//achar(48)//achar(49)//&
!!$achar(50)//achar(51)//achar(52)//achar(53)//achar(54)//achar(55)//achar(56)//achar(57)//achar(58)//achar(59)//&
!!$achar(60)//achar(61)//achar(62)//achar(63)//achar(64)//achar(65)//achar(66)//achar(67)//achar(68)//achar(69)//&
!!$achar(70)//achar(71)//achar(72)//achar(73)//achar(74)//achar(75)//achar(76)//achar(77)//achar(78)//achar(79)//&
!!$achar(80)//achar(81)//achar(82)//achar(83)//achar(84)//achar(85)//achar(86)//achar(87)//achar(88)//achar(89)//&
!!$achar(90)//achar(91)//achar(92)//achar(93)//achar(94)//achar(95)//achar(96)//achar(97)//achar(98)//achar(99)//&
!!$achar(100)//achar(101)//achar(102)//achar(103)//achar(104)//achar(105)//achar(106)//achar(107)//achar(108)//achar(109)//&
!!$achar(110)//achar(111)//achar(112)//achar(113)//achar(114)//achar(115)//achar(116)//achar(117)//achar(118)//achar(119)//&
!!$achar(120)//achar(121)//achar(122)//achar(123)//achar(124)//achar(125)//achar(126)//achar(127)
character(len=1), parameter :: SPACE = achar(32)
character(len=1), parameter :: NEWLINE = achar(10)
character(len=1), parameter :: CARRIAGE_RETURN = achar(13)
character(len=1), parameter :: TAB = achar(9)
character(len=*), parameter :: whitespace = SPACE//NEWLINE//CARRIAGE_RETURN//TAB
character(len=*), parameter :: lowerCase = "abcdefghijklmnopqrstuvwxyz"
character(len=*), parameter :: upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
character(len=*), parameter :: digits = "0123456789"
character(len=*), parameter :: hexdigits = "0123456789abcdefABCDEF"
character(len=*), parameter :: InitialNCNameChars = lowerCase//upperCase//"_"
character(len=*), parameter :: NCNameChars = InitialNCNameChars//digits//".-"
character(len=*), parameter :: InitialNameChars = InitialNCNameChars//":"
character(len=*), parameter :: NameChars = NCNameChars//":"
character(len=*), parameter :: PubIdChars = NameChars//whitespace//"'()+,/=?;!*#@$%"
character(len=*), parameter :: validchars = &
whitespace//"!""#$%&'()*+,-./"//digits// &
":;<=>?@"//upperCase//"[\]^_`"//lowerCase//"{|}~"
! these are all the standard ASCII printable characters: whitespace + (33-126)
! which are the only characters we can guarantee to know how to handle properly.
integer, parameter :: XML1_0 = 10 ! NB 0x7F was legal in XML-1.0, but illegal in XML-1.1
integer, parameter :: XML1_1 = 11
character(len=*), parameter :: XML1_0_ILLEGALCHARS = achar(0)
character(len=*), parameter :: XML1_1_ILLEGALCHARS = NameChars
character(len=*), parameter :: XML1_0_INITIALNAMECHARS = InitialNameChars
character(len=*), parameter :: XML1_1_INITIALNAMECHARS = InitialNameChars
character(len=*), parameter :: XML1_0_NAMECHARS = NameChars
character(len=*), parameter :: XML1_1_NAMECHARS = NameChars
character(len=*), parameter :: XML1_0_INITIALNCNAMECHARS = InitialNCNameChars
character(len=*), parameter :: XML1_1_INITIALNCNAMECHARS = InitialNCNameChars
character(len=*), parameter :: XML1_0_NCNAMECHARS = NCNameChars
character(len=*), parameter :: XML1_1_NCNAMECHARS = NCNameChars
character(len=*), parameter :: XML_WHITESPACE = whitespace
character(len=*), parameter :: XML_INITIALENCODINGCHARS = lowerCase//upperCase
character(len=*), parameter :: XML_ENCODINGCHARS = lowerCase//upperCase//digits//'._-'
public :: validchars
public :: whitespace
public :: uppercase
public :: digits
public :: hexdigits
public :: XML1_0
public :: XML1_1
public :: XML1_0_NAMECHARS
public :: XML1_1_NAMECHARS
public :: XML1_0_INITIALNAMECHARS
public :: XML1_1_INITIALNAMECHARS
public :: XML_WHITESPACE
public :: XML_INITIALENCODINGCHARS
public :: XML_ENCODINGCHARS
public :: isLegalChar
public :: isLegalCharRef
public :: isRepCharRef
public :: isInitialNameChar
public :: isNameChar
public :: isInitialNCNameChar
public :: isNCNameChar
public :: isXML1_0_NameChar
public :: isXML1_1_NameChar
public :: checkChars
public :: isUSASCII
public :: allowed_encoding
contains
pure function isLegalChar(c, ascii_p, xml_version) result(p)
character, intent(in) :: c
! really we should check the encoding here & be more intelligent
! for now we worry only about is it ascii or not.
logical, intent(in) :: ascii_p
integer, intent(in) :: xml_version
logical :: p
! Is this character legal as a source character in the document?
integer :: i
i = iachar(c)
if (i<0) then
p = .false.
return
elseif (i>127) then
p = .not.ascii_p
return
! ie if we are ASCII, then >127 is definitely illegal.
! otherwise maybe it's ok
endif
select case(xml_version)
case (XML1_0)
p = (i==9.or.i==10.or.i==13.or.(i>31.and.i<128))
case (XML1_1)
p = (i==9.or.i==10.or.i==13.or.(i>31.and.i<127))
! NB 0x7F was legal in XML-1.0, but illegal in XML-1.1
end select
end function isLegalChar
pure function isLegalCharRef(i, xml_version) result(p)
integer, intent(in) :: i
integer, intent(in) :: xml_version
logical :: p
! Is Unicode character #i legal as a character reference?
if (xml_version==XML1_0) then
p = (i==9).or.(i==10).or.(i==13).or.(i>31.and.i<55296).or.(i>57343.and.i<65534).or.(i>65535.and.i<1114112)
elseif (xml_version==XML1_1) then
p = (i>0.and.i<55296).or.(i>57343.and.i<65534).or.(i>65535.and.i<1114112)
! XML 1.1 made all control characters legal as character references.
end if
end function isLegalCharRef
pure function isRepCharRef(i, xml_version) result(p)
integer, intent(in) :: i
integer, intent(in) :: xml_version
logical :: p
! Is Unicode character #i legal and representable here?
if (xml_version==XML1_0) then
p = (i==9).or.(i==10).or.(i==13).or.(i>31.and.i<128)
elseif (xml_version==XML1_1) then
p = (i>0.and.i<128)
! XML 1.1 made all control characters legal as character references.
end if
end function isRepCharRef
pure function isInitialNameChar(c, xml_version) result(p)
character, intent(in) :: c
integer, intent(in) :: xml_version
logical :: p
select case(xml_version)
case (XML1_0)
p = (verify(c, XML1_0_INITIALNAMECHARS)==0)
case (XML1_1)
p = (verify(c, XML1_1_INITIALNAMECHARS)==0)
end select
end function isInitialNameChar
pure function isNameChar(c, xml_version) result(p)
character(len=*), intent(in) :: c
integer, intent(in) :: xml_version
logical :: p
select case(xml_version)
case (XML1_0)
p = (verify(c, XML1_0_NAMECHARS)==0)
case (XML1_1)
p = (verify(c, XML1_1_NAMECHARS)==0)
end select
end function isNameChar
pure function isInitialNCNameChar(c, xml_version) result(p)
character, intent(in) :: c
integer, intent(in) :: xml_version
logical :: p
select case(xml_version)
case (XML1_0)
p = (verify(c, XML1_0_INITIALNCNAMECHARS)==0)
case (XML1_1)
p = (verify(c, XML1_1_INITIALNCNAMECHARS)==0)
end select
end function isInitialNCNameChar
pure function isNCNameChar(c, xml_version) result(p)
character(len=*), intent(in) :: c
integer, intent(in) :: xml_version
logical :: p
select case(xml_version)
case (XML1_0)
p = (verify(c, XML1_0_NCNAMECHARS)==0)
case (XML1_1)
p = (verify(c, XML1_1_NCNAMECHARS)==0)
end select
end function isNCNameChar
function isXML1_0_NameChar(c) result(p)
character, intent(in) :: c
logical :: p
p = (verify(c, XML1_0_NAMECHARS)==0)
end function isXML1_0_NameChar
function isXML1_1_NameChar(c) result(p)
character, intent(in) :: c
logical :: p
p = (verify(c, XML1_1_NAMECHARS)==0)
end function isXML1_1_NameChar
pure function checkChars(value, xv) result(p)
character(len=*), intent(in) :: value
integer, intent(in) :: xv
logical :: p
! This checks if value only contains values
! legal to appear (escaped or unescaped)
! according to whichever XML version is in force.
integer :: i
p = .true.
do i = 1, len(value)
if (xv == XML1_0) then
select case(iachar(value(i:i)))
case (0,8)
p = .false.
case (11,12)
p = .false.
end select
else
if (iachar(value(i:i))==0) p =.false.
endif
enddo
end function checkChars
function isUSASCII(encoding) result(p)
character(len=*), intent(in) :: encoding
logical :: p
character(len=len(encoding)) :: enc
enc = toLower(encoding)
p = (enc=="ansi_x3.4-1968" &
.or. enc=="ansi_x3.4-1986" &
.or. enc=="iso_646.irv:1991" &
.or. enc=="ascii" &
.or. enc=="iso646-us" &
.or. enc=="us-ascii" &
.or. enc=="us" &
.or. enc=="ibm367" &
.or. enc=="cp367" &
.or. enc=="csascii")
end function isUSASCII
function allowed_encoding(encoding) result(p)
character(len=*), intent(in) :: encoding
logical :: p
character(len=len(encoding)) :: enc
logical :: utf8, usascii, iso88591, iso88592, iso88593, iso88594, &
iso88595, iso88596, iso88597, iso88598, iso88599, iso885910, &
iso885913, iso885914, iso885915, iso885916
enc = toLower(encoding)
! From http://www.iana.org/assignments/character-sets
! We can only reliably do US-ASCII (the below is mostly
! a list of synonyms for US-ASCII) but we also accept
! UTF-8 as a practicality. We bail out if any non-ASCII
! characters are used later on.
utf8 = (enc=="utf-8")
usascii = (enc=="ansi_x3.4-1968" &
.or. enc=="ansi_x3.4-1986" &
.or. enc=="iso_646.irv:1991" &
.or. enc=="ascii" &
.or. enc=="iso646-us" &
.or. enc=="us-ascii" &
.or. enc=="us" &
.or. enc=="ibm367" &
.or. enc=="cp367" &
.or. enc=="csascii")
! As of FoX 4.0, we accept ISO-8859-??, also as practicality
! since we know it is identical to ASCII as far as 0x7F
iso88591 = (enc =="iso_8859-1:1987" &
.or. enc=="iso-ir-100" &
.or. enc=="iso_8859-1" &
.or. enc=="iso-8859-1" &
.or. enc=="latin1" &
.or. enc=="l1" &
.or. enc=="ibm819" &
.or. enc=="cp819" &
.or. enc=="csisolatin1")
iso88592 = (enc=="iso_8859-2:1987" &
.or. enc=="iso-ir-101" &
.or. enc=="iso_8859-2" &
.or. enc=="iso-8859-2" &
.or. enc=="latin2" &
.or. enc=="l2" &
.or. enc=="csisolatin2")
iso88593 = (enc=="iso_8859-3:1988" &
.or. enc=="iso-ir-109" &
.or. enc=="iso_8859-3" &
.or. enc=="iso-8859-3" &
.or. enc=="latin3" &
.or. enc=="l3" &
.or. enc=="csisolatin3")
iso88594 = (enc=="iso_8859-4:1988" &
.or. enc=="iso-ir-110" &
.or. enc=="iso_8859-4" &
.or. enc=="iso-8859-4" &
.or. enc=="latin4" &
.or. enc=="l4" &
.or. enc=="csisolatin4")
iso88595 = (enc=="iso_8859-5:1988" &
.or. enc=="iso-ir-144" &
.or. enc=="iso_8859-5" &
.or. enc=="iso-8859-5" &
.or. enc=="cyrillic" &
.or. enc=="csisolatincyrillic")
iso88596 = (enc=="iso_8859-6:1987" &
.or. enc=="iso-ir-127" &
.or. enc=="iso_8859-6" &
.or. enc=="iso-8859-6" &
.or. enc=="ecma-114" &
.or. enc=="asmo-708" &
.or. enc=="arabic" &
.or. enc=="csisolatinarabic")
iso88597 = (enc=="iso_8859-7:1987" &
.or. enc=="iso-ir-126" &
.or. enc=="iso_8859-7" &
.or. enc=="iso-8859-7" &
.or. enc=="elot_928" &
.or. enc=="ecma-118" &
.or. enc=="greek" &
.or. enc=="greek8" &
.or. enc=="csisolatingreek")
iso88598 = (enc=="iso_8859-8:1988" &
.or. enc=="iso-ir-138" &
.or. enc=="iso_8859-8" &
.or. enc=="iso-8859-8" &
.or. enc=="hebrew" &
.or. enc=="csisolatinhebrew")
iso88599 = (enc=="iso_8859-9:1989" &
.or. enc=="iso-ir-148" &
.or. enc=="iso_8859-9" &
.or. enc=="iso-8859-9" &
.or. enc=="latin5" &
.or. enc=="l5" &
.or. enc=="csisolatin5")
iso885910 = (enc=="iso-8859-10" &
.or. enc=="iso-ir-157" &
.or. enc=="l6" &
.or. enc=="iso_8859-10:1992" &
.or. enc=="csisolatin6" &
.or. enc=="latin6")
! ISO 6937 replaces $ sign with currency sign.
! JIS-X0201 has Yen instead of backslash, macron instead of tilde
! 16, 17, 18, 19 - Japanese encoding we can't use.
! BS 4730 replaces hash with UK pound sign, and tilde to macron
! 21, 22, 23, 24, 25, 26 - other variants of iso646, similar but not identical
! iso10646utf1 = (enc=="iso-10646-utf-1") ! FIXME check
! iso656basic1983 = (enc=="iso_646.basic:1983" &
! .or. enc=="csiso646basic1983") ! FIXME check
! INVARIANT - almost but not quite a subset of ASCII
! iso646irv = (enc=="iso_646.irv:1983" &
! .or. enc=="iso-ir-2" &
! .or. enc=="irv")
! 31, 32, 33, 34 - NATS scandinavian, different from ASCII
! 35 - another iso646 variant
! 36, 37, 38 Korean shifted/multibyte
! 39, 40 Japanese shifted/multibyte
! 41, 42, JIS (iso646inv 7 bits)
! 43 another iso646 variantt
! 44, 45 greek variants
! 46 another iso646 variant
! 47 greek
! 48 cyrillic ascii relationship unknown
! 49 JIS again
! 50 similar not identical
! 51, 52, 53 not identical
! 54 see 48
! 55 see 47
! 56 another iso646 variant
! 57 chinese
! ... to be continued
iso885913 = (enc=="iso-8859-13")
iso885914 = (enc=="iso-8859-14" &
.or. enc=="iso-ir-199" &
.or. enc=="iso_8859-14:1998" &
.or. enc=="iso_8849-14" &
.or. enc=="iso_latin8" &
.or. enc=="iso-celtic" &
.or. enc=="l8")
iso885915 = (enc=="iso-8859-15" &
.or. enc=="iso-8859-15" &
.or. enc=="latin-9")
iso885916 = (enc=="iso-8859-16" &
.or. enc=="iso-ir226" &
.or. enc=="iso_8859-16:2001" &
.or. enc=="iso_8859-16" &
.or. enc=="latin10" &
.or. enc=="l10")
p = utf8.or.usascii.or.iso88591.or.iso88592.or.iso88593 &
.or.iso88594.or.iso88595.or.iso88596.or.iso88597 &
.or.iso88598.or.iso88599.or.iso885910.or.iso885913 &
.or.iso885914.or.iso885915.or.iso885916
end function allowed_encoding
#endif
end module m_common_charset

View file

@ -1,490 +0,0 @@
module m_common_content_model
#ifndef DUMMYLIB
! Allow validating the content model of an XML document
use fox_m_fsys_array_str, only: str_vs, vs_str_alloc, vs_vs_alloc
implicit none
private
integer, parameter :: OP_NULL = 0
integer, parameter :: OP_EMPTY = 1
integer, parameter :: OP_ANY = 2
integer, parameter :: OP_MIXED = 3
integer, parameter :: OP_NAME = 4
integer, parameter :: OP_CHOICE = 5
integer, parameter :: OP_SEQ = 6
integer, parameter :: REP_NULL = 0
integer, parameter :: REP_ONCE = 1
integer, parameter :: REP_QUESTION_MARK = 2
integer, parameter :: REP_ASTERISK = 3
type content_particle_t
character, pointer :: name(:) => null()
integer :: operator = OP_NULL
integer :: repeater = REP_NULL
type(content_particle_t), pointer :: nextSibling => null()
type(content_particle_t), pointer :: parent => null()
type(content_particle_t), pointer :: firstChild => null()
end type content_particle_t
public :: content_particle_t
public :: newCP
public :: transformCPPlus
public :: checkCP
public :: checkCPToEnd
public :: elementContentCP
public :: emptyContentCP
public :: destroyCPtree
public :: dumpCPtree
public :: OP_NULL, OP_NAME, OP_MIXED, OP_CHOICE, OP_SEQ
public :: REP_QUESTION_MARK, REP_ASTERISK
contains
function newCP(empty, any, name, repeat) result(cp)
logical, intent(in), optional :: empty
logical, intent(in), optional :: any
character(len=*), intent(in), optional :: name
character, intent(in), optional :: repeat
type(content_particle_t), pointer :: cp
allocate(cp)
if (present(empty)) then
cp%operator = OP_EMPTY
elseif (present(any)) then
cp%operator = OP_ANY
elseif (present(name)) then
cp%operator = OP_NAME
cp%name => vs_str_alloc(name)
else
cp%operator = OP_SEQ
endif
if (present(repeat)) then
select case (repeat)
case("?")
cp%repeater = REP_QUESTION_MARK
case("*")
cp%repeater = REP_ASTERISK
end select
endif
end function newCP
function copyCP(cp) result(cp_out)
type(content_particle_t), pointer :: cp
type(content_particle_t), pointer :: cp_out
allocate(cp_out)
if (associated(cp%name)) cp_out%name => vs_vs_alloc(cp%name)
cp_out%operator = cp%operator
cp_out%repeater = cp%repeater
end function copyCP
function copyCPtree(cp) result(cp_out)
type(content_particle_t), pointer :: cp
type(content_particle_t), pointer :: cp_out
type(content_particle_t), pointer :: tcp, tcp_out, tcpn_out, tcpp_out
logical :: done
tcp => cp
cp_out => copyCP(cp)
tcp_out => cp_out
done = .false.
do while (associated(tcp_out))
if (.not.done) then
do while (associated(tcp%firstChild))
tcp => tcp%firstChild
tcpn_out => copyCP(tcp)
tcp_out%firstChild => tcpn_out
tcpn_out%parent => tcp_out
tcp_out => tcpn_out
enddo
endif
tcpp_out => tcp_out%parent
if (associated(tcp%nextSibling)) then
done = .false.
tcp => tcp%nextSibling
tcpn_out => copyCP(tcp)
tcp_out%nextSibling => tcpn_out
tcpn_out%parent => tcpp_out
tcp_out => tcpn_out
else
done = .true.
tcp => tcp%parent
tcp_out => tcp_out%parent
endif
enddo
end function copyCPtree
subroutine transformCPPlus(cp)
type(content_particle_t), pointer :: cp
type(content_particle_t), pointer :: tcp, cp_new
! Make copy of cp, and graft children on
cp_new => copyCP(cp)
cp_new%firstChild => cp%firstChild
! Reset children's parents ...
tcp => cp%firstChild
do while (associated(tcp))
tcp%parent => cp_new
tcp => tcp%nextSibling
enddo
! Clear cp & make it an SEQ
if (associated(cp%name)) deallocate(cp%name)
cp%operator = OP_SEQ
! Append our copied cp to the now-an-SEQ
cp%firstChild => cp_new
cp_new%parent => cp
! Copy it for a sibling, and make the sibling a *
cp_new%nextSibling => copyCPtree(cp_new)
cp_new%nextSibling%parent => cp
cp_new%nextSibling%repeater = REP_ASTERISK
end subroutine transformCPPlus
function checkCP(cp, name) result(p)
type(content_particle_t), pointer :: cp
character(len=*), intent(in) :: name
logical :: p
type(content_particle_t), pointer :: tcp
! for EMPTY, ANY or MIXED, cp never moves.
! for element content, we move the pointer as we
! move through the regex.
! If the regex includes ambiguous content, we are
! a bit screwed. But the document is in error if so.
! (and we are not required to diagnose errors.)
p = .false.
if (.not.associated(cp)) return
select case(cp%operator)
case (OP_EMPTY)
continue ! anything fails
case (OP_ANY)
p = .true.
case (OP_MIXED)
tcp => cp%firstChild
do while (associated(tcp))
if (name==str_vs(tcp%name)) then
p = .true.
exit
endif
tcp => tcp%nextSibling
enddo
case default
do
if (.not.associated(cp)) exit
select case (cp%operator)
case (OP_NAME)
p = (name==str_vs(cp%name))
if (p) then
tcp => nextCPAfterMatch(cp)
cp => tcp
exit
else
tcp => nextCPAfterFail(cp)
cp => tcp
endif
case (OP_CHOICE, OP_SEQ)
cp => cp%firstChild
end select
end do
end select
end function checkCP
function nextCPaftermatch(cp) result(cp_next)
type (content_particle_t), pointer :: cp
type (content_particle_t), pointer :: cp_next
type (content_particle_t), pointer :: tcp
cp_next => cp
do
if (cp_next%repeater==REP_ASTERISK) exit
tcp => cp_next%parent
if (associated(tcp)) then
if (tcp%operator==OP_CHOICE) then
! siblings are uninteresting, we've matched this CHOICE
cp_next => tcp
! Move up & try the whole thing again on the parent CHOICE
elseif (tcp%operator==OP_SEQ) then
! we do care about siblings, move onto next one
if (associated(cp_next%nextSibling)) then
cp_next => cp_next%nextSibling
! thatll do, itll be the next thing to try
exit
else
! No sibling, move up a level
cp_next => tcp
! and try again
endif
endif
else
! We've got to the top already.
cp_next => tcp
exit
endif
enddo
end function nextCPaftermatch
function nextCPafterfail(cp) result(cp_next)
type(content_particle_t), pointer :: cp
type(content_particle_t), pointer :: cp_next
type(content_particle_t), pointer :: tcp
logical :: match
match = .false.
cp_next => cp
do
tcp => cp_next%parent
if (associated(tcp)) then
if (tcp%operator==OP_CHOICE) then
! we care about siblings, lets try the next one
if (associated(cp_next%nextSibling)) then
cp_next => cp_next%nextSibling
! super, lets go back and try that
exit
else ! weve failed to match any cp in this CHOICE ...
cp_next => tcp
! go up a level and see if theres another legitimate choice
endif
elseif (tcp%operator==OP_SEQ) then
if ((match.or.cp_next%repeater/=REP_NULL) &
.and.associated(cp_next%nextSibling)) then
! we were allowed to fail to match, try sibling
cp_next => cp_next%nextSibling
exit
elseif (cp_next%repeater/=REP_NULL) then
match = .true.
! The last item was optional, so weve matched at this level
cp_next => tcp
elseif (associated(tcp%firstChild, cp_next)) then
! we havent matched - but we hadnt started, Maybe it was ok
! not to match because we are nested inside an optional thingy
cp_next => tcp
else
! We were not allowed to fail there,
! there is no legitimate next choice.
cp_next => null()
exit
endif
endif
else
! weve got all the way to the top without
! finding a new cp to try. But if this top-level
! cp is ASTERISK'ed we can try it agin
cp_next => null()
exit
endif
enddo
end function nextCPafterfail
function checkCPToEnd(cp) result(p)
type(content_particle_t), pointer :: cp
logical :: p
type(content_particle_t), pointer :: tcp
if (associated(cp)) then
select case(cp%operator)
case (OP_EMPTY, OP_ANY, OP_MIXED)
p = .true.
case default
tcp => nextCPMustMatch(cp)
p = .not.associated(tcp)
end select
else
p = .true.
endif
end function checkCPToEnd
function nextCPMustMatch(cp) result(cp_next)
type(content_particle_t), pointer :: cp
type(content_particle_t), pointer :: cp_next
type(content_particle_t), pointer :: tcp
if (.not.associated(cp)) return
if (.not.associated(cp%parent)) then
! we havent started exploring this one.
! get the first starting position
cp_next => cp
do while (cp_next%repeater==REP_NULL)
if (associated(cp_next%firstChild)) then
cp_next => cp_next%firstChild
else
exit
endif
enddo
else
cp_next => cp
endif
if (cp_next%repeater==REP_NULL) return
do
tcp => cp_next%parent
if (associated(tcp)) then
if (tcp%operator==OP_CHOICE) then
! its matched by the optional one we are on, go up a level
cp_next => tcp
elseif (tcp%operator==OP_SEQ) then
! check all siblings for any compulsory ones
do while (associated(cp_next%nextSibling))
cp_next => cp_next%nextSibling
if (cp_next%repeater==REP_NULL) return
enddo
! all were optional, go up a level
cp_next => tcp
endif
else
! weve got all the way to the top without
! finding a new cp to try
cp_next => tcp
exit
endif
enddo
end function nextCPMustMatch
function elementContentCP(cp) result(p)
type(content_particle_t), pointer :: cp
logical :: p
if (associated(cp)) then
select case (cp%operator)
case (OP_EMPTY, OP_ANY, OP_MIXED)
p = .false.
case default
p = .true.
end select
else
p = .true.
endif
end function elementContentCP
function emptyContentCP(cp) result(p)
type(content_particle_t), pointer :: cp
logical :: p
if (associated(cp)) then
p = cp%operator==OP_EMPTY
else
p = .false.
endif
end function emptyContentCP
subroutine destroyCP(cp)
type(content_particle_t), pointer :: cp
if (associated(cp%name)) deallocate(cp%name)
deallocate(cp)
end subroutine destroyCP
subroutine destroyCPtree(cp)
type(content_particle_t), pointer :: cp
type(content_particle_t), pointer :: current, tcp
current => cp
do
do while (associated(current%firstChild))
current => current%firstChild
enddo
if (associated(current, cp)) exit
tcp => current
if (associated(current%nextSibling)) then
current => current%nextSibling
call destroyCP(tcp)
else
current => current%parent
call destroyCP(tcp)
current%firstChild => null()
endif
enddo
call destroyCP(cp)
end subroutine destroyCPtree
subroutine dumpCP(cp)
type(content_particle_t), pointer :: cp
select case(cp%operator)
case (OP_EMPTY)
write(*,'(a)', advance="no") "EMPTY"
case (OP_ANY)
write(*,'(a)', advance="no") "ANY"
case (OP_MIXED)
write(*,'(a)', advance="no") "MIXED"
case (OP_NAME)
write(*,'(a)', advance="no") str_vs(cp%name)
case (OP_CHOICE)
write(*,'(a)', advance="no") "CHOICE"
case (OP_SEQ)
write(*,'(a)', advance="no") "SEQ"
end select
select case(cp%repeater)
case (REP_QUESTION_MARK)
write(*,'(a)', advance="no") "?"
case (REP_ASTERISK)
write(*,'(a)', advance="no") "*"
end select
write(*,*)
end subroutine dumpCP
subroutine dumpCPtree(cp)
type(content_particle_t), pointer :: cp
type(content_particle_t), pointer :: current
integer :: i
logical :: done
i = 0
current => cp
done = .false.
call dumpCP(current)
do
if (.not.done) then
do while (associated(current%firstChild))
i = i + 2
current => current%firstChild
write(*,'(a)', advance="no") repeat(" ",i)
call dumpCP(current)
enddo
endif
if (associated(current, cp)) exit
if (associated(current%nextSibling)) then
done = .false.
current => current%nextSibling
write(*,'(a)', advance="no") repeat(" ",i)
call dumpCP(current)
else
done = .true.
i = i - 2
current => current%parent
endif
enddo
end subroutine dumpCPtree
#endif
end module m_common_content_model

File diff suppressed because it is too large Load diff

View file

@ -1,236 +0,0 @@
module m_common_elstack
#ifndef DUMMYLIB
use fox_m_fsys_array_str, only: str_vs, vs_str
use m_common_error, only: FoX_fatal
use m_common_content_model, only: content_particle_t, checkCP, &
elementContentCP, emptyContentCP, checkCPToEnd
implicit none
private
! Element stack during parsing. Keeps track of element names
! and optionally tracks validity of content model
! Initial stack size:
integer, parameter :: STACK_SIZE_INIT = 10
! Multiplier when stack is exceeded:
real, parameter :: STACK_SIZE_MULT = 1.5
type :: elstack_item
character, dimension(:), pointer :: name => null()
type(content_particle_t), pointer :: cp => null()
end type elstack_item
type :: elstack_t
private
integer :: n_items
type(elstack_item), pointer, dimension(:) :: stack => null()
end type elstack_t
public :: elstack_t
public :: push_elstack, pop_elstack, init_elstack, destroy_elstack, reset_elstack, print_elstack
public :: get_top_elstack, is_empty
public :: checkContentModel
public :: checkContentModelToEnd
public :: elementContent
public :: emptyContent
public :: len
interface len
module procedure number_of_items
end interface
interface is_empty
module procedure is_empty_elstack
end interface
contains
subroutine init_elstack(elstack)
type(elstack_t), intent(inout) :: elstack
! We go from 0 (and initialize the 0th string to "")
! in order that we can safely check the top of an
! empty stack
allocate(elstack%stack(0:STACK_SIZE_INIT))
elstack%n_items = 0
allocate(elstack%stack(0)%name(0))
end subroutine init_elstack
subroutine destroy_elstack(elstack)
type(elstack_t), intent(inout) :: elstack
integer :: i
do i = 0, elstack % n_items
deallocate(elstack%stack(i)%name)
enddo
deallocate(elstack%stack)
end subroutine destroy_elstack
subroutine reset_elstack(elstack)
type(elstack_t), intent(inout) :: elstack
call destroy_elstack(elstack)
call init_elstack(elstack)
end subroutine reset_elstack
subroutine resize_elstack(elstack)
type(elstack_t), intent(inout) :: elstack
type(elstack_item), dimension(0:ubound(elstack%stack,1)) :: temp
integer :: i, s
s = ubound(elstack%stack, 1)
do i = 0, s
temp(i)%name => elstack%stack(i)%name
temp(i)%cp => elstack%stack(i)%cp
enddo
deallocate(elstack%stack)
allocate(elstack%stack(0:nint(s*STACK_SIZE_MULT)))
do i = 0, s
elstack%stack(i)%name => temp(i)%name
elstack%stack(i)%cp => temp(i)%cp
enddo
end subroutine resize_elstack
pure function is_empty_elstack(elstack) result(answer)
type(elstack_t), intent(in) :: elstack
logical :: answer
answer = (elstack%n_items == 0)
end function is_empty_elstack
function number_of_items(elstack) result(n)
type(elstack_t), intent(in) :: elstack
integer :: n
n = elstack%n_items
end function number_of_items
subroutine push_elstack(elstack, name, cp)
type(elstack_t), intent(inout) :: elstack
character(len=*), intent(in) :: name
type(content_particle_t), pointer, optional :: cp
integer :: n
n = elstack%n_items
n = n + 1
if (n == size(elstack%stack)) then
call resize_elstack(elstack)
endif
allocate(elstack%stack(n)%name(len(name)))
elstack%stack(n)%name = vs_str(name)
if (present(cp)) elstack%stack(n)%cp => cp
elstack%n_items = n
end subroutine push_elstack
function pop_elstack(elstack) result(item)
type(elstack_t), intent(inout) :: elstack
character(len=merge(size(elstack%stack(elstack%n_items)%name), 0, elstack%n_items > 0)) :: item
integer :: n
n = elstack%n_items
if (n == 0) then
call FoX_fatal("Element stack empty")
endif
item = str_vs(elstack%stack(n)%name)
deallocate(elstack%stack(n)%name)
elstack%n_items = n - 1
end function pop_elstack
pure function get_top_elstack(elstack) result(item)
! Get the top element of the stack, *without popping it*.
type(elstack_t), intent(in) :: elstack
character(len=merge(size(elstack%stack(elstack%n_items)%name), 0, elstack%n_items > 0)) :: item
integer :: n
n = elstack%n_items
if (n==0) then
item = ""
else
item = str_vs(elstack%stack(n)%name)
endif
end function get_top_elstack
function checkContentModel(elstack, name) result(p)
type(elstack_t), intent(inout) :: elstack
character(len=*), intent(in) :: name
logical :: p
type(content_particle_t), pointer :: cp
integer :: n
n = elstack%n_items
if (n==0) then
p = .true.
else
cp => elstack%stack(n)%cp
p = checkCP(cp, name)
elstack%stack(n)%cp => cp
endif
end function checkContentModel
function checkContentModelToEnd(elstack) result(p)
type(elstack_t), intent(inout) :: elstack
logical :: p
type(content_particle_t), pointer :: cp
integer :: n
n = elstack%n_items
cp => elstack%stack(n)%cp
p = checkCPToEnd(cp)
end function checkContentModelToEnd
function elementContent(elstack) result(p)
type(elstack_t), intent(in) :: elstack
logical :: p
integer :: n
n = elstack%n_items
if (n==0) then
p = .false.
else
p = elementContentCP(elstack%stack(n)%cp)
endif
end function elementContent
function emptyContent(elstack) result(p)
type(elstack_t), intent(in) :: elstack
logical :: p
integer :: n
n = elstack%n_items
if (n==0) then
p = .false.
else
p = emptyContentCP(elstack%stack(n)%cp)
endif
end function emptyContent
subroutine print_elstack(elstack,unit)
type(elstack_t), intent(in) :: elstack
integer, intent(in) :: unit
integer :: i
do i = elstack%n_items, 1, -1
write(unit=unit,fmt=*) elstack%stack(i)%name
enddo
end subroutine print_elstack
#endif
end module m_common_elstack

View file

@ -1,475 +0,0 @@
module m_common_entities
#ifndef DUMMYLIB
use fox_m_fsys_array_str, only: str_vs, vs_str_alloc
use fox_m_fsys_format, only: str_to_int_10, str_to_int_16
use fox_m_utils_uri, only: URI, destroyURI
use m_common_charset, only: digits, hexdigits
use m_common_error, only: FoX_error
implicit none
private
type entity_t
logical :: external
logical :: wfc ! Was this entity declared externally or in a PE, where
! a non-validating processor might not see it?
character(len=1), dimension(:), pointer :: name => null()
character(len=1), dimension(:), pointer :: text => null()
character(len=1), dimension(:), pointer :: publicId => null()
character(len=1), dimension(:), pointer :: systemId => null()
character(len=1), dimension(:), pointer :: notation => null()
type(URI), pointer :: baseURI => null()
end type entity_t
type entity_list
private
type(entity_t), dimension(:), pointer :: list => null()
end type entity_list
public :: is_unparsed_entity
public :: is_external_entity
public :: expand_entity_text
public :: expand_entity_text_len
public :: existing_entity
public :: expand_char_entity
public :: expand_entity
public :: expand_entity_len
public :: entity_t
public :: entity_list
public :: init_entity_list
public :: reset_entity_list
public :: destroy_entity_list
public :: print_entity_list
public :: add_internal_entity
public :: add_external_entity
public :: pop_entity_list
interface size
module procedure size_el
end interface
interface is_unparsed_entity
module procedure is_unparsed_entity_
module procedure is_unparsed_entity_from_list
end interface
public :: getEntityByIndex
public :: getEntityByName
public :: size
contains
function size_el(el) result(n)
type(entity_list), intent(in) :: el
integer :: n
n = ubound(el%list, 1)
end function size_el
function shallow_copy_entity(ent1) result(ent2)
type(entity_t), intent(in) :: ent1
type(entity_t) :: ent2
ent2%external = ent1%external
ent2%wfc = ent1%wfc
ent2%name => ent1%name
ent2%text => ent1%text
ent2%publicId => ent1%publicId
ent2%systemId => ent1%systemId
ent2%notation => ent1%notation
ent2%baseURI => ent1%baseURI
end function shallow_copy_entity
function getEntityByIndex(el, i) result(e)
type(entity_list), intent(in) :: el
integer, intent(in) :: i
type(entity_t), pointer :: e
e => el%list(i)
end function getEntityByIndex
function getEntityNameByIndex(el, i) result(c)
type(entity_list), intent(in) :: el
integer, intent(in) :: i
character(len=size(el%list(i)%name)) :: c
c = str_vs(el%list(i)%name)
end function getEntityNameByIndex
function getEntityByName(el, name) result(e)
type(entity_list), intent(in) :: el
character(len=*), intent(in) :: name
type(entity_t), pointer :: e
integer :: i
e => null()
do i = 1, size(el%list)
if (str_vs(el%list(i)%name)==name) then
e => el%list(i)
exit
endif
enddo
end function getEntityByName
subroutine destroy_entity(ent)
type(entity_t), intent(inout) :: ent
deallocate(ent%name)
deallocate(ent%text)
deallocate(ent%publicId)
deallocate(ent%systemId)
deallocate(ent%notation)
if (associated(ent%baseURI)) call destroyURI(ent%baseURI)
end subroutine destroy_entity
subroutine init_entity_list(ents)
type(entity_list), intent(inout) :: ents
if (associated(ents%list)) deallocate(ents%list)
allocate(ents%list(0))
end subroutine init_entity_list
subroutine reset_entity_list(ents)
type(entity_list), intent(inout) :: ents
call destroy_entity_list(ents)
call init_entity_list(ents)
end subroutine reset_entity_list
subroutine destroy_entity_list(ents)
type(entity_list), intent(inout) :: ents
integer :: i, n
n = size(ents%list)
do i = 1, n
call destroy_entity(ents%list(i))
enddo
deallocate(ents%list)
end subroutine destroy_entity_list
function pop_entity_list(ents) result(name)
type(entity_list), intent(inout) :: ents
character(len=size(ents%list(size(ents%list))%name)) :: name
type(entity_t), pointer :: ents_tmp(:)
integer :: i, n
n = size(ents%list)
ents_tmp => ents%list
allocate(ents%list(n-1))
do i = 1, n - 1
ents%list(i) = shallow_copy_entity(ents_tmp(i))
enddo
name = str_vs(ents_tmp(i)%name)
call destroy_entity(ents_tmp(i))
deallocate(ents_tmp)
end function pop_entity_list
subroutine print_entity_list(ents)
type(entity_list), intent(in) :: ents
integer :: i, n
n = size(ents%list)
write(*,'(a)') '>ENTITYLIST'
do i = 1, n
write(*,'(a)') str_vs(ents%list(i)%name)
write(*,'(a)') str_vs(ents%list(i)%text)
write(*,'(a)') str_vs(ents%list(i)%publicId)
write(*,'(a)') str_vs(ents%list(i)%systemId)
write(*,'(a)') str_vs(ents%list(i)%notation)
enddo
write(*,'(a)') '<ENTITYLIST'
end subroutine print_entity_list
subroutine add_entity(ents, name, text, publicId, systemId, notation, baseURI, wfc)
type(entity_list), intent(inout) :: ents
character(len=*), intent(in) :: name
character(len=*), intent(in) :: text
character(len=*), intent(in) :: publicId
character(len=*), intent(in) :: systemId
character(len=*), intent(in) :: notation
type(URI), pointer :: baseURI
logical, intent(in) :: wfc
type(entity_t), pointer :: ents_tmp(:)
integer :: i, n
! This should only ever be called by add_internal_entity or add_external_entity
! below, so we don't bother sanity-checking input. Note especially we don't
! check for duplication of entities, so this will happily add another entity
! of the same name if you ask it to. This should't matter though, since the
! first defined will always be picked up first, which is what the XML spec
! requires.
n = size(ents%list)
ents_tmp => ents%list
allocate(ents%list(n+1))
do i = 1, n
ents%list(i) = shallow_copy_entity(ents_tmp(i))
enddo
deallocate(ents_tmp)
ents%list(i)%external = len(systemId)>0
ents%list(i)%wfc = wfc
ents%list(i)%name => vs_str_alloc(name)
ents%list(i)%text => vs_str_alloc(text)
ents%list(i)%publicId => vs_str_alloc(publicId)
ents%list(i)%systemId => vs_str_alloc(systemId)
ents%list(i)%notation => vs_str_alloc(notation)
ents%list(i)%baseURI => baseURI
end subroutine add_entity
subroutine add_internal_entity(ents, name, text, baseURI, wfc)
type(entity_list), intent(inout) :: ents
character(len=*), intent(in) :: name
character(len=*), intent(in) :: text
type(URI), pointer :: baseURI
logical, intent(in) :: wfc
call add_entity(ents, name=name, text=text, &
publicId="", systemId="", notation="", baseURI=baseURI, wfc=wfc)
end subroutine add_internal_entity
subroutine add_external_entity(ents, name, systemId, baseURI, wfc, publicId, notation)
type(entity_list), intent(inout) :: ents
character(len=*), intent(in) :: name
character(len=*), intent(in) :: systemId
character(len=*), intent(in), optional :: publicId
character(len=*), intent(in), optional :: notation
type(URI), pointer :: baseURI
logical, intent(in) :: wfc
if (present(publicId) .and. present(notation)) then
call add_entity(ents, name=name, text="", &
publicId=publicId, systemId=systemId, notation=notation, &
wfc=wfc, baseURI=baseURI)
elseif (present(publicId)) then
call add_entity(ents, name=name, text="", &
publicId=publicId, systemId=systemId, notation="", &
wfc=wfc, baseURI=baseURI)
elseif (present(notation)) then
call add_entity(ents, name=name, text="", &
publicId="", systemId=systemId, notation=notation, &
wfc=wfc, baseURI=baseURI)
else
call add_entity(ents, name=name, text="", &
publicId="", systemId=systemId, notation="", &
wfc=wfc, baseURI=baseURI)
endif
end subroutine add_external_entity
function is_unparsed_entity_from_list(ents, name) result(p)
type(entity_list), intent(in) :: ents
character(len=*), intent(in) :: name
logical :: p
integer :: i
p = .false.
do i = 1, size(ents%list)
if (name == str_vs(ents%list(i)%name)) then
p = (size(ents%list(i)%notation)>0)
exit
endif
enddo
end function is_unparsed_entity_from_list
function is_unparsed_entity_(ent) result(p)
type(entity_t), intent(in) :: ent
logical :: p
p = (size(ent%notation)>0)
end function is_unparsed_entity_
function is_external_entity(ents, name) result(p)
type(entity_list), intent(in) :: ents
character(len=*), intent(in) :: name
logical :: p
integer :: i
p = .false.
do i = 1, size(ents%list)
if (name == str_vs(ents%list(i)%name)) then
p = ents%list(i)%external
exit
endif
enddo
end function is_external_entity
pure function expand_char_entity_len(name) result(n)
character(len=*), intent(in) :: name
integer :: n
integer :: number
if (name(1:1) == "#") then
if (name(2:2) == "x") then ! hex character reference
if (verify(name(3:), hexdigits) == 0) then
number = str_to_int_16(name(3:))
if (0 <= number .and. number <= 128) then
n = 1
else
n = len(name) + 2
endif
else
n = 0
endif
else ! decimal character reference
if (verify(name(3:), digits) == 0) then
number = str_to_int_10(name(2:))
if (0 <= number .and. number <= 128) then
n = 1
else
n = len(name) + 2
endif
else
n = 0
endif
endif
else
n = 0
endif
end function expand_char_entity_len
function expand_char_entity(name) result(text)
character(len=*), intent(in) :: name
character(len=expand_char_entity_len(name)) :: text
integer :: number
select case (len(text))
case (0)
call FoX_error("Invalid character entity reference")
case (1)
if (name(2:2) == "x") then ! hex character reference
number = str_to_int_16(name(3:))
else ! decimal character reference
number = str_to_int_10(name(2:))
endif
text = achar(number)
! FIXME what about > 127 ...
case default
text = "&"//name//";"
end select
end function expand_char_entity
pure function existing_entity(ents, name) result(p)
type(entity_list), intent(in) :: ents
character(len=*), intent(in) :: name
logical :: p
integer :: i
p = .false.
!FIXME the following test is not entirely in accordance with the valid chars check we do elsewhere...
do i = 1, size(ents%list)
if (name == str_vs(ents%list(i)%name)) then
p = .true.
return
endif
enddo
end function existing_entity
pure function expand_entity_text_len(ents, name) result(n)
type(entity_list), intent(in) :: ents
character(len=*), intent(in) :: name
integer :: n
integer :: i
do i = 1, size(ents%list)
if (name == str_vs(ents%list(i)%name)) then
n = size(ents%list(i)%text)
endif
enddo
end function expand_entity_text_len
function expand_entity_text(ents, name) result(text)
type(entity_list), intent(in) :: ents
character(len=*), intent(in) :: name
character(len=expand_entity_text_len(ents, name)) :: text
integer :: i
! No error checking - make sure entity exists before calling it.
do i = 1, size(ents%list)
if (name == str_vs(ents%list(i)%name)) then
text = str_vs(ents%list(i)%text)
exit
endif
enddo
end function expand_entity_text
pure function expand_entity_len(ents, name) result(n)
type(entity_list), intent(in) :: ents
character(len=*), intent(in) :: name
integer :: n
integer :: i
do i = 1, size(ents%list)
if (name == str_vs(ents%list(i)%name)) then
n = size(ents%list(i)%text)
endif
enddo
end function expand_entity_len
function expand_entity(ents, name) result(text)
type(entity_list), intent(in) :: ents
character(len=*), intent(in) :: name
character(len=expand_entity_len(ents, name)) :: text
integer :: i
do i = 1, size(ents%list)
if (name == str_vs(ents%list(i)%name)) then
text = str_vs(ents%list(i)%text)
endif
enddo
end function expand_entity
#endif
end module m_common_entities

View file

@ -1,86 +0,0 @@
module m_common_entity_expand
#ifndef DUMMYLIB
use fox_m_fsys_array_str, only: str_vs, vs_str
use m_common_entities, only: expand_char_entity
use m_common_error, only: error_stack, add_error
use m_common_namecheck, only: checkName, checkCharacterEntityReference, &
checkRepCharEntityReference
use m_common_struct, only: xml_doc_state
implicit none
private
public :: expand_entity_value_alloc
! This does the first level of expansion of the contents of an entity
! reference, for storage during processing. Only character references
! are expanded.
contains
function expand_entity_value_alloc(repl, xds, stack) result(repl_new)
!perform expansion of character entity references
! check that no parameter entities are present
! and check that all general entity references are well-formed.
!before storing it.
!
! This is only ever called from the SAX parser
! (might it be called from WXML?)
! so input & output is with character arrays, not strings.
character, dimension(:), intent(in) :: repl
type(xml_doc_state), intent(in) :: xds
type(error_stack), intent(inout) :: stack
character, dimension(:), pointer :: repl_new
character, dimension(size(repl)) :: repl_temp
integer :: i, i2, j
allocate(repl_new(0))
if (index(str_vs(repl),'%')/=0) then
call add_error(stack, "Not allowed % in internal subset general entity value")
return
endif
i = 1
i2 = 1
do
if (i>size(repl)) exit
if (repl(i)=='&') then
j = index(str_vs(repl(i+1:)),';')
if (j==0) then
call add_error(stack, "Not allowed bare & in entity value")
return
elseif (checkName(str_vs(repl(i+1:i+j-1)), xds%xml_version)) then
repl_temp(i2:i2+j) = repl(i:i+j)
i = i + j + 1
i2 = i2 + j + 1
! For SAX, we need to be able to represent the character:
elseif (checkRepCharEntityReference(str_vs(repl(i+1:i+j-1)), xds%xml_version)) then
!if it is ascii then
repl_temp(i2:i2) = vs_str(expand_char_entity(str_vs(repl(i+1:i+j-1))))
i = i + j + 1
i2 = i2 + 1
elseif (checkCharacterEntityReference(str_vs(repl(i+1:i+j-1)), xds%xml_version)) then
! We can't represent it. Issue an error and stop.
call add_error(stack, "Unable to digest character entity reference in entity value, sorry.")
return
else
call add_error(stack, "Invalid entity reference in entity value")
return
endif
else
repl_temp(i2) = repl(i)
i = i + 1
i2 = i2 + 1
endif
enddo
deallocate(repl_new)
allocate(repl_new(i2-1))
repl_new = repl_temp(:i2-1)
end function expand_entity_value_alloc
#endif
end module m_common_entity_expand

View file

@ -1,211 +0,0 @@
module m_common_error
#ifndef DUMMYLIB
use fox_m_fsys_abort_flush, only: pxfabort, pxfflush
use fox_m_fsys_array_str, only: vs_str_alloc
implicit none
private
integer, parameter :: ERR_NULL = 0
integer, parameter :: ERR_WARNING = 1
integer, parameter :: ERR_ERROR = 2
integer, parameter :: ERR_FATAL = 3
#endif
logical, save :: errors_are_fatal = .false.
logical, save :: warnings_are_fatal = .false.
#ifndef DUMMYLIB
type error_t
integer :: severity = ERR_NULL
integer :: error_code = 0
character, dimension(:), pointer :: msg => null()
end type error_t
type error_stack
type(error_t), dimension(:), pointer :: stack => null()
end type error_stack
interface FoX_warning
module procedure FoX_warning_base
end interface
interface FoX_error
module procedure FoX_error_base
end interface
interface FoX_fatal
module procedure FoX_fatal_base
end interface
public :: ERR_NULL
public :: ERR_WARNING
public :: ERR_ERROR
public :: ERR_FATAL
public :: error_t
public :: error_stack
public :: init_error_stack
public :: destroy_error_stack
public :: FoX_warning
public :: FoX_error
public :: FoX_fatal
public :: FoX_warning_base
public :: FoX_error_base
public :: FoX_fatal_base
public :: add_error
public :: in_error
#endif
public :: FoX_set_fatal_errors
public :: FoX_get_fatal_errors
public :: FoX_set_fatal_warnings
public :: FoX_get_fatal_warnings
contains
#ifndef DUMMYLIB
subroutine FoX_warning_base(msg)
! Emit warning, but carry on.
character(len=*), intent(in) :: msg
if (warnings_are_fatal) then
write(0,'(a)') 'FoX warning made fatal'
call FoX_fatal_base(msg)
endif
write(0,'(a)') 'WARNING(FoX)'
write(0,'(a)') msg
call pxfflush(0)
end subroutine FoX_warning_base
subroutine FoX_error_base(msg)
! Emit error message and stop.
! No clean up is done here, but this can
! be overridden to include clean-up routines
character(len=*), intent(in) :: msg
if (errors_are_fatal) then
write(0,'(a)') 'FoX error made fatal'
call FoX_fatal_base(msg)
endif
write(0,'(a)') 'ERROR(FoX)'
write(0,'(a)') msg
call pxfflush(0)
stop
end subroutine FoX_error_base
subroutine FoX_fatal_base(msg)
!Emit error message and abort with coredump.
!No clean-up occurs
character(len=*), intent(in) :: msg
write(0,'(a)') 'ABORT(FOX)'
write(0,'(a)') msg
call pxfflush(0)
call pxfabort()
end subroutine FoX_fatal_base
subroutine init_error_stack(stack)
type(error_stack), intent(inout) :: stack
allocate(stack%stack(0))
end subroutine init_error_stack
subroutine destroy_error_stack(stack)
type(error_stack), intent(inout) :: stack
integer :: i
do i = 1, size(stack%stack)
deallocate(stack%stack(i)%msg)
enddo
deallocate(stack%stack)
end subroutine destroy_error_stack
subroutine add_error(stack, msg, severity, error_code)
type(error_stack), intent(inout) :: stack
character(len=*), intent(in) :: msg
integer, intent(in), optional :: severity
integer, intent(in), optional :: error_code
integer :: i, n
type(error_t), dimension(:), pointer :: temp_stack
if (.not.associated(stack%stack)) &
call init_error_stack(stack)
n = size(stack%stack)
temp_stack => stack%stack
allocate(stack%stack(n+1))
do i = 1, size(temp_stack)
stack%stack(i)%msg => temp_stack(i)%msg
stack%stack(i)%severity = temp_stack(i)%severity
stack%stack(i)%error_code = temp_stack(i)%error_code
enddo
deallocate(temp_stack)
stack%stack(n+1)%msg => vs_str_alloc(msg)
if (present(severity)) then
stack%stack(n+1)%severity = severity
else
stack%stack(n+1)%severity = ERR_ERROR
endif
if (present(error_code)) then
stack%stack(n+1)%error_code = error_code
else
stack%stack(n+1)%error_code = -1
endif
end subroutine add_error
function in_error(stack) result(p)
type(error_stack), intent(in) :: stack
logical :: p
if (associated(stack%stack)) then
p = (size(stack%stack) > 0)
else
p = .false.
endif
end function in_error
#endif
subroutine FoX_set_fatal_errors(newvalue)
logical, intent(in) :: newvalue
errors_are_fatal = newvalue
end subroutine FoX_set_fatal_errors
function FoX_get_fatal_errors()
logical :: FoX_get_fatal_errors
FoX_get_fatal_errors = errors_are_fatal
end function FoX_get_fatal_errors
subroutine FoX_set_fatal_warnings(newvalue)
logical, intent(in) :: newvalue
warnings_are_fatal = newvalue
end subroutine FoX_set_fatal_warnings
function FoX_get_fatal_warnings()
logical :: FoX_get_fatal_warnings
FoX_get_fatal_warnings = warnings_are_fatal
end function FoX_get_fatal_warnings
end module m_common_error

View file

@ -1,102 +0,0 @@
module m_common_io
#ifndef DUMMYLIB
use m_common_error, only : FoX_error
implicit none
private
! Basic I/O tools
integer, save :: io_eor
integer, save :: io_eof
integer, save :: io_err
public :: io_eor
public :: io_eof
public :: io_err
public :: get_unit
public :: setup_io
contains
subroutine setup_io()
call find_eor_eof(io_eor, io_eof)
end subroutine setup_io
subroutine get_unit(lun,iostat)
! Get an available Fortran unit number
integer, intent(out) :: lun
integer, intent(out) :: iostat
integer :: i
logical :: unit_used
do i = 10, 99
lun = i
inquire(unit=lun,opened=unit_used)
if (.not. unit_used) then
iostat = 0
return
endif
enddo
iostat = -1
lun = -1
end subroutine get_unit
subroutine find_eor_eof(io_eor,io_eof)
! Determines the values of the iostat values for End of File and
! End of Record (in non-advancing I/O)
#ifdef __NAG__
use f90_iostat
#endif
integer, intent(out) :: io_eor
integer, intent(out) :: io_eof
#ifdef __NAG__
io_eor = ioerr_eor
io_eof = ioerr_eof
#else
integer :: lun, iostat
character(len=1) :: c
call get_unit(lun,iostat)
if (iostat /= 0) call FoX_error("Out of unit numbers")
open(unit=lun,status="scratch",form="formatted", &
action="readwrite",position="rewind",iostat=iostat)
if (iostat /= 0) call FoX_error("Cannot open test file")
write(unit=lun,fmt=*) "a"
write(unit=lun,fmt=*) "b"
rewind(unit=lun)
io_eor = 0
do
read(unit=lun,fmt="(a1)",advance="no",iostat=io_eor) c
if (io_eor /= 0) exit
enddo
io_eof = 0
do
read(unit=lun,fmt=*,iostat=io_eof)
if (io_eof /= 0) exit
enddo
close(unit=lun,status="delete")
#endif
! Invent an io_err ...
io_err = 1
do
if (io_err/=0.and.io_err/=io_eor.and.io_err/=io_eof) exit
io_err = io_err + 1
end do
end subroutine find_eor_eof
#endif
end module m_common_io

View file

@ -1,501 +0,0 @@
module m_common_namecheck
#ifndef DUMMYLIB
! These are basically a collection of what would be regular
! expressions in a more sensible language.
! The only external dependency should be knowing how these
! regular expressions may differ between XML-1.0 and 1.1 (which
! is only in the areas of
! 1: allowing character entity references to control characters
! 2: More characters allowed in Names (but this only affects
! unicode-aware programs, so is only skeleton here)
use fox_m_fsys_format, only: str_to_int_10, str_to_int_16, operator(//)
use fox_m_fsys_string, only: toLower
use m_common_charset, only: isLegalCharRef, isNCNameChar, &
isInitialNCNameChar, isInitialNameChar, isNameChar, isRepCharRef
implicit none
private
character(len=*), parameter :: lowerCase = "abcdefghijklmnopqrstuvwxyz"
character(len=*), parameter :: upperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
character(len=*), parameter :: letters = lowerCase//upperCase
character(len=*), parameter :: digits = "0123456789"
character(len=*), parameter :: hexdigits = "0123456789abcdefABCDEF"
character(len=*), parameter :: NameChars = lowerCase//upperCase//digits//".-_:"
public :: checkName
public :: checkNames
public :: checkQName
public :: checkQNames
public :: checkNmtoken
public :: checkNmtokens
public :: checkNCName
public :: checkNCNames
public :: checkEncName
public :: checkPITarget
public :: checkPublicId
public :: checkPEDef
public :: checkPseudoAttValue
public :: checkAttValue
public :: checkCharacterEntityReference
public :: checkRepCharEntityReference
public :: likeCharacterEntityReference
public :: prefixOfQName
public :: localpartOfQName
contains
pure function checkEncName(name) result(good)
![81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*
character(len=*), intent(in) :: name
logical :: good
integer :: n
n = len(name)
good = (n > 0)
if (good) good = (scan(name(1:1), letters) /= 0)
if (good .and. n > 1) &
good = (verify(name(2:), letters//digits//'.-_') == 0)
end function checkEncName
function checkPITarget(name, xv) result(good)
character(len=*), intent(in) :: name
integer, intent(in) :: xv
logical :: good
! Validates a string against the XML requirements for a NAME
! Is not fully compliant; ignores UTF issues.
good = checkName(name, xv) &
.and.toLower(name)/="xml"
end function checkPITarget
pure function checkName(name, xv) result(good)
character(len=*), intent(in) :: name
integer, intent(in) :: xv
logical :: good
! Validates a string against the XML requirements for a NAME
! Is not fully compliant; ignores UTF issues.
good = (len(name) > 0)
if (.not.good) return
if (good) good = isInitialNameChar(name(1:1), xv)
if (.not.good.or.len(name)==1) return
good = isNameChar(name(2:), xv)
end function checkName
pure function checkNames(name, xv) result(good)
character(len=*), intent(in) :: name
integer, intent(in) :: xv
logical :: good
! Validates a string against the production for NAMES
integer :: i, j
good = (len(name) > 0)
if (.not.good) return
i = verify(name, " ")
if (i==0) then
good = .false.
return
endif
j = scan(name(i:), " ")
if (j==0) then
j = len(name)
else
j = i + j - 2
endif
do
good = checkName(name(i:j), xv)
if (.not.good) return
i = j + 1
j = verify(name(i:), " ")
if (j==0) exit
i = i + j - 1
j = scan(name(i:), " ")
if (j==0) then
j = len(name)
else
j = i + j - 2
endif
enddo
end function checkNames
pure function checkQName(name, xv) result(good)
character(len=*), intent(in) :: name
integer, intent(in) :: xv
logical :: good
! Validates a string against the XML requirements for a NAME
! Is not fully compliant; ignores UTF issues.
integer :: n
n = index(name, ':')
if (n == 0) then
good = checkNCName(name, xv)
else
good = (checkNCName(name(:n-1), xv) .and. checkNCName(name(n+1:), xv))
endif
end function checkQName
pure function checkQNames(name, xv) result(good)
character(len=*), intent(in) :: name
integer, intent(in) :: xv
logical :: good
! Validates a string against the production for NAMES
integer :: i, j
good = (len(name) > 0)
if (.not.good) return
i = verify(name, " ")
if (i==0) then
good = .false.
return
endif
j = scan(name(i:), " ")
if (j==0) then
j = len(name)
else
j = i + j - 2
endif
do
good = checkQName(name(i:j), xv)
if (.not.good) return
i = j + 1
j = verify(name(i:), " ")
if (j==0) exit
i = i + j - 1
j = scan(name(i:), " ")
if (j==0) then
j = len(name)
else
j = i + j - 2
endif
enddo
end function checkQNames
pure function checkNCName(name, xv) result(good)
character(len=*), intent(in) :: name
integer, intent(in) :: xv
logical :: good
! Validates a string against the XML requirements for an NCNAME
! Is not fully compliant; ignores UTF issues.
good = (len(name)/=0)
if (.not.good) return
good = isInitialNCNameChar(name(1:1), xv)
if (.not.good.or.len(name)==1) return
good = isNCNameChar(name(2:), xv)
end function checkNCName
pure function checkNCNames(name, xv) result(good)
character(len=*), intent(in) :: name
integer, intent(in) :: xv
logical :: good
! Validates a string against the production for NAMES
integer :: i, j
good = (len(name) > 0)
if (.not.good) return
i = verify(name, " ")
if (i==0) then
good = .false.
return
endif
j = scan(name(i:), " ")
if (j==0) then
j = len(name)
else
j = i + j - 2
endif
do
good = checkNCName(name(i:j), xv)
if (.not.good) return
i = j + 1
j = verify(name(i:), " ")
if (j==0) exit
i = i + j - 1
j = scan(name(i:), " ")
if (j==0) then
j = len(name)
else
j = i + j - 2
endif
enddo
end function checkNCNames
pure function checkNmtoken(name, xv) result(good)
character(len=*), intent(in) :: name
integer, intent(in) :: xv
logical :: good
! Validates a string against the XML requirements for an NCNAME
! Is not fully compliant; ignores UTF issues.
good = isNameChar(name, xv)
end function checkNmtoken
pure function checkNmtokens(name, xv) result(good)
character(len=*), intent(in) :: name
integer, intent(in) :: xv
logical :: good
! Validates a string against the XML requirements for an NCNAME
! Is not fully compliant; ignores UTF issues.
integer :: i, j
good = (len(name) > 0)
if (.not.good) return
i = verify(name, " ")
if (i==0) then
good = .false.
return
endif
j = scan(name(i:), " ")
if (j==0) then
j = len(name)
else
j = i + j - 2
endif
do
good = isNameChar(name(i:j), xv)
if (.not.good) return
i = j + 1
j = verify(name(i:), " ")
if (j==0) exit
i = i + j - 1
j = scan(name(i:), " ")
if (j==0) then
j = len(name)
else
j = i + j - 2
endif
enddo
end function checkNmtokens
function checkPublicId(value) result(good)
character(len=*), intent(in) :: value
logical :: good
character(len=*), parameter :: PubIdChars = &
" "//achar(10)//achar(13)//lowerCase//upperCase//digits//"-'()+,./:=?;!*#@$_%"
good = (verify(value, PubIdChars)==0)
end function checkPublicId
function checkPEDef(value, xv) result(p)
character(len=*), intent(in) :: value
integer, intent(in) :: xv
logical :: p
integer :: i1, i2
p = .false.
if (scan(value, '%&')==0) then
p = .true.
elseif (scan(value, '"')==0) then
i1 = scan(value, '%&')
i2 = 0
do while (i1>0)
i1 = i2 + i1
i2 = index(value(i1+1:),';')
if (i2==0) return
i2 = i1 + i2
if (value(i1:i1)=='&') then
if (.not.checkName(value(i1+1:i2-1), xv) .and. &
.not.checkCharacterEntityReference(value(i1+1:i2-1), xv)) return
else
if (.not.checkName(value(i1+1:i2-1), xv)) &
return
endif
i1 = scan(value(i2+1:), '%&')
enddo
p = .true.
endif
end function checkPEDef
function checkPseudoAttValue(value, xv) result(p)
character(len=*), intent(in) :: value
integer, intent(in) :: xv
logical :: p
integer :: i1, i2
!fixme can we have entrefs in PIs?
p = .false.
if (scan(value, '"<&')==0) then
p = .true.
elseif (index(value, '&') > 0) then
i1 = index(value, '&')
i2 = 0
do while (i1 > 0)
i1 = i2 + i1
i2 = index(value(i1+1:),';')
if (i2==0) return
i2 = i1 + i2
if (value(i1+1:i2-1) /= 'amp' .and. &
value(i1+1:i2-1) /= 'lt' .and. &
value(i1+1:i2-1) /= 'gt' .and. &
value(i1+1:i2-1) /= 'quot' .and. &
value(i1+1:i2-1) /= 'apos' .and. &
.not.checkCharacterEntityReference(value(i1+1:i2-1), xv)) &
return
i1 = index(value(i2+1:), '&')
enddo
p = .true.
endif
end function checkPseudoAttValue
function checkAttValue(value, xv) result(p)
character(len=*), intent(in) :: value
integer, intent(in) :: xv
logical :: p
! This function is called basically to make sure
! that any attribute value looks like one. It will
! not flag up out-of-range character entities, and
! is a very weak check. Only used from xml_AddAttribute
! when escaping is off.
integer :: i1, i2
p = .false.
if (scan(value, '"<&'//"'")==0) then
p = .true.
elseif (index(value, '&') > 0) then
i1 = index(value, '&')
i2 = 0
do while (i1 > 0)
i1 = i1 + i2 + 1
i2 = scan(value(i1+1:),';')
if (i2 == 0) return
i2 = i1 + i2
if (.not.checkName(value(i1+1:i2-1), xv) .and. &
.not.likeCharacterEntityReference(value(i1+1:i2-1))) then
print*, value(i1+1:i2-1), " ", &
likeCharacterEntityReference(value(i1+1:i2-1))
return
endif
i1 = index(value(i2+1:), '&')
enddo
p = .true.
endif
end function checkAttValue
function likeCharacterEntityReference(code) result(good)
character(len=*), intent(in) :: code
logical :: good
good = .false.
if (len(code) > 0) then
if (code(1:1) == "#") then
if (code(2:2) == "x") then
if (len(code) > 2) then
good = (verify(code(3:), hexdigits) == 0)
endif
else
good = (verify(code(2:), digits) == 0)
endif
endif
endif
end function likeCharacterEntityReference
function checkCharacterEntityReference(code, xv) result(good)
character(len=*), intent(in) :: code
integer, intent(in) :: xv
logical :: good
integer :: i
good = .false.
if (len(code) > 0) then
if (code(1:1) == "#") then
if (code(2:2) == "x") then
if (len(code) > 2) then
good = (verify(code(3:), hexdigits) == 0)
if (good) then
i = str_to_int_16(code(3:))
endif
endif
else
good = (verify(code(2:), digits) == 0)
if (good) then
i = str_to_int_10(code(2:))
endif
endif
endif
endif
if (good) good = isLegalCharRef(i, xv)
end function checkCharacterEntityReference
function checkRepCharEntityReference(code, xv) result(good)
character(len=*), intent(in) :: code
integer, intent(in) :: xv
logical :: good
! Is this a reference to a character we can actually represent
! in memory? ie without unicode, US-ASCII only.
integer :: i
good = .false.
if (len(code) > 0) then
if (code(1:1) == "#") then
if (code(2:2) == "x") then
if (len(code) > 2) then
good = (verify(code(3:), hexdigits) == 0)
if (good) then
i = str_to_int_16(code(3:))
endif
endif
else
good = (verify(code(2:), digits) == 0)
if (good) then
i = str_to_int_10(code(2:))
endif
endif
endif
endif
if (good) good = isRepCharRef(i, xv)
end function checkRepCharEntityReference
pure function prefixOfQName(qname) result(prefix)
character(len=*), intent(in) :: qname
character(len=max(index(qname, ':')-1,0)) :: prefix
prefix = qname ! automatic truncation
end function prefixOfQName
pure function localpartOfQname(qname) result(localpart)
character(len=*), intent(in) :: qname
character(len=max(len(qname)-index(qname,':'),0)) ::localpart
localpart = qname(index(qname,':')+1:)
end function localpartOfQname
#endif
end module m_common_namecheck

View file

@ -1,830 +0,0 @@
module m_common_namespaces
#ifndef DUMMYLIB
use fox_m_fsys_array_str, only: str_vs, vs_str, vs_str_alloc
use fox_m_utils_uri, only: URI, parseURI, destroyURI, hasScheme
use m_common_attrs, only: dictionary_t, get_key, get_value, remove_key, getLength, hasKey
use m_common_attrs, only: set_nsURI, set_localName, get_prefix, add_item_to_dict
use m_common_charset, only: XML1_0, XML1_1
use m_common_error, only: FoX_error, FoX_warning, error_stack, add_error, in_error
use m_common_namecheck, only: checkNCName
use m_common_struct, only: xml_doc_state
implicit none
private
character(len=*), parameter :: invalidNS = '::INVALID::'
! an invalid URI name to indicate a namespace error.
type URIMapping
character, dimension(:), pointer :: URI
integer :: ix ! link back to node depth
end type URIMapping
!This is a single URI, and the node depth under which
!its namespace applies.
type prefixMapping
character, dimension(:), pointer :: prefix
type(URIMapping), dimension(:), pointer :: urilist
end type prefixMapping
!This is the mapping for a single prefix; with the
!list of namespaces which are in force at various
!depths
type namespaceDictionary
private
type(URIMapping), dimension(:), pointer :: defaults
type(prefixMapping), dimension(:), pointer :: prefixes
end type namespaceDictionary
!This is the full namespace dictionary; defaults is
!the list of default namespaces in force; prefix a
!list of all prefixes in force.
public :: invalidNS
public :: initNamespaceDictionary
public :: destroyNamespaceDictionary
public :: namespaceDictionary
public :: checkNamespaces
public :: checkNamespacesWriting
public :: checkEndNamespaces
public :: getnamespaceURI
interface getnamespaceURI
module procedure getURIofDefaultNS, getURIofPrefixedNS
end interface
public :: isPrefixInForce
public :: isDefaultNSInForce
public :: getNumberOfPrefixes
public :: getPrefixByIndex
public :: dumpnsdict !FIXME
public :: addDefaultNS
public :: removeDefaultNS
public :: addPrefixedNS
public :: removePrefixedNS
contains
subroutine initNamespaceDictionary(nsDict)
type(namespaceDictionary), intent(inout) :: nsDict
!We need to properly initialize 0th elements
!(which are never used) in order to provide
!sensible behaviour when trying to manipulate
!an empty dictionary.
allocate(nsDict%defaults(0:0))
allocate(nsDict%defaults(0)%URI(0))
!The 0th element of the defaults NS is the empty namespace
nsDict%defaults(0)%ix = -1
allocate(nsDict%prefixes(0:0))
allocate(nsDict%prefixes(0)%prefix(0))
allocate(nsDict%prefixes(0)%urilist(0:0))
allocate(nsDict%prefixes(0)%urilist(0)%URI(len(invalidNS)))
nsDict%prefixes(0)%urilist(0)%URI = vs_str(invalidNS)
nsDict%prefixes(0)%urilist(0)%ix = -1
end subroutine initNamespaceDictionary
subroutine destroyNamespaceDictionary(nsDict)
type(namespaceDictionary), intent(inout) :: nsDict
integer :: i, j
do i = 0, ubound(nsDict%defaults,1)
deallocate(nsDict%defaults(i)%URI)
enddo
deallocate(nsDict%defaults)
do i = 0, ubound(nsDict%prefixes,1)
do j = 0, ubound(nsDict%prefixes(i)%urilist,1)
deallocate(nsDict%prefixes(i)%urilist(j)%URI)
enddo
deallocate(nsDict%prefixes(i)%prefix)
deallocate(nsDict%prefixes(i)%urilist)
enddo
deallocate(nsDict%prefixes)
end subroutine destroyNamespaceDictionary
subroutine copyURIMapping(urilist1, urilist2, l_m)
type(URIMapping), dimension(0:), intent(inout) :: urilist1
type(URIMapping), dimension(0:), intent(inout) :: urilist2
integer, intent(in):: l_m
integer :: i
if (ubound(urilist1,1) < l_m .or. ubound(urilist2,1) < l_m) then
call FoX_error('Internal error in m_sax_namespaces:copyURIMapping')
endif
! Now copy all defaults across (or rather - add pointers to them)
do i = 0, l_m
urilist2(i)%ix = urilist1(i)%ix
urilist2(i)%URI => urilist1(i)%URI
enddo
end subroutine copyURIMapping
subroutine addDefaultNS(nsDict, uri, ix, es)
type(namespaceDictionary), intent(inout) :: nsDict
character(len=*), intent(in) :: uri
integer, intent(in) :: ix
type(error_stack), intent(inout), optional :: es
type(URIMapping), dimension(:), allocatable :: tempMap
integer :: l_m, l_s
if (uri=="http://www.w3.org/XML/1998/namespace") then
if (present(es)) then
call add_error(es, "Attempt to assign incorrect URI to prefix 'xml'")
else
call FoX_error("Attempt to assign incorrect URI to prefix 'xml'")
endif
elseif (uri=="http://www.w3.org/2000/xmlns/") then
if (present(es)) then
call add_error(es, "Attempt to assign prefix to xmlns namespace")
else
call FoX_error("Attempt to assign prefix to xmlns namespace")
endif
endif
! FIXME check URI is valid ...
l_m = ubound(nsDict%defaults,1)
allocate(tempMap(0:l_m))
! Now copy all defaults across ...
call copyURIMapping(nsDict%defaults, tempMap, l_m)
deallocate(nsDict%defaults)
l_m = l_m + 1
allocate(nsDict%defaults(0:l_m))
!Now copy everything back ...
call copyURIMapping(tempMap, nsDict%defaults, l_m-1)
deallocate(tempMap)
! And finally, add the new default NS
nsDict%defaults(l_m)%ix = ix
l_s = len(uri)
allocate(nsDict%defaults(l_m)%URI(l_s))
nsDict%defaults(l_m)%URI = vs_str(uri)
end subroutine addDefaultNS
subroutine addPrefixedURI(nsPrefix, uri, ix)
type(PrefixMapping), intent(inout) :: nsPrefix
character, dimension(:), intent(in) :: uri
integer, intent(in) :: ix
type(URIMapping), dimension(:), allocatable :: tempMap
integer :: l_m, l_s
l_m = ubound(nsPrefix%urilist,1)
allocate(tempMap(0:l_m))
! Now copy all across ...
call copyURIMapping(nsPrefix%urilist, tempMap, l_m)
deallocate(nsPrefix%urilist)
l_m = l_m + 1
allocate(nsPrefix%urilist(0:l_m))
!Now copy everything back ...
call copyURIMapping(tempMap, nsPrefix%urilist, l_m-1)
deallocate(tempMap)
! And finally, add the new default NS
nsPrefix%urilist(l_m)%ix = ix
l_s = size(uri)
allocate(nsPrefix%urilist(l_m)%URI(l_s))
nsPrefix%urilist(l_m)%URI = uri
end subroutine addPrefixedURI
subroutine removeDefaultNS(nsDict)
type(namespaceDictionary), intent(inout) :: nsDict
type(URIMapping), dimension(:), allocatable :: tempMap
integer :: l_m
l_m = ubound(nsDict%defaults,1)
allocate(tempMap(0:l_m-1))
! Now copy all defaults across ...
call copyURIMapping(nsDict%defaults, tempMap, l_m-1)
!And remove tail-end charlie
deallocate(nsDict%defaults(l_m)%URI)
deallocate(nsDict%defaults)
l_m = l_m - 1
allocate(nsDict%defaults(0:l_m))
!Now copy everything back ...
call copyURIMapping(tempMap, nsDict%defaults, l_m)
deallocate(tempMap)
end subroutine removeDefaultNS
subroutine removePrefixedURI(nsPrefix)
type(PrefixMapping), intent(inout) :: nsPrefix
type(URIMapping), dimension(:), allocatable :: tempMap
integer :: l_m
l_m = ubound(nsPrefix%urilist,1)
allocate(tempMap(0:l_m-1))
! Now copy all defaults across ...
call copyURIMapping(nsPrefix%urilist, tempMap, l_m-1)
!And remove tail-end charlie
deallocate(nsPrefix%urilist(l_m)%URI)
deallocate(nsPrefix%urilist)
l_m = l_m - 1
allocate(nsPrefix%urilist(0:l_m))
!Now copy everything back ...
call copyURIMapping(tempMap, nsPrefix%urilist, l_m)
deallocate(tempMap)
end subroutine removePrefixedURI
subroutine addPrefixedNS(nsDict, prefix, URI, ix, xds, xml, es)
type(namespaceDictionary), intent(inout) :: nsDict
character(len=*), intent(in) :: prefix
character(len=*), intent(in) :: uri
integer, intent(in) :: ix
type(xml_doc_state), intent(in) :: xds
logical, intent(in), optional :: xml
type(error_stack), intent(inout), optional :: es
integer :: l_p, p_i, i
logical :: xml_
if (present(xml)) then
xml_ = xml
else
xml_ = .false.
endif
if (prefix=='xml' .and. &
URI/='http://www.w3.org/XML/1998/namespace') then
if (present(es)) then
call add_error(es, "Attempt to assign incorrect URI to prefix 'xml'")
else
call FoX_error("Attempt to assign incorrect URI to prefix 'xml'")
endif
elseif (prefix/='xml' .and. &
URI=='http://www.w3.org/XML/1998/namespace') then
if (present(es)) then
call add_error(es, "Attempt to assign incorrect prefix to XML namespace")
else
call FoX_error("Attempt to assign incorrect prefix to XML namespace")
endif
elseif (prefix == 'xmlns') then
if (present(es)) then
call add_error(es, "Attempt to declare 'xmlns' prefix")
else
call FoX_error("Attempt to declare 'xmlns' prefix")
endif
elseif (URI=="http://www.w3.org/2000/xmlns/") then
if (present(es)) then
call add_error(es, "Attempt to assign prefix to xmlns namespace")
else
call FoX_error("Attempt to assign prefix to xmlns namespace")
endif
elseif (len(prefix) > 2) then
if ((verify(prefix(1:1), 'xX') == 0) &
.and. (verify(prefix(2:2), 'mM') == 0) &
.and. (verify(prefix(3:3), 'lL') == 0)) then
if (.not.xml_) then
! FIXME need working warning infrastructure
!if (present(es)) then
! call add_error(es, "Attempt to declare reserved prefix: "//prefix)
!else
call FoX_warning("Attempt to declare reserved prefix: "//prefix)
!endif
endif
endif
endif
if (.not.checkNCName(prefix, xds%xml_version)) &
call FoX_error("Attempt to declare invalid prefix: "//prefix)
! FIXME check URI is valid
l_p = ubound(nsDict%prefixes, 1)
p_i = 0
do i = 1, l_p
if (str_vs(nsDict%prefixes(i)%prefix) == prefix) then
p_i = i
exit
endif
enddo
if (p_i == 0) then
call addPrefix(nsDict, vs_str(prefix))
p_i = l_p + 1
endif
call addPrefixedURI(nsDict%prefixes(p_i), vs_str(URI), ix)
end subroutine addPrefixedNS
subroutine removePrefixedNS(nsDict, prefix)
type(namespaceDictionary), intent(inout) :: nsDict
character, dimension(:), intent(in) :: prefix
integer :: l_p, p_i, i
l_p = ubound(nsDict%prefixes, 1)
p_i = 0
do i = 1, l_p
if (str_vs(nsDict%prefixes(i)%prefix) == str_vs(prefix)) then
p_i = i
exit
endif
enddo
if (p_i /= 0) then
call removePrefixedURI(nsDict%prefixes(p_i))
if (ubound(nsDict%prefixes(p_i)%urilist,1) == 0) then
!that was the last mapping for that prefix
call removePrefix(nsDict, p_i)
endif
else
call FoX_error('Internal error in m_sax_namespaces:removePrefixedNS')
endif
end subroutine removePrefixedNS
subroutine addPrefix(nsDict, prefix)
type(namespaceDictionary), intent(inout) :: nsDict
character, dimension(:), intent(in) :: prefix
integer :: l_p
type(prefixMapping), dimension(:), pointer :: tempPrefixMap
integer :: i
!Add a new prefix to the namespace dictionary.
!Unfortunately this involves copying the entire
!prefixes dictionary to a temporary structure, then
!reallocating the prefixes dictionary to be one
!longer, then copying everything back:
l_p = ubound(nsDict%prefixes, 1)
allocate(tempPrefixMap(0:l_p))
!for each current prefix, append everything to temporary structure
do i = 0, l_p
tempPrefixMap(i)%prefix => nsDict%prefixes(i)%prefix
tempPrefixMap(i)%urilist => nsDict%prefixes(i)%urilist
enddo
deallocate(nsDict%prefixes)
!extend prefix dictionary by one ...
l_p = l_p + 1
allocate(nsDict%prefixes(0:l_p))
!and copy back ...
do i = 0, l_p-1
nsDict%prefixes(i)%prefix => tempPrefixMap(i)%prefix
nsDict%prefixes(i)%urilist => tempPrefixMap(i)%urilist
enddo
deallocate(tempPrefixMap)
allocate(nsDict%prefixes(l_p)%prefix(size(prefix)))
nsDict%prefixes(l_p)%prefix = prefix
allocate(nsDict%prefixes(l_p)%urilist(0:0))
allocate(nsDict%prefixes(l_p)%urilist(0)%URI(len(invalidNS)))
nsDict%prefixes(l_p)%urilist(0)%URI = vs_str(invalidNS)
nsDict%prefixes(l_p)%urilist(0)%ix = -1
end subroutine addPrefix
subroutine removePrefix(nsDict, i_p)
type(namespaceDictionary), intent(inout) :: nsDict
integer, intent(in) :: i_p
integer :: l_p
type(prefixMapping), dimension(:), pointer :: tempPrefixMap
integer :: i
!Remove a prefix from the namespace dictionary.
!Unfortunately this involves copying the entire
!prefixes dictionary to a temporary structure, then
!reallocating the prefixes dictionary to be one
!shorter, then copying everything back:
l_p = ubound(nsDict%prefixes, 1)
allocate(tempPrefixMap(0:l_p-1))
!for each current prefix, append everything to temporary structure
do i = 0, i_p-1
tempPrefixMap(i)%prefix => nsDict%prefixes(i)%prefix
tempPrefixMap(i)%urilist => nsDict%prefixes(i)%urilist
enddo
deallocate(nsDict%prefixes(i_p)%urilist(0)%URI)
deallocate(nsDict%prefixes(i_p)%urilist)
deallocate(nsDict%prefixes(i_p)%prefix)
!this subroutine will only get called if the urilist is already
!empty, so no need to deallocate it.
do i = i_p+1, l_p
tempPrefixMap(i-1)%prefix => nsDict%prefixes(i)%prefix
tempPrefixMap(i-1)%urilist => nsDict%prefixes(i)%urilist
enddo
deallocate(nsDict%prefixes)
!shorten prefix dictionary by one ...
l_p = l_p - 1
allocate(nsDict%prefixes(0:l_p))
!and copy back ...
do i = 0, l_p
nsDict%prefixes(i)%prefix => tempPrefixMap(i)%prefix
nsDict%prefixes(i)%urilist => tempPrefixMap(i)%urilist
enddo
deallocate(tempPrefixMap)
end subroutine removePrefix
subroutine checkNamespaces(atts, nsDict, ix, xds, namespace_prefixes, xmlns_uris, es, &
partial, start_prefix_handler, end_prefix_handler)
type(dictionary_t), intent(inout) :: atts
type(namespaceDictionary), intent(inout) :: nsDict
integer, intent(in) :: ix ! depth of nesting of current element.
type(xml_doc_state), intent(in) :: xds
logical, intent(in) :: namespace_prefixes, xmlns_uris
type(error_stack), intent(inout) :: es
logical, intent(in) :: partial ! if so, don't try and resolve anything except xml & xmlns
optional :: start_prefix_handler, end_prefix_handler
interface
subroutine start_prefix_handler(namespaceURI, prefix)
character(len=*), intent(in) :: namespaceURI
character(len=*), intent(in) :: prefix
end subroutine start_prefix_handler
subroutine end_prefix_handler(prefix)
character(len=*), intent(in) :: prefix
end subroutine end_prefix_handler
end interface
character(len=6) :: xmlns
character, dimension(:), pointer :: QName, URIstring
integer :: i, n
type(URI), pointer :: URIref
!Check for namespaces; *and* remove xmlns references from
!the attributes dictionary.
! we can't do a simple loop across the attributes,
! because we need to remove some as we go along ...
i = 1
do while (i <= getLength(atts))
xmlns = get_key(atts, i)
if (xmlns == 'xmlns ') then
!Default namespace is being set
URIstring => vs_str_alloc(get_value(atts, i))
if (str_vs(URIstring)=="") then
! Empty nsURI on default namespace has same effect in 1.0 and 1.1
if (present(end_prefix_handler)) &
call end_prefix_handler("")
call addDefaultNS(nsDict, invalidNS, ix)
deallocate(URIstring)
else
URIref => parseURI(str_vs(URIstring))
if (.not.associated(URIref)) then
call add_error(es, "Invalid URI: "//str_vs(URIstring))
deallocate(URIstring)
return
elseif (.not.hasScheme(URIref)) then
call add_error(es, "Relative namespace in URI deprecated: "//str_vs(URIstring))
deallocate(URIstring)
call destroyURI(URIref)
return
endif
call destroyURI(URIref)
if (present(start_prefix_handler)) &
call start_prefix_handler(str_vs(URIstring), "")
call addDefaultNS(nsDict, str_vs(URIstring), ix)
deallocate(URIstring)
endif
if (namespace_prefixes) then
i = i + 1
else
call remove_key(atts, i)
endif
elseif (xmlns == 'xmlns:') then
!Prefixed namespace is being set
QName => vs_str_alloc(get_key(atts, i))
URIstring => vs_str_alloc(get_value(atts, i))
if (str_vs(URIstring)=="") then
if (xds%xml_version==XML1_0) then
call add_error(es, "Empty nsURI is invalid in XML 1.0")
deallocate(URIstring)
deallocate(QName)
return
elseif (xds%xml_version==XML1_1) then
call addPrefixedNS(nsDict, str_vs(QName(7:)), invalidNS, ix, xds, es=es)
if (in_error(es)) then
deallocate(URIstring)
deallocate(QName)
return
elseif (present(end_prefix_handler)) then
call end_prefix_handler(str_vs(QName(7:)))
endif
deallocate(URIstring)
deallocate(QName)
endif
else
URIref => parseURI(str_vs(URIstring))
if (.not.associated(URIref)) then
call add_error(es, "Invalid URI: "//str_vs(URIstring))
deallocate(URIstring)
deallocate(QName)
return
elseif (.not.hasScheme(URIref)) then
call add_error(es, "Relative namespace in URI deprecated: "//str_vs(URIstring))
deallocate(URIstring)
deallocate(QName)
call destroyURI(URIref)
return
endif
call destroyURI(URIref)
call addPrefixedNS(nsDict, str_vs(QName(7:)), str_vs(URIstring), ix, xds, es=es)
if (in_error(es)) then
deallocate(URIstring)
deallocate(QName)
return
elseif (present(start_prefix_handler)) then
call start_prefix_handler(str_vs(URIstring), str_vs(QName(7:)))
endif
deallocate(URIstring)
deallocate(QName)
endif
if (namespace_prefixes) then
i = i + 1
else
call remove_key(atts, i)
endif
else
! we only increment if we haven't removed a key
i = i + 1
endif
enddo
! having done that, now resolve all attribute namespaces:
do i = 1, getLength(atts)
QName => vs_str_alloc(get_key(atts,i))
n = index(str_vs(QName), ":")
if (n > 0) then
if (str_vs(QName(1:n-1))=="xmlns") then
! FIXME but this can be controlled by SAX configuration xmlns-uris
if (xmlns_uris) then
call set_nsURI(atts, i, "http://www.w3.org/2000/xmlns/")
else
call set_nsURI(atts, i, "")
endif
else
if (str_vs(QName(1:n-1))=="xml") then
call set_nsURI(atts, i, "http://www.w3.org/XML/1998/namespace")
elseif (getnamespaceURI(nsDict, str_vs(QName(1:n-1)))==invalidNS) then
! Sometimes we don't want to worry about unbound prefixes,
! eg if we are in the middle of parsing an entity.
if (.not.partial) then
call add_error(es, "Unbound namespace prefix")
deallocate(QName)
return
else
call set_nsURI(atts, i, "")
endif
else
call set_nsURI(atts, i, getnamespaceURI(nsDict, str_vs(QName(1:n-1))))
endif
endif
else
if (xmlns_uris.and.str_vs(QName)=="xmlns") then
call set_nsURI(atts, i, "http://www.w3.org/2000/xmlns/")
else
call set_nsURI(atts, i, "") ! no such thing as a default namespace on attributes
endif
endif
! Check for duplicates
if (hasKey(atts, getnamespaceURI(nsDict, str_vs(QName(1:n-1))), str_vs(QName(n+1:)))) then
call add_error(es, "Duplicate attribute names after namespace processing")
deallocate(QName)
return
endif
call set_localName(atts, i, QName(n+1:))
deallocate(QName)
enddo
end subroutine checkNamespaces
subroutine checkNamespacesWriting(atts, nsdict, ix)
type(dictionary_t), intent(inout) :: atts
type(namespaceDictionary), intent(inout) :: nsDict
integer, intent(in) :: ix
! Read through a list of attributes, check with currently
! active namespaces & add any necessary declarations
integer :: i, i_p, l_d, l_ps, n
n = getLength(atts) ! we need the length before we fiddle with it
!Does the default NS need added?
l_d = ubound(nsDict%defaults,1)
if (nsDict%defaults(l_d)%ix == ix) then
!It's not been registered yet:
call add_item_to_dict(atts, "xmlns", &
str_vs(nsDict%defaults(l_d)%URI), type="CDATA")
endif
!next, add any overdue prefixed NS's in the same way:
! there should only ever be one. More would be an error,
! but the check should have been done earlier.
do i_p = 0, ubound(nsDict%prefixes, 1)
l_ps = ubound(nsDict%prefixes(i_p)%urilist,1)
if (nsDict%prefixes(i_p)%urilist(l_ps)%ix == ix) then
call add_item_to_dict(atts, &
"xmlns:"//str_vs(nsDict%prefixes(i_p)%prefix), &
str_vs(nsDict%prefixes(i_p)%urilist(l_ps)%URI), &
type="CDATA")
endif
enddo
!Finally, we may have some we've added for attribute QNames
! have to get those too:
do i = 1, getLength(atts)
! get prefix, and identify the relevant NS mapping
i_p = getPrefixIndex(nsDict, get_prefix(atts, i))
l_ps = ubound(nsDict%prefixes(i_p)%urilist,1)
!If the index is greater than what it should be:
if (nsDict%prefixes(i_p)%urilist(l_ps)%ix > ix) then
!we only just added this, so we need to declare it
call add_item_to_dict(atts, "xmlns:"//get_prefix(atts, i), &
str_vs(nsDict%prefixes(i_p)%urilist(l_ps)%URI), &
type="CDATA")
!Reset the index to the right value:
nsDict%prefixes(i_p)%urilist(l_ps)%ix = ix
endif
enddo
end subroutine checkNamespacesWriting
subroutine checkEndNamespaces(nsDict, ix, end_prefix_handler)
type(namespaceDictionary), intent(inout) :: nsDict
integer, intent(in) :: ix
optional :: end_prefix_handler
interface
subroutine end_prefix_handler(prefix)
character(len=*), intent(in) :: prefix
end subroutine end_prefix_handler
end interface
integer :: l_d, l_p, l_ps, i
character, pointer :: prefix(:)
!It will only ever be the final elements in the list which
! might have expired.
l_d = ubound(nsDict%defaults,1)
do while (nsDict%defaults(l_d)%ix == ix)
if (present(end_prefix_handler)) &
call end_prefix_handler("")
call removeDefaultNS(nsDict)
l_d = ubound(nsDict%defaults,1)
enddo
l_p = ubound(nsDict%prefixes, 1)
i = 1
do while (i <= l_p)
l_ps = ubound(nsDict%prefixes(l_p)%urilist,1)
if (nsDict%prefixes(i)%urilist(l_ps)%ix == ix) then
if (present(end_prefix_handler)) &
call end_prefix_handler(str_vs(nsDict%prefixes(i)%prefix))
! We have to assign this pointer explicitly, otherwise the next call
! aliases its arguments illegally.
prefix => nsDict%prefixes(i)%prefix
call removePrefixedNS(nsDict, prefix)
if (l_p > ubound(nsDict%prefixes, 1)) then
! we just removed the last reference to that prefix,
! so our list of prefixes has shrunk - update the running total.
! and go to the next prefix, which is at the same index
l_p = l_p - 1
cycle
endif
endif
i = i + 1
enddo
end subroutine checkEndNamespaces
subroutine dumpnsdict(nsdict)
type(namespaceDictionary), intent(in) :: nsdict
integer :: i, j
write(*,'(a)')'* default namespaces *'
do i = 1, ubound(nsdict%defaults, 1)
write(*,'(i0,a)') nsdict%defaults(i)%ix, str_vs(nsdict%defaults(i)%URI)
enddo
write(*,'(a)') '* Prefixed namespaces *'
do i = 1, ubound(nsdict%prefixes, 1)
write(*,'(2a)') '* prefix: ', str_vs(nsdict%prefixes(i)%prefix)
do j = 1, ubound(nsdict%prefixes(i)%urilist, 1)
write(*,'(i0,a)') nsdict%prefixes(i)%urilist(j)%ix, str_vs(nsdict%prefixes(i)%urilist(j)%URI)
enddo
enddo
end subroutine dumpnsdict
pure function getURIofDefaultNS(nsDict) result(uri)
type(namespaceDictionary), intent(in) :: nsDict
character(len=size(nsDict%defaults(ubound(nsDict%defaults,1))%URI)) :: URI
integer :: l_d
l_d = ubound(nsDict%defaults,1)
uri = str_vs(nsDict%defaults(l_d)%URI)
end function getURIofDefaultNS
pure function isPrefixInForce(nsDict, prefix) result(force)
type(namespaceDictionary), intent(in) :: nsDict
character(len=*), intent(in) :: prefix
logical :: force
integer :: i, l_s
force = .false.
do i = 1, ubound(nsDict%prefixes, 1)
if (str_vs(nsDict%prefixes(i)%prefix) == prefix) then
l_s = ubound(nsDict%prefixes(i)%urilist, 1)
force = (size(nsdict%prefixes(i)%urilist(l_s)%URI) > 0)
exit
endif
enddo
end function isPrefixInForce
pure function isDefaultNSInForce(nsDict) result(force)
type(namespaceDictionary), intent(in) :: nsDict
logical :: force
integer :: l_s
force = .false.
l_s = ubound(nsDict%defaults, 1)
if (l_s > 0) &
force = (size(nsdict%defaults(l_s)%URI) > 0)
end function isDefaultNSInForce
pure function getPrefixIndex(nsDict, prefix) result(p)
type(namespaceDictionary), intent(in) :: nsDict
character(len=*), intent(in) :: prefix
integer :: p
integer :: i
p = 0
do i = 1, ubound(nsDict%prefixes, 1)
if (str_vs(nsDict%prefixes(i)%prefix) == prefix) then
p = i
exit
endif
enddo
end function getPrefixIndex
function getNumberOfPrefixes(nsDict) result(n)
type(namespaceDictionary), intent(in) :: nsDict
integer :: n
n = ubound(nsDict%prefixes, 1)
end function getNumberOfPrefixes
function getPrefixByIndex(nsDict, i) result(c)
type(namespaceDictionary), intent(in) :: nsDict
integer, intent(in) :: i
character(len=size(nsDict%prefixes(i)%prefix)) :: c
c = str_vs(nsDict%prefixes(i)%prefix)
end function getPrefixByIndex
pure function getURIofPrefixedNS(nsDict, prefix) result(uri)
type(namespaceDictionary), intent(in) :: nsDict
character(len=*), intent(in) :: prefix
character(len=size( &
nsDict%prefixes( &
getPrefixIndex(nsDict,prefix) &
) &
%urilist( &
ubound(nsDict%prefixes(getPrefixIndex(nsDict,prefix))%urilist, 1) &
) &
%uri)) :: URI
integer :: p_i, l_m
p_i = getPrefixIndex(nsDict, prefix)
l_m = ubound(nsDict%prefixes(p_i)%urilist, 1)
uri = str_vs(nsDict%prefixes(p_i)%urilist(l_m)%URI)
end function getURIofPrefixedNS
#endif
end module m_common_namespaces

View file

@ -1,120 +0,0 @@
module m_common_notations
#ifndef DUMMYLIB
use fox_m_fsys_array_str, only: vs_str, str_vs
use m_common_error, only: FoX_error
implicit none
private
type notation
character(len=1), dimension(:), pointer :: name
character(len=1), dimension(:), pointer :: systemID
character(len=1), dimension(:), pointer :: publicId
end type notation
type notation_list
type(notation), dimension(:), pointer :: list
end type notation_list
public :: notation
public :: notation_list
public :: init_notation_list
public :: destroy_notation_list
public :: add_notation
public :: notation_exists
contains
subroutine init_notation_list(nlist)
! It is not clear how we should specify the
! intent of this argument - different
! compilers seem to have different semantics
type(notation_list), intent(inout) :: nlist
allocate(nlist%list(0:0))
allocate(nlist%list(0)%name(0))
allocate(nlist%list(0)%systemId(0))
allocate(nlist%list(0)%publicId(0))
end subroutine init_notation_list
subroutine destroy_notation_list(nlist)
type(notation_list), intent(inout) :: nlist
integer :: i
do i = 0, ubound(nlist%list, 1)
deallocate(nlist%list(i)%name)
deallocate(nlist%list(i)%systemId)
deallocate(nlist%list(i)%publicId)
enddo
deallocate(nlist%list)
end subroutine destroy_notation_list
subroutine add_notation(nlist, name, systemId, publicId)
type(notation_list), intent(inout) :: nlist
character(len=*), intent(in) :: name
character(len=*), intent(in), optional :: systemId
character(len=*), intent(in), optional :: publicId
integer :: i
type(notation), dimension(:), pointer :: temp
! pointer not allocatable to avoid bug on Lahey
if (.not.present(systemId) .and. .not.present(publicId)) &
call FoX_error("Neither System nor Public Id specified for notation: "//name)
allocate(temp(0:ubound(nlist%list,1)))
do i = 0, ubound(nlist%list, 1)
temp(i)%name => nlist%list(i)%name
temp(i)%systemId => nlist%list(i)%systemId
temp(i)%publicId => nlist%list(i)%publicId
enddo
deallocate(nlist%list)
allocate(nlist%list(0:ubound(temp, 1)+1))
do i = 0, ubound(temp, 1)
nlist%list(i)%name => temp(i)%name
nlist%list(i)%systemId => temp(i)%systemId
nlist%list(i)%publicId => temp(i)%publicId
enddo
deallocate(temp)
allocate(nlist%list(i)%name(len(name)))
nlist%list(i)%name = vs_str(name)
if (present(systemId)) then
allocate(nlist%list(i)%systemId(len(systemId)))
nlist%list(i)%systemId = vs_str(systemId)
else
allocate(nlist%list(i)%systemId(0))
endif
if (present(publicId)) then
allocate(nlist%list(i)%publicId(len(publicId)))
nlist%list(i)%publicId = vs_str(publicId)
else
allocate(nlist%list(i)%publicId(0))
endif
end subroutine add_notation
function notation_exists(nlist, name) result(p)
type(notation_list), intent(in) :: nlist
character(len=*), intent(in) :: name
logical :: p
integer :: i
p = .false.
do i = 1, ubound(nlist%list, 1)
if (str_vs(nlist%list(i)%name) == name) then
p = .true.
exit
endif
enddo
end function notation_exists
#endif
end module m_common_notations

Some files were not shown because too many files have changed in this diff Show more