mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-27 13:45:36 -04:00
Merge branch 'develop' into diff_tally6
This commit is contained in:
commit
bbcc4f6453
367 changed files with 44247 additions and 39004 deletions
7
.gitignore
vendored
7
.gitignore
vendored
|
|
@ -60,8 +60,15 @@ src/install_manifest.txt
|
|||
|
||||
# Nuclear data
|
||||
data/nndc
|
||||
data/nndc_hdf5
|
||||
data/wmp
|
||||
data/multipole_lib.tar.gz
|
||||
data/ENDF-B-VII.1-*.tar.gz
|
||||
data/JEFF32-ACE-*.tar.gz
|
||||
data/JEFF32-ACE-*.zip
|
||||
data/TSLs.tar.gz
|
||||
data/jeff-3.2
|
||||
data/jeff-3.2-hdf5
|
||||
|
||||
# Images
|
||||
*.ppm
|
||||
|
|
|
|||
10
.travis.yml
10
.travis.yml
|
|
@ -13,6 +13,7 @@ cache:
|
|||
- $HOME/mpich_install
|
||||
- $HOME/hdf5_install
|
||||
- $HOME/phdf5_install
|
||||
- $HOME/nndc_hdf5
|
||||
|
||||
before_install:
|
||||
# ============== Handle Python third-party packages ==============
|
||||
|
|
@ -40,11 +41,12 @@ before_install:
|
|||
install: true
|
||||
|
||||
before_script:
|
||||
- if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then
|
||||
wget https://anl.box.com/shared/static/fouwc8lh9he2wc97kzq65u4rp8zt9sgq.xz -O - | tar -C $HOME -xvJ;
|
||||
fi
|
||||
- export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml
|
||||
|
||||
- cd data
|
||||
- git clone --branch=master git://github.com/bhermanmit/nndc_xs nndc_xs
|
||||
- cat nndc_xs/nndc.tar.gza* | tar xzvf -
|
||||
- rm -rf nndc_xs
|
||||
- export OPENMC_CROSS_SECTIONS=$PWD/nndc/cross_sections.xml
|
||||
- git clone --branch=master git://github.com/smharper/windowed_multipole_library.git wmp_lib
|
||||
- tar xzvf wmp_lib/multipole_lib.tar.gz
|
||||
- export OPENMC_MULTIPOLE_LIBRARY=$PWD/multipole_lib
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU)
|
|||
list(APPEND ldflags -pg)
|
||||
endif()
|
||||
if(optimize)
|
||||
list(APPEND f90flags -O3 -flto -fuse-linker-plugin)
|
||||
list(APPEND f90flags -O3)
|
||||
list(APPEND cflags -O3)
|
||||
endif()
|
||||
if(openmp)
|
||||
|
|
@ -147,8 +147,7 @@ elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Intel)
|
|||
if(debug)
|
||||
list(APPEND f90flags -g -warn -ftrapuv -fp-stack-check
|
||||
"-check all" -fpe0)
|
||||
list(APPEND cflags -g -warn -ftrapuv -fp-stack-check
|
||||
"-check all" -fpe0)
|
||||
list(APPEND cflags -g -w3 -ftrapuv -fp-stack-check)
|
||||
list(APPEND ldflags -g)
|
||||
endif()
|
||||
if(profile)
|
||||
|
|
@ -161,9 +160,9 @@ elseif(CMAKE_Fortran_COMPILER_ID STREQUAL Intel)
|
|||
list(APPEND cflags -O3)
|
||||
endif()
|
||||
if(openmp)
|
||||
list(APPEND f90flags -openmp)
|
||||
list(APPEND cflags -openmp)
|
||||
list(APPEND ldflags -openmp)
|
||||
list(APPEND f90flags -qopenmp)
|
||||
list(APPEND cflags -qopenmp)
|
||||
list(APPEND ldflags -qopenmp)
|
||||
endif()
|
||||
|
||||
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL PGI)
|
||||
|
|
@ -318,6 +317,7 @@ if(PYTHONINTERP_FOUND)
|
|||
--root=debian/openmc --install-layout=deb
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})")
|
||||
else()
|
||||
install(CODE "set(ENV{PYTHONPATH} \"${CMAKE_INSTALL_PREFIX}/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages\")")
|
||||
install(CODE "execute_process(
|
||||
COMMAND ${PYTHON_EXECUTABLE} setup.py install
|
||||
--prefix=${CMAKE_INSTALL_PREFIX}
|
||||
|
|
|
|||
2
LICENSE
2
LICENSE
|
|
@ -1,4 +1,4 @@
|
|||
Copyright (c) 2011-2015 Massachusetts Institute of Technology
|
||||
Copyright (c) 2011-2016 Massachusetts Institute of Technology
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
|||
88
data/convert_mcnp_70.py
Executable file
88
data/convert_mcnp_70.py
Executable file
|
|
@ -0,0 +1,88 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
from argparse import ArgumentParser
|
||||
from collections import defaultdict
|
||||
import glob
|
||||
import os
|
||||
|
||||
import openmc.data
|
||||
|
||||
|
||||
# Get path to MCNP data
|
||||
parser = ArgumentParser()
|
||||
parser.add_argument('-d', '--destination', default='mcnp_endfb70',
|
||||
help='Directory to create new library in')
|
||||
parser.add_argument('mcnpdata', help='Directory containing endf70[a-k] and endf70sab')
|
||||
args = parser.parse_args()
|
||||
assert os.path.isdir(args.mcnpdata)
|
||||
|
||||
# Get a list of all neutron ACE files
|
||||
endf70 = glob.glob(os.path.join(args.mcnpdata, 'endf70[a-k]'))
|
||||
|
||||
# Create output directory if it doesn't exist
|
||||
if not os.path.isdir(args.destination):
|
||||
os.mkdir(args.destination)
|
||||
|
||||
library = openmc.data.DataLibrary()
|
||||
|
||||
for path in sorted(endf70):
|
||||
print('Loading data from {}...'.format(path))
|
||||
lib = openmc.data.ace.Library(path)
|
||||
|
||||
# Group together tables for the same nuclide
|
||||
tables = defaultdict(list)
|
||||
for table in lib.tables:
|
||||
zaid, xs = table.name.split('.')
|
||||
tables[zaid].append(table)
|
||||
|
||||
for zaid, tables in sorted(tables.items()):
|
||||
# Convert first temperature for the table
|
||||
print('Converting: ' + tables[0].name)
|
||||
data = openmc.data.IncidentNeutron.from_ace(tables[0], 'mcnp')
|
||||
|
||||
# For each higher temperature, add cross sections to the existing table
|
||||
for table in tables[1:]:
|
||||
print('Adding: ' + table.name)
|
||||
data.add_temperature_from_ace(table, 'mcnp')
|
||||
|
||||
# Export HDF5 file
|
||||
h5_file = os.path.join(args.destination, data.name + '.h5')
|
||||
print('Writing {}...'.format(h5_file))
|
||||
data.export_to_hdf5(h5_file, 'w')
|
||||
|
||||
# Register with library
|
||||
library.register_file(h5_file)
|
||||
|
||||
# Handle S(a,b) tables
|
||||
endf70sab = os.path.join(args.mcnpdata, 'endf70sab')
|
||||
if os.path.exists(endf70sab):
|
||||
lib = openmc.data.ace.Library(endf70sab)
|
||||
|
||||
# Group together tables for the same nuclide
|
||||
tables = defaultdict(list)
|
||||
for table in lib.tables:
|
||||
name, xs = table.name.split('.')
|
||||
tables[name].append(table)
|
||||
|
||||
for zaid, tables in sorted(tables.items()):
|
||||
# Convert first temperature for the table
|
||||
print('Converting: ' + tables[0].name)
|
||||
data = openmc.data.ThermalScattering.from_ace(tables[0])
|
||||
|
||||
# For each higher temperature, add cross sections to the existing table
|
||||
for table in tables[1:]:
|
||||
print('Adding: ' + table.name)
|
||||
data.add_temperature_from_ace(table)
|
||||
|
||||
# Export HDF5 file
|
||||
h5_file = os.path.join(args.destination, data.name + '.h5')
|
||||
print('Writing {}...'.format(h5_file))
|
||||
data.export_to_hdf5(h5_file, 'w')
|
||||
|
||||
# Register with library
|
||||
library.register_file(h5_file)
|
||||
|
||||
# Write cross_sections.xml
|
||||
libpath = os.path.join(args.destination, 'cross_sections.xml')
|
||||
library.export_to_xml(libpath)
|
||||
77
data/convert_mcnp_71.py
Executable file
77
data/convert_mcnp_71.py
Executable file
|
|
@ -0,0 +1,77 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
from argparse import ArgumentParser
|
||||
from collections import defaultdict
|
||||
import glob
|
||||
import os
|
||||
|
||||
import openmc.data
|
||||
|
||||
|
||||
# Get path to MCNP data
|
||||
parser = ArgumentParser()
|
||||
parser.add_argument('-d', '--destination', default='mcnp_endfb71',
|
||||
help='Directory to create new library in')
|
||||
parser.add_argument('-f', '--fission_energy_release',
|
||||
help='HDF5 file containing fission energy release data')
|
||||
parser.add_argument('mcnpdata', help='Directory containing endf71x and ENDF71SaB')
|
||||
args = parser.parse_args()
|
||||
assert os.path.isdir(args.mcnpdata)
|
||||
|
||||
# Get a list of all ACE files
|
||||
endf71x = glob.glob(os.path.join(args.mcnpdata, 'endf71x', '*', '*.71?nc'))
|
||||
endf71sab = glob.glob(os.path.join(args.mcnpdata, 'ENDF71SaB' , '*.2?t'))
|
||||
|
||||
# There's a bug in H-Zr at 1200 K
|
||||
endf71sab.remove(os.path.join(args.mcnpdata, 'ENDF71SaB' , 'h-zr.27t'))
|
||||
|
||||
# Group together tables for the same nuclide
|
||||
suffixes = defaultdict(list)
|
||||
for filename in sorted(endf71x + endf71sab):
|
||||
dirname, basename = os.path.split(filename)
|
||||
zaid, xs = basename.split('.')
|
||||
suffixes[os.path.join(dirname, zaid)].append(xs)
|
||||
|
||||
# Create output directory if it doesn't exist
|
||||
if not os.path.isdir(args.destination):
|
||||
os.mkdir(args.destination)
|
||||
|
||||
library = openmc.data.DataLibrary()
|
||||
|
||||
for basename, xs_list in sorted(suffixes.items()):
|
||||
# Convert first temperature for the table
|
||||
filename = '.'.join((basename, xs_list[0]))
|
||||
print('Converting: ' + filename)
|
||||
if filename.endswith('t'):
|
||||
data = openmc.data.ThermalScattering.from_ace(filename)
|
||||
else:
|
||||
data = openmc.data.IncidentNeutron.from_ace(filename, 'mcnp')
|
||||
|
||||
# Add fission energy release data, if available
|
||||
if args.fission_energy_release is not None:
|
||||
fer = openmc.data.FissionEnergyRelease.from_compact_hdf5(
|
||||
args.fission_energy_release, data)
|
||||
if fer is not None:
|
||||
data.fission_energy = fer
|
||||
|
||||
# For each higher temperature, add cross sections to the existing table
|
||||
for xs in xs_list[1:]:
|
||||
filename = '.'.join((basename, xs))
|
||||
print('Adding: ' + filename)
|
||||
if filename.endswith('t'):
|
||||
data.add_temperature_from_ace(filename)
|
||||
else:
|
||||
data.add_temperature_from_ace(filename, 'mcnp')
|
||||
|
||||
# Export HDF5 file
|
||||
h5_file = os.path.join(args.destination, data.name + '.h5')
|
||||
print('Writing {}...'.format(h5_file))
|
||||
data.export_to_hdf5(h5_file, 'w')
|
||||
|
||||
# Register with library
|
||||
library.register_file(h5_file)
|
||||
|
||||
# Write cross_sections.xml
|
||||
libpath = os.path.join(args.destination, 'cross_sections.xml')
|
||||
library.export_to_xml(libpath)
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,870 +0,0 @@
|
|||
<?xml version="1.0" ?>
|
||||
<cross_sections>
|
||||
<filetype>ascii</filetype>
|
||||
<ace_table alias="H-1.71c" awr="0.999167" location="1" name="1001.71c" path="293.6K/H_001_293.6K.ace" temperature="2.53e-08" zaid="1001"/>
|
||||
<ace_table alias="H-2.71c" awr="1.9968" location="1" name="1002.71c" path="293.6K/H_002_293.6K.ace" temperature="2.53e-08" zaid="1002"/>
|
||||
<ace_table alias="H-3.71c" awr="2.989596" location="1" name="1003.71c" path="293.6K/H_003_293.6K.ace" temperature="2.53e-08" zaid="1003"/>
|
||||
<ace_table alias="He-3.71c" awr="2.989032" location="1" name="2003.71c" path="293.6K/He_003_293.6K.ace" temperature="2.53e-08" zaid="2003"/>
|
||||
<ace_table alias="He-4.71c" awr="3.968219" location="1" name="2004.71c" path="293.6K/He_004_293.6K.ace" temperature="2.53e-08" zaid="2004"/>
|
||||
<ace_table alias="Li-6.71c" awr="5.9634" location="1" name="3006.71c" path="293.6K/Li_006_293.6K.ace" temperature="2.53e-08" zaid="3006"/>
|
||||
<ace_table alias="Li-7.71c" awr="6.955732" location="1" name="3007.71c" path="293.6K/Li_007_293.6K.ace" temperature="2.53e-08" zaid="3007"/>
|
||||
<ace_table alias="Be-7.71c" awr="6.9545" location="1" name="4007.71c" path="293.6K/Be_007_293.6K.ace" temperature="2.53e-08" zaid="4007"/>
|
||||
<ace_table alias="Be-9.71c" awr="8.93478" location="1" name="4009.71c" path="293.6K/Be_009_293.6K.ace" temperature="2.53e-08" zaid="4009"/>
|
||||
<ace_table alias="B-10.71c" awr="9.926921" location="1" name="5010.71c" path="293.6K/B_010_293.6K.ace" temperature="2.53e-08" zaid="5010"/>
|
||||
<ace_table alias="B-11.71c" awr="10.9147" location="1" name="5011.71c" path="293.6K/B_011_293.6K.ace" temperature="2.53e-08" zaid="5011"/>
|
||||
<ace_table alias="C-Nat.71c" awr="11.898" location="1" name="6000.71c" path="293.6K/C_000_293.6K.ace" temperature="2.53e-08" zaid="6000"/>
|
||||
<ace_table alias="N-14.71c" awr="13.88278" location="1" name="7014.71c" path="293.6K/N_014_293.6K.ace" temperature="2.53e-08" zaid="7014"/>
|
||||
<ace_table alias="N-15.71c" awr="14.871" location="1" name="7015.71c" path="293.6K/N_015_293.6K.ace" temperature="2.53e-08" zaid="7015"/>
|
||||
<ace_table alias="O-16.71c" awr="15.85751" location="1" name="8016.71c" path="293.6K/O_016_293.6K.ace" temperature="2.53e-08" zaid="8016"/>
|
||||
<ace_table alias="O-17.71c" awr="16.8531" location="1" name="8017.71c" path="293.6K/O_017_293.6K.ace" temperature="2.53e-08" zaid="8017"/>
|
||||
<ace_table alias="F-19.71c" awr="18.835" location="1" name="9019.71c" path="293.6K/F_019_293.6K.ace" temperature="2.53e-08" zaid="9019"/>
|
||||
<ace_table alias="Na-22.71c" awr="21.8055" location="1" name="11022.71c" path="293.6K/Na_022_293.6K.ace" temperature="2.53e-08" zaid="11022"/>
|
||||
<ace_table alias="Na-23.71c" awr="22.792" location="1" name="11023.71c" path="293.6K/Na_023_293.6K.ace" temperature="2.53e-08" zaid="11023"/>
|
||||
<ace_table alias="Mg-24.71c" awr="23.779" location="1" name="12024.71c" path="293.6K/Mg_024_293.6K.ace" temperature="2.53e-08" zaid="12024"/>
|
||||
<ace_table alias="Mg-25.71c" awr="24.7712" location="1" name="12025.71c" path="293.6K/Mg_025_293.6K.ace" temperature="2.53e-08" zaid="12025"/>
|
||||
<ace_table alias="Mg-26.71c" awr="25.7594" location="1" name="12026.71c" path="293.6K/Mg_026_293.6K.ace" temperature="2.53e-08" zaid="12026"/>
|
||||
<ace_table alias="Al-27.71c" awr="26.74975" location="1" name="13027.71c" path="293.6K/Al_027_293.6K.ace" temperature="2.53e-08" zaid="13027"/>
|
||||
<ace_table alias="Si-28.71c" awr="27.737" location="1" name="14028.71c" path="293.6K/Si_028_293.6K.ace" temperature="2.53e-08" zaid="14028"/>
|
||||
<ace_table alias="Si-29.71c" awr="28.728" location="1" name="14029.71c" path="293.6K/Si_029_293.6K.ace" temperature="2.53e-08" zaid="14029"/>
|
||||
<ace_table alias="Si-30.71c" awr="29.716" location="1" name="14030.71c" path="293.6K/Si_030_293.6K.ace" temperature="2.53e-08" zaid="14030"/>
|
||||
<ace_table alias="P-31.71c" awr="30.708" location="1" name="15031.71c" path="293.6K/P_031_293.6K.ace" temperature="2.53e-08" zaid="15031"/>
|
||||
<ace_table alias="S-32.71c" awr="31.6973" location="1" name="16032.71c" path="293.6K/S_032_293.6K.ace" temperature="2.53e-08" zaid="16032"/>
|
||||
<ace_table alias="S-33.71c" awr="32.6878" location="1" name="16033.71c" path="293.6K/S_033_293.6K.ace" temperature="2.53e-08" zaid="16033"/>
|
||||
<ace_table alias="S-34.71c" awr="33.6762" location="1" name="16034.71c" path="293.6K/S_034_293.6K.ace" temperature="2.53e-08" zaid="16034"/>
|
||||
<ace_table alias="S-36.71c" awr="35.658" location="1" name="16036.71c" path="293.6K/S_036_293.6K.ace" temperature="2.53e-08" zaid="16036"/>
|
||||
<ace_table alias="Cl-35.71c" awr="34.66845" location="1" name="17035.71c" path="293.6K/Cl_035_293.6K.ace" temperature="2.53e-08" zaid="17035"/>
|
||||
<ace_table alias="Cl-37.71c" awr="36.6483" location="1" name="17037.71c" path="293.6K/Cl_037_293.6K.ace" temperature="2.53e-08" zaid="17037"/>
|
||||
<ace_table alias="Ar-36.71c" awr="35.6585" location="1" name="18036.71c" path="293.6K/Ar_036_293.6K.ace" temperature="2.53e-08" zaid="18036"/>
|
||||
<ace_table alias="Ar-38.71c" awr="37.6366" location="1" name="18038.71c" path="293.6K/Ar_038_293.6K.ace" temperature="2.53e-08" zaid="18038"/>
|
||||
<ace_table alias="Ar-40.71c" awr="39.6191" location="1" name="18040.71c" path="293.6K/Ar_040_293.6K.ace" temperature="2.53e-08" zaid="18040"/>
|
||||
<ace_table alias="K-39.71c" awr="38.6293" location="1" name="19039.71c" path="293.6K/K_039_293.6K.ace" temperature="2.53e-08" zaid="19039"/>
|
||||
<ace_table alias="K-40.71c" awr="39.6207" location="1" name="19040.71c" path="293.6K/K_040_293.6K.ace" temperature="2.53e-08" zaid="19040"/>
|
||||
<ace_table alias="K-41.71c" awr="40.6101" location="1" name="19041.71c" path="293.6K/K_041_293.6K.ace" temperature="2.53e-08" zaid="19041"/>
|
||||
<ace_table alias="Ca-40.71c" awr="39.6193" location="1" name="20040.71c" path="293.6K/Ca_040_293.6K.ace" temperature="2.53e-08" zaid="20040"/>
|
||||
<ace_table alias="Ca-42.71c" awr="41.59818" location="1" name="20042.71c" path="293.6K/Ca_042_293.6K.ace" temperature="2.53e-08" zaid="20042"/>
|
||||
<ace_table alias="Ca-43.71c" awr="42.58973" location="1" name="20043.71c" path="293.6K/Ca_043_293.6K.ace" temperature="2.53e-08" zaid="20043"/>
|
||||
<ace_table alias="Ca-44.71c" awr="43.57788" location="1" name="20044.71c" path="293.6K/Ca_044_293.6K.ace" temperature="2.53e-08" zaid="20044"/>
|
||||
<ace_table alias="Ca-46.71c" awr="45.55893" location="1" name="20046.71c" path="293.6K/Ca_046_293.6K.ace" temperature="2.53e-08" zaid="20046"/>
|
||||
<ace_table alias="Ca-48.71c" awr="47.5406" location="1" name="20048.71c" path="293.6K/Ca_048_293.6K.ace" temperature="2.53e-08" zaid="20048"/>
|
||||
<ace_table alias="Sc-45.71c" awr="44.5679" location="1" name="21045.71c" path="293.6K/Sc_045_293.6K.ace" temperature="2.53e-08" zaid="21045"/>
|
||||
<ace_table alias="Ti-46.71c" awr="45.5579" location="1" name="22046.71c" path="293.6K/Ti_046_293.6K.ace" temperature="2.53e-08" zaid="22046"/>
|
||||
<ace_table alias="Ti-47.71c" awr="46.5484" location="1" name="22047.71c" path="293.6K/Ti_047_293.6K.ace" temperature="2.53e-08" zaid="22047"/>
|
||||
<ace_table alias="Ti-48.71c" awr="47.5361" location="1" name="22048.71c" path="293.6K/Ti_048_293.6K.ace" temperature="2.53e-08" zaid="22048"/>
|
||||
<ace_table alias="Ti-49.71c" awr="48.5274" location="1" name="22049.71c" path="293.6K/Ti_049_293.6K.ace" temperature="2.53e-08" zaid="22049"/>
|
||||
<ace_table alias="Ti-50.71c" awr="49.5157" location="1" name="22050.71c" path="293.6K/Ti_050_293.6K.ace" temperature="2.53e-08" zaid="22050"/>
|
||||
<ace_table alias="V-50.71c" awr="49.5181" location="1" name="23050.71c" path="293.6K/V_050_293.6K.ace" temperature="2.53e-08" zaid="23050"/>
|
||||
<ace_table alias="V-51.71c" awr="50.5063" location="1" name="23051.71c" path="293.6K/V_051_293.6K.ace" temperature="2.53e-08" zaid="23051"/>
|
||||
<ace_table alias="Cr-50.71c" awr="49.517" location="1" name="24050.71c" path="293.6K/Cr_050_293.6K.ace" temperature="2.53e-08" zaid="24050"/>
|
||||
<ace_table alias="Cr-52.71c" awr="51.494" location="1" name="24052.71c" path="293.6K/Cr_052_293.6K.ace" temperature="2.53e-08" zaid="24052"/>
|
||||
<ace_table alias="Cr-53.71c" awr="52.486" location="1" name="24053.71c" path="293.6K/Cr_053_293.6K.ace" temperature="2.53e-08" zaid="24053"/>
|
||||
<ace_table alias="Cr-54.71c" awr="53.476" location="1" name="24054.71c" path="293.6K/Cr_054_293.6K.ace" temperature="2.53e-08" zaid="24054"/>
|
||||
<ace_table alias="Mn-55.71c" awr="54.4661" location="1" name="25055.71c" path="293.6K/Mn_055_293.6K.ace" temperature="2.53e-08" zaid="25055"/>
|
||||
<ace_table alias="Fe-54.71c" awr="53.476" location="1" name="26054.71c" path="293.6K/Fe_054_293.6K.ace" temperature="2.53e-08" zaid="26054"/>
|
||||
<ace_table alias="Fe-56.71c" awr="55.454" location="1" name="26056.71c" path="293.6K/Fe_056_293.6K.ace" temperature="2.53e-08" zaid="26056"/>
|
||||
<ace_table alias="Fe-57.71c" awr="56.446" location="1" name="26057.71c" path="293.6K/Fe_057_293.6K.ace" temperature="2.53e-08" zaid="26057"/>
|
||||
<ace_table alias="Fe-58.71c" awr="57.436" location="1" name="26058.71c" path="293.6K/Fe_058_293.6K.ace" temperature="2.53e-08" zaid="26058"/>
|
||||
<ace_table alias="Co-58.71c" awr="57.4381" location="1" name="27058.71c" path="293.6K/Co_058_293.6K.ace" temperature="2.53e-08" zaid="27058"/>
|
||||
<ace_table alias="Co-58m.71c" awr="57.4381" location="1" metastable="1" name="27458.71c" path="293.6K/Co_058m1_293.6K.ace" temperature="2.53e-08" zaid="27458"/>
|
||||
<ace_table alias="Co-59.71c" awr="58.4269" location="1" name="27059.71c" path="293.6K/Co_059_293.6K.ace" temperature="2.53e-08" zaid="27059"/>
|
||||
<ace_table alias="Ni-58.71c" awr="57.438" location="1" name="28058.71c" path="293.6K/Ni_058_293.6K.ace" temperature="2.53e-08" zaid="28058"/>
|
||||
<ace_table alias="Ni-59.71c" awr="58.4281" location="1" name="28059.71c" path="293.6K/Ni_059_293.6K.ace" temperature="2.53e-08" zaid="28059"/>
|
||||
<ace_table alias="Ni-60.71c" awr="59.416" location="1" name="28060.71c" path="293.6K/Ni_060_293.6K.ace" temperature="2.53e-08" zaid="28060"/>
|
||||
<ace_table alias="Ni-61.71c" awr="60.408" location="1" name="28061.71c" path="293.6K/Ni_061_293.6K.ace" temperature="2.53e-08" zaid="28061"/>
|
||||
<ace_table alias="Ni-62.71c" awr="61.396" location="1" name="28062.71c" path="293.6K/Ni_062_293.6K.ace" temperature="2.53e-08" zaid="28062"/>
|
||||
<ace_table alias="Ni-64.71c" awr="63.379" location="1" name="28064.71c" path="293.6K/Ni_064_293.6K.ace" temperature="2.53e-08" zaid="28064"/>
|
||||
<ace_table alias="Cu-63.71c" awr="62.389" location="1" name="29063.71c" path="293.6K/Cu_063_293.6K.ace" temperature="2.53e-08" zaid="29063"/>
|
||||
<ace_table alias="Cu-65.71c" awr="64.37" location="1" name="29065.71c" path="293.6K/Cu_065_293.6K.ace" temperature="2.53e-08" zaid="29065"/>
|
||||
<ace_table alias="Zn-64.71c" awr="63.38" location="1" name="30064.71c" path="293.6K/Zn_064_293.6K.ace" temperature="2.53e-08" zaid="30064"/>
|
||||
<ace_table alias="Zn-65.71c" awr="64.3715" location="1" name="30065.71c" path="293.6K/Zn_065_293.6K.ace" temperature="2.53e-08" zaid="30065"/>
|
||||
<ace_table alias="Zn-66.71c" awr="65.3597" location="1" name="30066.71c" path="293.6K/Zn_066_293.6K.ace" temperature="2.53e-08" zaid="30066"/>
|
||||
<ace_table alias="Zn-67.71c" awr="66.3522" location="1" name="30067.71c" path="293.6K/Zn_067_293.6K.ace" temperature="2.53e-08" zaid="30067"/>
|
||||
<ace_table alias="Zn-68.71c" awr="67.3413" location="1" name="30068.71c" path="293.6K/Zn_068_293.6K.ace" temperature="2.53e-08" zaid="30068"/>
|
||||
<ace_table alias="Zn-70.71c" awr="69.3246" location="1" name="30070.71c" path="293.6K/Zn_070_293.6K.ace" temperature="2.53e-08" zaid="30070"/>
|
||||
<ace_table alias="Ga-69.71c" awr="68.3336" location="1" name="31069.71c" path="293.6K/Ga_069_293.6K.ace" temperature="2.53e-08" zaid="31069"/>
|
||||
<ace_table alias="Ga-71.71c" awr="70.315" location="1" name="31071.71c" path="293.6K/Ga_071_293.6K.ace" temperature="2.53e-08" zaid="31071"/>
|
||||
<ace_table alias="Ge-70.71c" awr="69.3236" location="1" name="32070.71c" path="293.6K/Ge_070_293.6K.ace" temperature="2.53e-08" zaid="32070"/>
|
||||
<ace_table alias="Ge-72.71c" awr="71.3042" location="1" name="32072.71c" path="293.6K/Ge_072_293.6K.ace" temperature="2.53e-08" zaid="32072"/>
|
||||
<ace_table alias="Ge-73.71c" awr="72.297" location="1" name="32073.71c" path="293.6K/Ge_073_293.6K.ace" temperature="2.53e-08" zaid="32073"/>
|
||||
<ace_table alias="Ge-74.71c" awr="73.2862" location="1" name="32074.71c" path="293.6K/Ge_074_293.6K.ace" temperature="2.53e-08" zaid="32074"/>
|
||||
<ace_table alias="Ge-76.71c" awr="75.2692" location="1" name="32076.71c" path="293.6K/Ge_076_293.6K.ace" temperature="2.53e-08" zaid="32076"/>
|
||||
<ace_table alias="As-74.71c" awr="73.2889" location="1" name="33074.71c" path="293.6K/As_074_293.6K.ace" temperature="2.53e-08" zaid="33074"/>
|
||||
<ace_table alias="As-75.71c" awr="74.278" location="1" name="33075.71c" path="293.6K/As_075_293.6K.ace" temperature="2.53e-08" zaid="33075"/>
|
||||
<ace_table alias="Se-74.71c" awr="73.2875" location="1" name="34074.71c" path="293.6K/Se_074_293.6K.ace" temperature="2.53e-08" zaid="34074"/>
|
||||
<ace_table alias="Se-76.71c" awr="75.267" location="1" name="34076.71c" path="293.6K/Se_076_293.6K.ace" temperature="2.53e-08" zaid="34076"/>
|
||||
<ace_table alias="Se-77.71c" awr="76.2591" location="1" name="34077.71c" path="293.6K/Se_077_293.6K.ace" temperature="2.53e-08" zaid="34077"/>
|
||||
<ace_table alias="Se-78.71c" awr="77.2479" location="1" name="34078.71c" path="293.6K/Se_078_293.6K.ace" temperature="2.53e-08" zaid="34078"/>
|
||||
<ace_table alias="Se-79.71c" awr="78.2405" location="1" name="34079.71c" path="293.6K/Se_079_293.6K.ace" temperature="2.53e-08" zaid="34079"/>
|
||||
<ace_table alias="Se-80.71c" awr="79.23" location="1" name="34080.71c" path="293.6K/Se_080_293.6K.ace" temperature="2.53e-08" zaid="34080"/>
|
||||
<ace_table alias="Se-82.71c" awr="81.213" location="1" name="34082.71c" path="293.6K/Se_082_293.6K.ace" temperature="2.53e-08" zaid="34082"/>
|
||||
<ace_table alias="Br-79.71c" awr="78.2403" location="1" name="35079.71c" path="293.6K/Br_079_293.6K.ace" temperature="2.53e-08" zaid="35079"/>
|
||||
<ace_table alias="Br-81.71c" awr="80.2212" location="1" name="35081.71c" path="293.6K/Br_081_293.6K.ace" temperature="2.53e-08" zaid="35081"/>
|
||||
<ace_table alias="Kr-78.71c" awr="77.25099" location="1" name="36078.71c" path="293.6K/Kr_078_293.6K.ace" temperature="2.53e-08" zaid="36078"/>
|
||||
<ace_table alias="Kr-80.71c" awr="79.2299" location="1" name="36080.71c" path="293.6K/Kr_080_293.6K.ace" temperature="2.53e-08" zaid="36080"/>
|
||||
<ace_table alias="Kr-82.71c" awr="81.2098" location="1" name="36082.71c" path="293.6K/Kr_082_293.6K.ace" temperature="2.53e-08" zaid="36082"/>
|
||||
<ace_table alias="Kr-83.71c" awr="82.202" location="1" name="36083.71c" path="293.6K/Kr_083_293.6K.ace" temperature="2.53e-08" zaid="36083"/>
|
||||
<ace_table alias="Kr-84.71c" awr="83.1907" location="1" name="36084.71c" path="293.6K/Kr_084_293.6K.ace" temperature="2.53e-08" zaid="36084"/>
|
||||
<ace_table alias="Kr-85.71c" awr="84.1831" location="1" name="36085.71c" path="293.6K/Kr_085_293.6K.ace" temperature="2.53e-08" zaid="36085"/>
|
||||
<ace_table alias="Kr-86.71c" awr="85.1726" location="1" name="36086.71c" path="293.6K/Kr_086_293.6K.ace" temperature="2.53e-08" zaid="36086"/>
|
||||
<ace_table alias="Rb-85.71c" awr="84.1824" location="1" name="37085.71c" path="293.6K/Rb_085_293.6K.ace" temperature="2.53e-08" zaid="37085"/>
|
||||
<ace_table alias="Rb-86.71c" awr="85.1731" location="1" name="37086.71c" path="293.6K/Rb_086_293.6K.ace" temperature="2.53e-08" zaid="37086"/>
|
||||
<ace_table alias="Rb-87.71c" awr="86.1626" location="1" name="37087.71c" path="293.6K/Rb_087_293.6K.ace" temperature="2.53e-08" zaid="37087"/>
|
||||
<ace_table alias="Sr-84.71c" awr="83.1926" location="1" name="38084.71c" path="293.6K/Sr_084_293.6K.ace" temperature="2.53e-08" zaid="38084"/>
|
||||
<ace_table alias="Sr-86.71c" awr="85.1713" location="1" name="38086.71c" path="293.6K/Sr_086_293.6K.ace" temperature="2.53e-08" zaid="38086"/>
|
||||
<ace_table alias="Sr-87.71c" awr="86.1623" location="1" name="38087.71c" path="293.6K/Sr_087_293.6K.ace" temperature="2.53e-08" zaid="38087"/>
|
||||
<ace_table alias="Sr-88.71c" awr="87.15" location="1" name="38088.71c" path="293.6K/Sr_088_293.6K.ace" temperature="2.53e-08" zaid="38088"/>
|
||||
<ace_table alias="Sr-89.71c" awr="88.144" location="1" name="38089.71c" path="293.6K/Sr_089_293.6K.ace" temperature="2.53e-08" zaid="38089"/>
|
||||
<ace_table alias="Sr-90.71c" awr="89.1353" location="1" name="38090.71c" path="293.6K/Sr_090_293.6K.ace" temperature="2.53e-08" zaid="38090"/>
|
||||
<ace_table alias="Y-89.71c" awr="88.1421" location="1" name="39089.71c" path="293.6K/Y_089_293.6K.ace" temperature="2.53e-08" zaid="39089"/>
|
||||
<ace_table alias="Y-90.71c" awr="89.1348" location="1" name="39090.71c" path="293.6K/Y_090_293.6K.ace" temperature="2.53e-08" zaid="39090"/>
|
||||
<ace_table alias="Y-91.71c" awr="90.1264" location="1" name="39091.71c" path="293.6K/Y_091_293.6K.ace" temperature="2.53e-08" zaid="39091"/>
|
||||
<ace_table alias="Zr-90.71c" awr="89.1324" location="1" name="40090.71c" path="293.6K/Zr_090_293.6K.ace" temperature="2.53e-08" zaid="40090"/>
|
||||
<ace_table alias="Zr-91.71c" awr="90.1247" location="1" name="40091.71c" path="293.6K/Zr_091_293.6K.ace" temperature="2.53e-08" zaid="40091"/>
|
||||
<ace_table alias="Zr-92.71c" awr="91.1155" location="1" name="40092.71c" path="293.6K/Zr_092_293.6K.ace" temperature="2.53e-08" zaid="40092"/>
|
||||
<ace_table alias="Zr-93.71c" awr="92.1084" location="1" name="40093.71c" path="293.6K/Zr_093_293.6K.ace" temperature="2.53e-08" zaid="40093"/>
|
||||
<ace_table alias="Zr-94.71c" awr="93.0996" location="1" name="40094.71c" path="293.6K/Zr_094_293.6K.ace" temperature="2.53e-08" zaid="40094"/>
|
||||
<ace_table alias="Zr-95.71c" awr="94.0927" location="1" name="40095.71c" path="293.6K/Zr_095_293.6K.ace" temperature="2.53e-08" zaid="40095"/>
|
||||
<ace_table alias="Zr-96.71c" awr="95.0844" location="1" name="40096.71c" path="293.6K/Zr_096_293.6K.ace" temperature="2.53e-08" zaid="40096"/>
|
||||
<ace_table alias="Nb-93.71c" awr="92.1051" location="1" name="41093.71c" path="293.6K/Nb_093_293.6K.ace" temperature="2.53e-08" zaid="41093"/>
|
||||
<ace_table alias="Nb-94.71c" awr="93.1006" location="1" name="41094.71c" path="293.6K/Nb_094_293.6K.ace" temperature="2.53e-08" zaid="41094"/>
|
||||
<ace_table alias="Nb-95.71c" awr="94.0915" location="1" name="41095.71c" path="293.6K/Nb_095_293.6K.ace" temperature="2.53e-08" zaid="41095"/>
|
||||
<ace_table alias="Mo-92.71c" awr="91.1173" location="1" name="42092.71c" path="293.6K/Mo_092_293.6K.ace" temperature="2.53e-08" zaid="42092"/>
|
||||
<ace_table alias="Mo-94.71c" awr="93.0984" location="1" name="42094.71c" path="293.6K/Mo_094_293.6K.ace" temperature="2.53e-08" zaid="42094"/>
|
||||
<ace_table alias="Mo-95.71c" awr="94.0906" location="1" name="42095.71c" path="293.6K/Mo_095_293.6K.ace" temperature="2.53e-08" zaid="42095"/>
|
||||
<ace_table alias="Mo-96.71c" awr="95.0808" location="1" name="42096.71c" path="293.6K/Mo_096_293.6K.ace" temperature="2.53e-08" zaid="42096"/>
|
||||
<ace_table alias="Mo-97.71c" awr="96.0735" location="1" name="42097.71c" path="293.6K/Mo_097_293.6K.ace" temperature="2.53e-08" zaid="42097"/>
|
||||
<ace_table alias="Mo-98.71c" awr="97.0643" location="1" name="42098.71c" path="293.6K/Mo_098_293.6K.ace" temperature="2.53e-08" zaid="42098"/>
|
||||
<ace_table alias="Mo-99.71c" awr="98.058" location="1" name="42099.71c" path="293.6K/Mo_099_293.6K.ace" temperature="2.53e-08" zaid="42099"/>
|
||||
<ace_table alias="Mo-100.71c" awr="99.049" location="1" name="42100.71c" path="293.6K/Mo_100_293.6K.ace" temperature="2.53e-08" zaid="42100"/>
|
||||
<ace_table alias="Tc-99.71c" awr="98.0566" location="1" name="43099.71c" path="293.6K/Tc_099_293.6K.ace" temperature="2.53e-08" zaid="43099"/>
|
||||
<ace_table alias="Ru-96.71c" awr="95.0837" location="1" name="44096.71c" path="293.6K/Ru_096_293.6K.ace" temperature="2.53e-08" zaid="44096"/>
|
||||
<ace_table alias="Ru-98.71c" awr="97.0642" location="1" name="44098.71c" path="293.6K/Ru_098_293.6K.ace" temperature="2.53e-08" zaid="44098"/>
|
||||
<ace_table alias="Ru-99.71c" awr="98.0562" location="1" name="44099.71c" path="293.6K/Ru_099_293.6K.ace" temperature="2.53e-08" zaid="44099"/>
|
||||
<ace_table alias="Ru-100.71c" awr="99.046" location="1" name="44100.71c" path="293.6K/Ru_100_293.6K.ace" temperature="2.53e-08" zaid="44100"/>
|
||||
<ace_table alias="Ru-101.71c" awr="100.039" location="1" name="44101.71c" path="293.6K/Ru_101_293.6K.ace" temperature="2.53e-08" zaid="44101"/>
|
||||
<ace_table alias="Ru-102.71c" awr="101.03" location="1" name="44102.71c" path="293.6K/Ru_102_293.6K.ace" temperature="2.53e-08" zaid="44102"/>
|
||||
<ace_table alias="Ru-103.71c" awr="102.02" location="1" name="44103.71c" path="293.6K/Ru_103_293.6K.ace" temperature="2.53e-08" zaid="44103"/>
|
||||
<ace_table alias="Ru-104.71c" awr="103.01" location="1" name="44104.71c" path="293.6K/Ru_104_293.6K.ace" temperature="2.53e-08" zaid="44104"/>
|
||||
<ace_table alias="Ru-105.71c" awr="104.01" location="1" name="44105.71c" path="293.6K/Ru_105_293.6K.ace" temperature="2.53e-08" zaid="44105"/>
|
||||
<ace_table alias="Ru-106.71c" awr="104.997" location="1" name="44106.71c" path="293.6K/Ru_106_293.6K.ace" temperature="2.53e-08" zaid="44106"/>
|
||||
<ace_table alias="Rh-103.71c" awr="102.021" location="1" name="45103.71c" path="293.6K/Rh_103_293.6K.ace" temperature="2.53e-08" zaid="45103"/>
|
||||
<ace_table alias="Rh-105.71c" awr="104.0" location="1" name="45105.71c" path="293.6K/Rh_105_293.6K.ace" temperature="2.53e-08" zaid="45105"/>
|
||||
<ace_table alias="Pd-102.71c" awr="101.0302" location="1" name="46102.71c" path="293.6K/Pd_102_293.6K.ace" temperature="2.53e-08" zaid="46102"/>
|
||||
<ace_table alias="Pd-104.71c" awr="103.0114" location="1" name="46104.71c" path="293.6K/Pd_104_293.6K.ace" temperature="2.53e-08" zaid="46104"/>
|
||||
<ace_table alias="Pd-105.71c" awr="104.004" location="1" name="46105.71c" path="293.6K/Pd_105_293.6K.ace" temperature="2.53e-08" zaid="46105"/>
|
||||
<ace_table alias="Pd-106.71c" awr="104.9937" location="1" name="46106.71c" path="293.6K/Pd_106_293.6K.ace" temperature="2.53e-08" zaid="46106"/>
|
||||
<ace_table alias="Pd-107.71c" awr="105.987" location="1" name="46107.71c" path="293.6K/Pd_107_293.6K.ace" temperature="2.53e-08" zaid="46107"/>
|
||||
<ace_table alias="Pd-108.71c" awr="106.9769" location="1" name="46108.71c" path="293.6K/Pd_108_293.6K.ace" temperature="2.53e-08" zaid="46108"/>
|
||||
<ace_table alias="Pd-110.71c" awr="108.961" location="1" name="46110.71c" path="293.6K/Pd_110_293.6K.ace" temperature="2.53e-08" zaid="46110"/>
|
||||
<ace_table alias="Ag-107.71c" awr="105.987" location="1" name="47107.71c" path="293.6K/Ag_107_293.6K.ace" temperature="2.53e-08" zaid="47107"/>
|
||||
<ace_table alias="Ag-109.71c" awr="107.969" location="1" name="47109.71c" path="293.6K/Ag_109_293.6K.ace" temperature="2.53e-08" zaid="47109"/>
|
||||
<ace_table alias="Ag-110m.71c" awr="108.962" location="1" metastable="1" name="47510.71c" path="293.6K/Ag_110m1_293.6K.ace" temperature="2.53e-08" zaid="47510"/>
|
||||
<ace_table alias="Ag-111.71c" awr="109.953" location="1" name="47111.71c" path="293.6K/Ag_111_293.6K.ace" temperature="2.53e-08" zaid="47111"/>
|
||||
<ace_table alias="Cd-106.71c" awr="104.996" location="1" name="48106.71c" path="293.6K/Cd_106_293.6K.ace" temperature="2.53e-08" zaid="48106"/>
|
||||
<ace_table alias="Cd-108.71c" awr="106.977" location="1" name="48108.71c" path="293.6K/Cd_108_293.6K.ace" temperature="2.53e-08" zaid="48108"/>
|
||||
<ace_table alias="Cd-110.71c" awr="108.959" location="1" name="48110.71c" path="293.6K/Cd_110_293.6K.ace" temperature="2.53e-08" zaid="48110"/>
|
||||
<ace_table alias="Cd-111.71c" awr="109.951" location="1" name="48111.71c" path="293.6K/Cd_111_293.6K.ace" temperature="2.53e-08" zaid="48111"/>
|
||||
<ace_table alias="Cd-112.71c" awr="110.942" location="1" name="48112.71c" path="293.6K/Cd_112_293.6K.ace" temperature="2.53e-08" zaid="48112"/>
|
||||
<ace_table alias="Cd-113.71c" awr="111.93" location="1" name="48113.71c" path="293.6K/Cd_113_293.6K.ace" temperature="2.53e-08" zaid="48113"/>
|
||||
<ace_table alias="Cd-114.71c" awr="112.925" location="1" name="48114.71c" path="293.6K/Cd_114_293.6K.ace" temperature="2.53e-08" zaid="48114"/>
|
||||
<ace_table alias="Cd-115m.71c" awr="113.918" location="1" metastable="1" name="48515.71c" path="293.6K/Cd_115m1_293.6K.ace" temperature="2.53e-08" zaid="48515"/>
|
||||
<ace_table alias="Cd-116.71c" awr="114.909" location="1" name="48116.71c" path="293.6K/Cd_116_293.6K.ace" temperature="2.53e-08" zaid="48116"/>
|
||||
<ace_table alias="In-113.71c" awr="111.934" location="1" name="49113.71c" path="293.6K/In_113_293.6K.ace" temperature="2.53e-08" zaid="49113"/>
|
||||
<ace_table alias="In-115.71c" awr="113.917" location="1" name="49115.71c" path="293.6K/In_115_293.6K.ace" temperature="2.53e-08" zaid="49115"/>
|
||||
<ace_table alias="Sn-112.71c" awr="110.944" location="1" name="50112.71c" path="293.6K/Sn_112_293.6K.ace" temperature="2.53e-08" zaid="50112"/>
|
||||
<ace_table alias="Sn-113.71c" awr="111.935" location="1" name="50113.71c" path="293.6K/Sn_113_293.6K.ace" temperature="2.53e-08" zaid="50113"/>
|
||||
<ace_table alias="Sn-114.71c" awr="112.925" location="1" name="50114.71c" path="293.6K/Sn_114_293.6K.ace" temperature="2.53e-08" zaid="50114"/>
|
||||
<ace_table alias="Sn-115.71c" awr="113.916" location="1" name="50115.71c" path="293.6K/Sn_115_293.6K.ace" temperature="2.53e-08" zaid="50115"/>
|
||||
<ace_table alias="Sn-116.71c" awr="114.906" location="1" name="50116.71c" path="293.6K/Sn_116_293.6K.ace" temperature="2.53e-08" zaid="50116"/>
|
||||
<ace_table alias="Sn-117.71c" awr="115.899" location="1" name="50117.71c" path="293.6K/Sn_117_293.6K.ace" temperature="2.53e-08" zaid="50117"/>
|
||||
<ace_table alias="Sn-118.71c" awr="116.889" location="1" name="50118.71c" path="293.6K/Sn_118_293.6K.ace" temperature="2.53e-08" zaid="50118"/>
|
||||
<ace_table alias="Sn-119.71c" awr="117.882" location="1" name="50119.71c" path="293.6K/Sn_119_293.6K.ace" temperature="2.53e-08" zaid="50119"/>
|
||||
<ace_table alias="Sn-120.71c" awr="118.872" location="1" name="50120.71c" path="293.6K/Sn_120_293.6K.ace" temperature="2.53e-08" zaid="50120"/>
|
||||
<ace_table alias="Sn-122.71c" awr="120.856" location="1" name="50122.71c" path="293.6K/Sn_122_293.6K.ace" temperature="2.53e-08" zaid="50122"/>
|
||||
<ace_table alias="Sn-123.71c" awr="121.85" location="1" name="50123.71c" path="293.6K/Sn_123_293.6K.ace" temperature="2.53e-08" zaid="50123"/>
|
||||
<ace_table alias="Sn-124.71c" awr="122.841" location="1" name="50124.71c" path="293.6K/Sn_124_293.6K.ace" temperature="2.53e-08" zaid="50124"/>
|
||||
<ace_table alias="Sn-125.71c" awr="123.835" location="1" name="50125.71c" path="293.6K/Sn_125_293.6K.ace" temperature="2.53e-08" zaid="50125"/>
|
||||
<ace_table alias="Sn-126.71c" awr="124.826" location="1" name="50126.71c" path="293.6K/Sn_126_293.6K.ace" temperature="2.53e-08" zaid="50126"/>
|
||||
<ace_table alias="Sb-121.71c" awr="119.87" location="1" name="51121.71c" path="293.6K/Sb_121_293.6K.ace" temperature="2.53e-08" zaid="51121"/>
|
||||
<ace_table alias="Sb-123.71c" awr="121.85" location="1" name="51123.71c" path="293.6K/Sb_123_293.6K.ace" temperature="2.53e-08" zaid="51123"/>
|
||||
<ace_table alias="Sb-124.71c" awr="122.842" location="1" name="51124.71c" path="293.6K/Sb_124_293.6K.ace" temperature="2.53e-08" zaid="51124"/>
|
||||
<ace_table alias="Sb-125.71c" awr="123.832" location="1" name="51125.71c" path="293.6K/Sb_125_293.6K.ace" temperature="2.53e-08" zaid="51125"/>
|
||||
<ace_table alias="Sb-126.71c" awr="124.826" location="1" name="51126.71c" path="293.6K/Sb_126_293.6K.ace" temperature="2.53e-08" zaid="51126"/>
|
||||
<ace_table alias="Te-120.71c" awr="118.874" location="1" name="52120.71c" path="293.6K/Te_120_293.6K.ace" temperature="2.53e-08" zaid="52120"/>
|
||||
<ace_table alias="Te-122.71c" awr="120.856" location="1" name="52122.71c" path="293.6K/Te_122_293.6K.ace" temperature="2.53e-08" zaid="52122"/>
|
||||
<ace_table alias="Te-123.71c" awr="121.848" location="1" name="52123.71c" path="293.6K/Te_123_293.6K.ace" temperature="2.53e-08" zaid="52123"/>
|
||||
<ace_table alias="Te-124.71c" awr="122.839" location="1" name="52124.71c" path="293.6K/Te_124_293.6K.ace" temperature="2.53e-08" zaid="52124"/>
|
||||
<ace_table alias="Te-125.71c" awr="123.831" location="1" name="52125.71c" path="293.6K/Te_125_293.6K.ace" temperature="2.53e-08" zaid="52125"/>
|
||||
<ace_table alias="Te-126.71c" awr="124.821" location="1" name="52126.71c" path="293.6K/Te_126_293.6K.ace" temperature="2.53e-08" zaid="52126"/>
|
||||
<ace_table alias="Te-127m.71c" awr="125.815" location="1" metastable="1" name="52527.71c" path="293.6K/Te_127m1_293.6K.ace" temperature="2.53e-08" zaid="52527"/>
|
||||
<ace_table alias="Te-128.71c" awr="126.805" location="1" name="52128.71c" path="293.6K/Te_128_293.6K.ace" temperature="2.53e-08" zaid="52128"/>
|
||||
<ace_table alias="Te-129m.71c" awr="127.8" location="1" metastable="1" name="52529.71c" path="293.6K/Te_129m1_293.6K.ace" temperature="2.53e-08" zaid="52529"/>
|
||||
<ace_table alias="Te-130.71c" awr="128.79" location="1" name="52130.71c" path="293.6K/Te_130_293.6K.ace" temperature="2.53e-08" zaid="52130"/>
|
||||
<ace_table alias="Te-132.71c" awr="130.775" location="1" name="52132.71c" path="293.6K/Te_132_293.6K.ace" temperature="2.53e-08" zaid="52132"/>
|
||||
<ace_table alias="I-127.71c" awr="125.8143" location="1" name="53127.71c" path="293.6K/I_127_293.6K.ace" temperature="2.53e-08" zaid="53127"/>
|
||||
<ace_table alias="I-129.71c" awr="127.798" location="1" name="53129.71c" path="293.6K/I_129_293.6K.ace" temperature="2.53e-08" zaid="53129"/>
|
||||
<ace_table alias="I-130.71c" awr="128.791" location="1" name="53130.71c" path="293.6K/I_130_293.6K.ace" temperature="2.53e-08" zaid="53130"/>
|
||||
<ace_table alias="I-131.71c" awr="129.781" location="1" name="53131.71c" path="293.6K/I_131_293.6K.ace" temperature="2.53e-08" zaid="53131"/>
|
||||
<ace_table alias="I-135.71c" awr="133.75" location="1" name="53135.71c" path="293.6K/I_135_293.6K.ace" temperature="2.53e-08" zaid="53135"/>
|
||||
<ace_table alias="Xe-123.71c" awr="121.8526" location="1" name="54123.71c" path="293.6K/Xe_123_293.6K.ace" temperature="2.53e-08" zaid="54123"/>
|
||||
<ace_table alias="Xe-124.71c" awr="122.8415" location="1" name="54124.71c" path="293.6K/Xe_124_293.6K.ace" temperature="2.53e-08" zaid="54124"/>
|
||||
<ace_table alias="Xe-126.71c" awr="124.822" location="1" name="54126.71c" path="293.6K/Xe_126_293.6K.ace" temperature="2.53e-08" zaid="54126"/>
|
||||
<ace_table alias="Xe-128.71c" awr="126.804" location="1" name="54128.71c" path="293.6K/Xe_128_293.6K.ace" temperature="2.53e-08" zaid="54128"/>
|
||||
<ace_table alias="Xe-129.71c" awr="127.798" location="1" name="54129.71c" path="293.6K/Xe_129_293.6K.ace" temperature="2.53e-08" zaid="54129"/>
|
||||
<ace_table alias="Xe-130.71c" awr="128.788" location="1" name="54130.71c" path="293.6K/Xe_130_293.6K.ace" temperature="2.53e-08" zaid="54130"/>
|
||||
<ace_table alias="Xe-131.71c" awr="129.781" location="1" name="54131.71c" path="293.6K/Xe_131_293.6K.ace" temperature="2.53e-08" zaid="54131"/>
|
||||
<ace_table alias="Xe-132.71c" awr="130.77" location="1" name="54132.71c" path="293.6K/Xe_132_293.6K.ace" temperature="2.53e-08" zaid="54132"/>
|
||||
<ace_table alias="Xe-133.71c" awr="131.764" location="1" name="54133.71c" path="293.6K/Xe_133_293.6K.ace" temperature="2.53e-08" zaid="54133"/>
|
||||
<ace_table alias="Xe-134.71c" awr="132.76" location="1" name="54134.71c" path="293.6K/Xe_134_293.6K.ace" temperature="2.53e-08" zaid="54134"/>
|
||||
<ace_table alias="Xe-135.71c" awr="133.748" location="1" name="54135.71c" path="293.6K/Xe_135_293.6K.ace" temperature="2.53e-08" zaid="54135"/>
|
||||
<ace_table alias="Xe-136.71c" awr="134.74" location="1" name="54136.71c" path="293.6K/Xe_136_293.6K.ace" temperature="2.53e-08" zaid="54136"/>
|
||||
<ace_table alias="Cs-133.71c" awr="131.764" location="1" name="55133.71c" path="293.6K/Cs_133_293.6K.ace" temperature="2.53e-08" zaid="55133"/>
|
||||
<ace_table alias="Cs-134.71c" awr="132.757" location="1" name="55134.71c" path="293.6K/Cs_134_293.6K.ace" temperature="2.53e-08" zaid="55134"/>
|
||||
<ace_table alias="Cs-135.71c" awr="133.747" location="1" name="55135.71c" path="293.6K/Cs_135_293.6K.ace" temperature="2.53e-08" zaid="55135"/>
|
||||
<ace_table alias="Cs-136.71c" awr="134.739" location="1" name="55136.71c" path="293.6K/Cs_136_293.6K.ace" temperature="2.53e-08" zaid="55136"/>
|
||||
<ace_table alias="Cs-137.71c" awr="135.731" location="1" name="55137.71c" path="293.6K/Cs_137_293.6K.ace" temperature="2.53e-08" zaid="55137"/>
|
||||
<ace_table alias="Ba-130.71c" awr="128.79" location="1" name="56130.71c" path="293.6K/Ba_130_293.6K.ace" temperature="2.53e-08" zaid="56130"/>
|
||||
<ace_table alias="Ba-132.71c" awr="130.772" location="1" name="56132.71c" path="293.6K/Ba_132_293.6K.ace" temperature="2.53e-08" zaid="56132"/>
|
||||
<ace_table alias="Ba-133.71c" awr="131.764" location="1" name="56133.71c" path="293.6K/Ba_133_293.6K.ace" temperature="2.53e-08" zaid="56133"/>
|
||||
<ace_table alias="Ba-134.71c" awr="132.754" location="1" name="56134.71c" path="293.6K/Ba_134_293.6K.ace" temperature="2.53e-08" zaid="56134"/>
|
||||
<ace_table alias="Ba-135.71c" awr="133.747" location="1" name="56135.71c" path="293.6K/Ba_135_293.6K.ace" temperature="2.53e-08" zaid="56135"/>
|
||||
<ace_table alias="Ba-136.71c" awr="134.737" location="1" name="56136.71c" path="293.6K/Ba_136_293.6K.ace" temperature="2.53e-08" zaid="56136"/>
|
||||
<ace_table alias="Ba-137.71c" awr="135.73" location="1" name="56137.71c" path="293.6K/Ba_137_293.6K.ace" temperature="2.53e-08" zaid="56137"/>
|
||||
<ace_table alias="Ba-138.71c" awr="136.72" location="1" name="56138.71c" path="293.6K/Ba_138_293.6K.ace" temperature="2.53e-08" zaid="56138"/>
|
||||
<ace_table alias="Ba-140.71c" awr="138.708" location="1" name="56140.71c" path="293.6K/Ba_140_293.6K.ace" temperature="2.53e-08" zaid="56140"/>
|
||||
<ace_table alias="La-138.71c" awr="136.722" location="1" name="57138.71c" path="293.6K/La_138_293.6K.ace" temperature="2.53e-08" zaid="57138"/>
|
||||
<ace_table alias="La-139.71c" awr="137.71" location="1" name="57139.71c" path="293.6K/La_139_293.6K.ace" temperature="2.53e-08" zaid="57139"/>
|
||||
<ace_table alias="La-140.71c" awr="138.708" location="1" name="57140.71c" path="293.6K/La_140_293.6K.ace" temperature="2.53e-08" zaid="57140"/>
|
||||
<ace_table alias="Ce-136.71c" awr="134.74" location="1" name="58136.71c" path="293.6K/Ce_136_293.6K.ace" temperature="2.53e-08" zaid="58136"/>
|
||||
<ace_table alias="Ce-138.71c" awr="136.721" location="1" name="58138.71c" path="293.6K/Ce_138_293.6K.ace" temperature="2.53e-08" zaid="58138"/>
|
||||
<ace_table alias="Ce-139.71c" awr="137.713" location="1" name="58139.71c" path="293.6K/Ce_139_293.6K.ace" temperature="2.53e-08" zaid="58139"/>
|
||||
<ace_table alias="Ce-140.71c" awr="138.704" location="1" name="58140.71c" path="293.6K/Ce_140_293.6K.ace" temperature="2.53e-08" zaid="58140"/>
|
||||
<ace_table alias="Ce-141.71c" awr="139.7" location="1" name="58141.71c" path="293.6K/Ce_141_293.6K.ace" temperature="2.53e-08" zaid="58141"/>
|
||||
<ace_table alias="Ce-142.71c" awr="140.69" location="1" name="58142.71c" path="293.6K/Ce_142_293.6K.ace" temperature="2.53e-08" zaid="58142"/>
|
||||
<ace_table alias="Ce-143.71c" awr="141.685" location="1" name="58143.71c" path="293.6K/Ce_143_293.6K.ace" temperature="2.53e-08" zaid="58143"/>
|
||||
<ace_table alias="Ce-144.71c" awr="142.678" location="1" name="58144.71c" path="293.6K/Ce_144_293.6K.ace" temperature="2.53e-08" zaid="58144"/>
|
||||
<ace_table alias="Pr-141.71c" awr="139.697" location="1" name="59141.71c" path="293.6K/Pr_141_293.6K.ace" temperature="2.53e-08" zaid="59141"/>
|
||||
<ace_table alias="Pr-142.71c" awr="140.691" location="1" name="59142.71c" path="293.6K/Pr_142_293.6K.ace" temperature="2.53e-08" zaid="59142"/>
|
||||
<ace_table alias="Pr-143.71c" awr="141.683" location="1" name="59143.71c" path="293.6K/Pr_143_293.6K.ace" temperature="2.53e-08" zaid="59143"/>
|
||||
<ace_table alias="Nd-142.71c" awr="140.689" location="1" name="60142.71c" path="293.6K/Nd_142_293.6K.ace" temperature="2.53e-08" zaid="60142"/>
|
||||
<ace_table alias="Nd-143.71c" awr="141.682" location="1" name="60143.71c" path="293.6K/Nd_143_293.6K.ace" temperature="2.53e-08" zaid="60143"/>
|
||||
<ace_table alias="Nd-144.71c" awr="142.674" location="1" name="60144.71c" path="293.6K/Nd_144_293.6K.ace" temperature="2.53e-08" zaid="60144"/>
|
||||
<ace_table alias="Nd-145.71c" awr="143.668" location="1" name="60145.71c" path="293.6K/Nd_145_293.6K.ace" temperature="2.53e-08" zaid="60145"/>
|
||||
<ace_table alias="Nd-146.71c" awr="144.66" location="1" name="60146.71c" path="293.6K/Nd_146_293.6K.ace" temperature="2.53e-08" zaid="60146"/>
|
||||
<ace_table alias="Nd-147.71c" awr="145.654" location="1" name="60147.71c" path="293.6K/Nd_147_293.6K.ace" temperature="2.53e-08" zaid="60147"/>
|
||||
<ace_table alias="Nd-148.71c" awr="146.646" location="1" name="60148.71c" path="293.6K/Nd_148_293.6K.ace" temperature="2.53e-08" zaid="60148"/>
|
||||
<ace_table alias="Nd-150.71c" awr="148.633" location="1" name="60150.71c" path="293.6K/Nd_150_293.6K.ace" temperature="2.53e-08" zaid="60150"/>
|
||||
<ace_table alias="Pm-147.71c" awr="145.653" location="1" name="61147.71c" path="293.6K/Pm_147_293.6K.ace" temperature="2.53e-08" zaid="61147"/>
|
||||
<ace_table alias="Pm-148.71c" awr="146.646" location="1" name="61148.71c" path="293.6K/Pm_148_293.6K.ace" temperature="2.53e-08" zaid="61148"/>
|
||||
<ace_table alias="Pm-148m.71c" awr="146.65" location="1" metastable="1" name="61548.71c" path="293.6K/Pm_148m1_293.6K.ace" temperature="2.53e-08" zaid="61548"/>
|
||||
<ace_table alias="Pm-149.71c" awr="147.639" location="1" name="61149.71c" path="293.6K/Pm_149_293.6K.ace" temperature="2.53e-08" zaid="61149"/>
|
||||
<ace_table alias="Pm-151.71c" awr="149.625" location="1" name="61151.71c" path="293.6K/Pm_151_293.6K.ace" temperature="2.53e-08" zaid="61151"/>
|
||||
<ace_table alias="Sm-144.71c" awr="142.676" location="1" name="62144.71c" path="293.6K/Sm_144_293.6K.ace" temperature="2.53e-08" zaid="62144"/>
|
||||
<ace_table alias="Sm-147.71c" awr="145.653" location="1" name="62147.71c" path="293.6K/Sm_147_293.6K.ace" temperature="2.53e-08" zaid="62147"/>
|
||||
<ace_table alias="Sm-148.71c" awr="146.644" location="1" name="62148.71c" path="293.6K/Sm_148_293.6K.ace" temperature="2.53e-08" zaid="62148"/>
|
||||
<ace_table alias="Sm-149.71c" awr="147.638" location="1" name="62149.71c" path="293.6K/Sm_149_293.6K.ace" temperature="2.53e-08" zaid="62149"/>
|
||||
<ace_table alias="Sm-150.71c" awr="148.629" location="1" name="62150.71c" path="293.6K/Sm_150_293.6K.ace" temperature="2.53e-08" zaid="62150"/>
|
||||
<ace_table alias="Sm-151.71c" awr="149.623" location="1" name="62151.71c" path="293.6K/Sm_151_293.6K.ace" temperature="2.53e-08" zaid="62151"/>
|
||||
<ace_table alias="Sm-152.71c" awr="150.615" location="1" name="62152.71c" path="293.6K/Sm_152_293.6K.ace" temperature="2.53e-08" zaid="62152"/>
|
||||
<ace_table alias="Sm-153.71c" awr="151.608" location="1" name="62153.71c" path="293.6K/Sm_153_293.6K.ace" temperature="2.53e-08" zaid="62153"/>
|
||||
<ace_table alias="Sm-154.71c" awr="152.6" location="1" name="62154.71c" path="293.6K/Sm_154_293.6K.ace" temperature="2.53e-08" zaid="62154"/>
|
||||
<ace_table alias="Eu-151.71c" awr="149.62" location="1" name="63151.71c" path="293.6K/Eu_151_293.6K.ace" temperature="2.53e-08" zaid="63151"/>
|
||||
<ace_table alias="Eu-152.71c" awr="150.617" location="1" name="63152.71c" path="293.6K/Eu_152_293.6K.ace" temperature="2.53e-08" zaid="63152"/>
|
||||
<ace_table alias="Eu-153.71c" awr="151.608" location="1" name="63153.71c" path="293.6K/Eu_153_293.6K.ace" temperature="2.53e-08" zaid="63153"/>
|
||||
<ace_table alias="Eu-154.71c" awr="152.6" location="1" name="63154.71c" path="293.6K/Eu_154_293.6K.ace" temperature="2.53e-08" zaid="63154"/>
|
||||
<ace_table alias="Eu-155.71c" awr="153.59" location="1" name="63155.71c" path="293.6K/Eu_155_293.6K.ace" temperature="2.53e-08" zaid="63155"/>
|
||||
<ace_table alias="Eu-156.71c" awr="154.586" location="1" name="63156.71c" path="293.6K/Eu_156_293.6K.ace" temperature="2.53e-08" zaid="63156"/>
|
||||
<ace_table alias="Eu-157.71c" awr="155.577" location="1" name="63157.71c" path="293.6K/Eu_157_293.6K.ace" temperature="2.53e-08" zaid="63157"/>
|
||||
<ace_table alias="Gd-152.71c" awr="150.615" location="1" name="64152.71c" path="293.6K/Gd_152_293.6K.ace" temperature="2.53e-08" zaid="64152"/>
|
||||
<ace_table alias="Gd-153.71c" awr="151.608" location="1" name="64153.71c" path="293.6K/Gd_153_293.6K.ace" temperature="2.53e-08" zaid="64153"/>
|
||||
<ace_table alias="Gd-154.71c" awr="152.599" location="1" name="64154.71c" path="293.6K/Gd_154_293.6K.ace" temperature="2.53e-08" zaid="64154"/>
|
||||
<ace_table alias="Gd-155.71c" awr="153.592" location="1" name="64155.71c" path="293.6K/Gd_155_293.6K.ace" temperature="2.53e-08" zaid="64155"/>
|
||||
<ace_table alias="Gd-156.71c" awr="154.583" location="1" name="64156.71c" path="293.6K/Gd_156_293.6K.ace" temperature="2.53e-08" zaid="64156"/>
|
||||
<ace_table alias="Gd-157.71c" awr="155.576" location="1" name="64157.71c" path="293.6K/Gd_157_293.6K.ace" temperature="2.53e-08" zaid="64157"/>
|
||||
<ace_table alias="Gd-158.71c" awr="156.567" location="1" name="64158.71c" path="293.6K/Gd_158_293.6K.ace" temperature="2.53e-08" zaid="64158"/>
|
||||
<ace_table alias="Gd-160.71c" awr="158.553" location="1" name="64160.71c" path="293.6K/Gd_160_293.6K.ace" temperature="2.53e-08" zaid="64160"/>
|
||||
<ace_table alias="Tb-159.71c" awr="157.56" location="1" name="65159.71c" path="293.6K/Tb_159_293.6K.ace" temperature="2.53e-08" zaid="65159"/>
|
||||
<ace_table alias="Tb-160.71c" awr="158.553" location="1" name="65160.71c" path="293.6K/Tb_160_293.6K.ace" temperature="2.53e-08" zaid="65160"/>
|
||||
<ace_table alias="Dy-156.71c" awr="154.585" location="1" name="66156.71c" path="293.6K/Dy_156_293.6K.ace" temperature="2.53e-08" zaid="66156"/>
|
||||
<ace_table alias="Dy-158.71c" awr="156.568" location="1" name="66158.71c" path="293.6K/Dy_158_293.6K.ace" temperature="2.53e-08" zaid="66158"/>
|
||||
<ace_table alias="Dy-160.71c" awr="158.551" location="1" name="66160.71c" path="293.6K/Dy_160_293.6K.ace" temperature="2.53e-08" zaid="66160"/>
|
||||
<ace_table alias="Dy-161.71c" awr="159.544" location="1" name="66161.71c" path="293.6K/Dy_161_293.6K.ace" temperature="2.53e-08" zaid="66161"/>
|
||||
<ace_table alias="Dy-162.71c" awr="160.536" location="1" name="66162.71c" path="293.6K/Dy_162_293.6K.ace" temperature="2.53e-08" zaid="66162"/>
|
||||
<ace_table alias="Dy-163.71c" awr="161.529" location="1" name="66163.71c" path="293.6K/Dy_163_293.6K.ace" temperature="2.53e-08" zaid="66163"/>
|
||||
<ace_table alias="Dy-164.71c" awr="162.521" location="1" name="66164.71c" path="293.6K/Dy_164_293.6K.ace" temperature="2.53e-08" zaid="66164"/>
|
||||
<ace_table alias="Ho-165.71c" awr="163.513" location="1" name="67165.71c" path="293.6K/Ho_165_293.6K.ace" temperature="2.53e-08" zaid="67165"/>
|
||||
<ace_table alias="Ho-166m.71c" awr="164.507" location="1" metastable="1" name="67566.71c" path="293.6K/Ho_166m1_293.6K.ace" temperature="2.53e-08" zaid="67566"/>
|
||||
<ace_table alias="Er-162.71c" awr="160.538" location="1" name="68162.71c" path="293.6K/Er_162_293.6K.ace" temperature="2.53e-08" zaid="68162"/>
|
||||
<ace_table alias="Er-164.71c" awr="162.521" location="1" name="68164.71c" path="293.6K/Er_164_293.6K.ace" temperature="2.53e-08" zaid="68164"/>
|
||||
<ace_table alias="Er-166.71c" awr="164.505" location="1" name="68166.71c" path="293.6K/Er_166_293.6K.ace" temperature="2.53e-08" zaid="68166"/>
|
||||
<ace_table alias="Er-167.71c" awr="165.498" location="1" name="68167.71c" path="293.6K/Er_167_293.6K.ace" temperature="2.53e-08" zaid="68167"/>
|
||||
<ace_table alias="Er-168.71c" awr="166.487" location="1" name="68168.71c" path="293.6K/Er_168_293.6K.ace" temperature="2.53e-08" zaid="68168"/>
|
||||
<ace_table alias="Er-170.71c" awr="168.476" location="1" name="68170.71c" path="293.6K/Er_170_293.6K.ace" temperature="2.53e-08" zaid="68170"/>
|
||||
<ace_table alias="Tm-168.71c" awr="166.492" location="1" name="69168.71c" path="293.6K/Tm_168_293.6K.ace" temperature="2.53e-08" zaid="69168"/>
|
||||
<ace_table alias="Tm-169.71c" awr="167.483" location="1" name="69169.71c" path="293.6K/Tm_169_293.6K.ace" temperature="2.53e-08" zaid="69169"/>
|
||||
<ace_table alias="Tm-170.71c" awr="168.476" location="1" name="69170.71c" path="293.6K/Tm_170_293.6K.ace" temperature="2.53e-08" zaid="69170"/>
|
||||
<ace_table alias="Lu-175.71c" awr="173.438" location="1" name="71175.71c" path="293.6K/Lu_175_293.6K.ace" temperature="2.53e-08" zaid="71175"/>
|
||||
<ace_table alias="Lu-176.71c" awr="174.43" location="1" name="71176.71c" path="293.6K/Lu_176_293.6K.ace" temperature="2.53e-08" zaid="71176"/>
|
||||
<ace_table alias="Hf-174.71c" awr="172.446" location="1" name="72174.71c" path="293.6K/Hf_174_293.6K.ace" temperature="2.53e-08" zaid="72174"/>
|
||||
<ace_table alias="Hf-176.71c" awr="174.429" location="1" name="72176.71c" path="293.6K/Hf_176_293.6K.ace" temperature="2.53e-08" zaid="72176"/>
|
||||
<ace_table alias="Hf-177.71c" awr="175.42" location="1" name="72177.71c" path="293.6K/Hf_177_293.6K.ace" temperature="2.53e-08" zaid="72177"/>
|
||||
<ace_table alias="Hf-178.71c" awr="176.411" location="1" name="72178.71c" path="293.6K/Hf_178_293.6K.ace" temperature="2.53e-08" zaid="72178"/>
|
||||
<ace_table alias="Hf-179.71c" awr="177.413" location="1" name="72179.71c" path="293.6K/Hf_179_293.6K.ace" temperature="2.53e-08" zaid="72179"/>
|
||||
<ace_table alias="Hf-180.71c" awr="178.404" location="1" name="72180.71c" path="293.6K/Hf_180_293.6K.ace" temperature="2.53e-08" zaid="72180"/>
|
||||
<ace_table alias="Ta-180.71c" awr="178.4016" location="1" name="73180.71c" path="293.6K/Ta_180_293.6K.ace" temperature="2.53e-08" zaid="73180"/>
|
||||
<ace_table alias="Ta-181.71c" awr="179.3936" location="1" name="73181.71c" path="293.6K/Ta_181_293.6K.ace" temperature="2.53e-08" zaid="73181"/>
|
||||
<ace_table alias="Ta-182.71c" awr="180.387" location="1" name="73182.71c" path="293.6K/Ta_182_293.6K.ace" temperature="2.53e-08" zaid="73182"/>
|
||||
<ace_table alias="W-180.71c" awr="178.401" location="1" name="74180.71c" path="293.6K/W_180_293.6K.ace" temperature="2.53e-08" zaid="74180"/>
|
||||
<ace_table alias="W-182.71c" awr="180.385" location="1" name="74182.71c" path="293.6K/W_182_293.6K.ace" temperature="2.53e-08" zaid="74182"/>
|
||||
<ace_table alias="W-183.71c" awr="181.379" location="1" name="74183.71c" path="293.6K/W_183_293.6K.ace" temperature="2.53e-08" zaid="74183"/>
|
||||
<ace_table alias="W-184.71c" awr="182.371" location="1" name="74184.71c" path="293.6K/W_184_293.6K.ace" temperature="2.53e-08" zaid="74184"/>
|
||||
<ace_table alias="W-186.71c" awr="184.357" location="1" name="74186.71c" path="293.6K/W_186_293.6K.ace" temperature="2.53e-08" zaid="74186"/>
|
||||
<ace_table alias="Re-185.71c" awr="183.3641" location="1" name="75185.71c" path="293.6K/Re_185_293.6K.ace" temperature="2.53e-08" zaid="75185"/>
|
||||
<ace_table alias="Re-187.71c" awr="185.3497" location="1" name="75187.71c" path="293.6K/Re_187_293.6K.ace" temperature="2.53e-08" zaid="75187"/>
|
||||
<ace_table alias="Ir-191.71c" awr="189.32" location="1" name="77191.71c" path="293.6K/Ir_191_293.6K.ace" temperature="2.53e-08" zaid="77191"/>
|
||||
<ace_table alias="Ir-193.71c" awr="191.305" location="1" name="77193.71c" path="293.6K/Ir_193_293.6K.ace" temperature="2.53e-08" zaid="77193"/>
|
||||
<ace_table alias="Au-197.71c" awr="195.274" location="1" name="79197.71c" path="293.6K/Au_197_293.6K.ace" temperature="2.53e-08" zaid="79197"/>
|
||||
<ace_table alias="Hg-196.71c" awr="194.282" location="1" name="80196.71c" path="293.6K/Hg_196_293.6K.ace" temperature="2.53e-08" zaid="80196"/>
|
||||
<ace_table alias="Hg-198.71c" awr="196.266" location="1" name="80198.71c" path="293.6K/Hg_198_293.6K.ace" temperature="2.53e-08" zaid="80198"/>
|
||||
<ace_table alias="Hg-199.71c" awr="197.259" location="1" name="80199.71c" path="293.6K/Hg_199_293.6K.ace" temperature="2.53e-08" zaid="80199"/>
|
||||
<ace_table alias="Hg-200.71c" awr="198.25" location="1" name="80200.71c" path="293.6K/Hg_200_293.6K.ace" temperature="2.53e-08" zaid="80200"/>
|
||||
<ace_table alias="Hg-201.71c" awr="199.244" location="1" name="80201.71c" path="293.6K/Hg_201_293.6K.ace" temperature="2.53e-08" zaid="80201"/>
|
||||
<ace_table alias="Hg-202.71c" awr="200.236" location="1" name="80202.71c" path="293.6K/Hg_202_293.6K.ace" temperature="2.53e-08" zaid="80202"/>
|
||||
<ace_table alias="Hg-204.71c" awr="202.221" location="1" name="80204.71c" path="293.6K/Hg_204_293.6K.ace" temperature="2.53e-08" zaid="80204"/>
|
||||
<ace_table alias="Tl-203.71c" awr="201.229" location="1" name="81203.71c" path="293.6K/Tl_203_293.6K.ace" temperature="2.53e-08" zaid="81203"/>
|
||||
<ace_table alias="Tl-205.71c" awr="203.214" location="1" name="81205.71c" path="293.6K/Tl_205_293.6K.ace" temperature="2.53e-08" zaid="81205"/>
|
||||
<ace_table alias="Pb-204.71c" awr="202.2208" location="1" name="82204.71c" path="293.6K/Pb_204_293.6K.ace" temperature="2.53e-08" zaid="82204"/>
|
||||
<ace_table alias="Pb-206.71c" awr="204.205" location="1" name="82206.71c" path="293.6K/Pb_206_293.6K.ace" temperature="2.53e-08" zaid="82206"/>
|
||||
<ace_table alias="Pb-207.71c" awr="205.1979" location="1" name="82207.71c" path="293.6K/Pb_207_293.6K.ace" temperature="2.53e-08" zaid="82207"/>
|
||||
<ace_table alias="Pb-208.71c" awr="206.19" location="1" name="82208.71c" path="293.6K/Pb_208_293.6K.ace" temperature="2.53e-08" zaid="82208"/>
|
||||
<ace_table alias="Bi-209.71c" awr="207.185" location="1" name="83209.71c" path="293.6K/Bi_209_293.6K.ace" temperature="2.53e-08" zaid="83209"/>
|
||||
<ace_table alias="Ra-223.71c" awr="221.103" location="1" name="88223.71c" path="293.6K/Ra_223_293.6K.ace" temperature="2.53e-08" zaid="88223"/>
|
||||
<ace_table alias="Ra-224.71c" awr="222.096" location="1" name="88224.71c" path="293.6K/Ra_224_293.6K.ace" temperature="2.53e-08" zaid="88224"/>
|
||||
<ace_table alias="Ra-225.71c" awr="223.091" location="1" name="88225.71c" path="293.6K/Ra_225_293.6K.ace" temperature="2.53e-08" zaid="88225"/>
|
||||
<ace_table alias="Ra-226.71c" awr="224.084" location="1" name="88226.71c" path="293.6K/Ra_226_293.6K.ace" temperature="2.53e-08" zaid="88226"/>
|
||||
<ace_table alias="Ac-225.71c" awr="223.09" location="1" name="89225.71c" path="293.6K/Ac_225_293.6K.ace" temperature="2.53e-08" zaid="89225"/>
|
||||
<ace_table alias="Ac-226.71c" awr="224.084" location="1" name="89226.71c" path="293.6K/Ac_226_293.6K.ace" temperature="2.53e-08" zaid="89226"/>
|
||||
<ace_table alias="Ac-227.71c" awr="225.077" location="1" name="89227.71c" path="293.6K/Ac_227_293.6K.ace" temperature="2.53e-08" zaid="89227"/>
|
||||
<ace_table alias="Th-227.71c" awr="225.077" location="1" name="90227.71c" path="293.6K/Th_227_293.6K.ace" temperature="2.53e-08" zaid="90227"/>
|
||||
<ace_table alias="Th-228.71c" awr="226.07" location="1" name="90228.71c" path="293.6K/Th_228_293.6K.ace" temperature="2.53e-08" zaid="90228"/>
|
||||
<ace_table alias="Th-229.71c" awr="227.064" location="1" name="90229.71c" path="293.6K/Th_229_293.6K.ace" temperature="2.53e-08" zaid="90229"/>
|
||||
<ace_table alias="Th-230.71c" awr="228.057" location="1" name="90230.71c" path="293.6K/Th_230_293.6K.ace" temperature="2.53e-08" zaid="90230"/>
|
||||
<ace_table alias="Th-231.71c" awr="229.052" location="1" name="90231.71c" path="293.6K/Th_231_293.6K.ace" temperature="2.53e-08" zaid="90231"/>
|
||||
<ace_table alias="Th-232.71c" awr="230.045" location="1" name="90232.71c" path="293.6K/Th_232_293.6K.ace" temperature="2.53e-08" zaid="90232"/>
|
||||
<ace_table alias="Th-233.71c" awr="231.04" location="1" name="90233.71c" path="293.6K/Th_233_293.6K.ace" temperature="2.53e-08" zaid="90233"/>
|
||||
<ace_table alias="Th-234.71c" awr="232.033" location="1" name="90234.71c" path="293.6K/Th_234_293.6K.ace" temperature="2.53e-08" zaid="90234"/>
|
||||
<ace_table alias="Pa-229.71c" awr="227.065" location="1" name="91229.71c" path="293.6K/Pa_229_293.6K.ace" temperature="2.53e-08" zaid="91229"/>
|
||||
<ace_table alias="Pa-230.71c" awr="228.058" location="1" name="91230.71c" path="293.6K/Pa_230_293.6K.ace" temperature="2.53e-08" zaid="91230"/>
|
||||
<ace_table alias="Pa-231.71c" awr="229.051" location="1" name="91231.71c" path="293.6K/Pa_231_293.6K.ace" temperature="2.53e-08" zaid="91231"/>
|
||||
<ace_table alias="Pa-232.71c" awr="230.045" location="1" name="91232.71c" path="293.6K/Pa_232_293.6K.ace" temperature="2.53e-08" zaid="91232"/>
|
||||
<ace_table alias="Pa-233.71c" awr="231.038" location="1" name="91233.71c" path="293.6K/Pa_233_293.6K.ace" temperature="2.53e-08" zaid="91233"/>
|
||||
<ace_table alias="U-230.71c" awr="228.058" location="1" name="92230.71c" path="293.6K/U_230_293.6K.ace" temperature="2.53e-08" zaid="92230"/>
|
||||
<ace_table alias="U-231.71c" awr="229.052" location="1" name="92231.71c" path="293.6K/U_231_293.6K.ace" temperature="2.53e-08" zaid="92231"/>
|
||||
<ace_table alias="U-232.71c" awr="230.044" location="1" name="92232.71c" path="293.6K/U_232_293.6K.ace" temperature="2.53e-08" zaid="92232"/>
|
||||
<ace_table alias="U-233.71c" awr="231.0377" location="1" name="92233.71c" path="293.6K/U_233_293.6K.ace" temperature="2.53e-08" zaid="92233"/>
|
||||
<ace_table alias="U-234.71c" awr="232.0304" location="1" name="92234.71c" path="293.6K/U_234_293.6K.ace" temperature="2.53e-08" zaid="92234"/>
|
||||
<ace_table alias="U-235.71c" awr="233.0248" location="1" name="92235.71c" path="293.6K/U_235_293.6K.ace" temperature="2.53e-08" zaid="92235"/>
|
||||
<ace_table alias="U-236.71c" awr="234.0178" location="1" name="92236.71c" path="293.6K/U_236_293.6K.ace" temperature="2.53e-08" zaid="92236"/>
|
||||
<ace_table alias="U-237.71c" awr="235.0124" location="1" name="92237.71c" path="293.6K/U_237_293.6K.ace" temperature="2.53e-08" zaid="92237"/>
|
||||
<ace_table alias="U-238.71c" awr="236.0058" location="1" name="92238.71c" path="293.6K/U_238_293.6K.ace" temperature="2.53e-08" zaid="92238"/>
|
||||
<ace_table alias="U-239.71c" awr="237.0007" location="1" name="92239.71c" path="293.6K/U_239_293.6K.ace" temperature="2.53e-08" zaid="92239"/>
|
||||
<ace_table alias="U-240.71c" awr="237.9944" location="1" name="92240.71c" path="293.6K/U_240_293.6K.ace" temperature="2.53e-08" zaid="92240"/>
|
||||
<ace_table alias="U-241.71c" awr="238.9895" location="1" name="92241.71c" path="293.6K/U_241_293.6K.ace" temperature="2.53e-08" zaid="92241"/>
|
||||
<ace_table alias="Np-234.71c" awr="232.032" location="1" name="93234.71c" path="293.6K/Np_234_293.6K.ace" temperature="2.53e-08" zaid="93234"/>
|
||||
<ace_table alias="Np-235.71c" awr="233.025" location="1" name="93235.71c" path="293.6K/Np_235_293.6K.ace" temperature="2.53e-08" zaid="93235"/>
|
||||
<ace_table alias="Np-236.71c" awr="234.019" location="1" name="93236.71c" path="293.6K/Np_236_293.6K.ace" temperature="2.53e-08" zaid="93236"/>
|
||||
<ace_table alias="Np-237.71c" awr="235.0118" location="1" name="93237.71c" path="293.6K/Np_237_293.6K.ace" temperature="2.53e-08" zaid="93237"/>
|
||||
<ace_table alias="Np-238.71c" awr="236.006" location="1" name="93238.71c" path="293.6K/Np_238_293.6K.ace" temperature="2.53e-08" zaid="93238"/>
|
||||
<ace_table alias="Np-239.71c" awr="236.999" location="1" name="93239.71c" path="293.6K/Np_239_293.6K.ace" temperature="2.53e-08" zaid="93239"/>
|
||||
<ace_table alias="Pu-236.71c" awr="234.018" location="1" name="94236.71c" path="293.6K/Pu_236_293.6K.ace" temperature="2.53e-08" zaid="94236"/>
|
||||
<ace_table alias="Pu-237.71c" awr="235.012" location="1" name="94237.71c" path="293.6K/Pu_237_293.6K.ace" temperature="2.53e-08" zaid="94237"/>
|
||||
<ace_table alias="Pu-238.71c" awr="236.0046" location="1" name="94238.71c" path="293.6K/Pu_238_293.6K.ace" temperature="2.53e-08" zaid="94238"/>
|
||||
<ace_table alias="Pu-239.71c" awr="236.9986" location="1" name="94239.71c" path="293.6K/Pu_239_293.6K.ace" temperature="2.53e-08" zaid="94239"/>
|
||||
<ace_table alias="Pu-240.71c" awr="237.9916" location="1" name="94240.71c" path="293.6K/Pu_240_293.6K.ace" temperature="2.53e-08" zaid="94240"/>
|
||||
<ace_table alias="Pu-241.71c" awr="238.978" location="1" name="94241.71c" path="293.6K/Pu_241_293.6K.ace" temperature="2.53e-08" zaid="94241"/>
|
||||
<ace_table alias="Pu-242.71c" awr="239.979" location="1" name="94242.71c" path="293.6K/Pu_242_293.6K.ace" temperature="2.53e-08" zaid="94242"/>
|
||||
<ace_table alias="Pu-243.71c" awr="240.974" location="1" name="94243.71c" path="293.6K/Pu_243_293.6K.ace" temperature="2.53e-08" zaid="94243"/>
|
||||
<ace_table alias="Pu-244.71c" awr="241.967" location="1" name="94244.71c" path="293.6K/Pu_244_293.6K.ace" temperature="2.53e-08" zaid="94244"/>
|
||||
<ace_table alias="Pu-246.71c" awr="243.956" location="1" name="94246.71c" path="293.6K/Pu_246_293.6K.ace" temperature="2.53e-08" zaid="94246"/>
|
||||
<ace_table alias="Am-240.71c" awr="237.993" location="1" name="95240.71c" path="293.6K/Am_240_293.6K.ace" temperature="2.53e-08" zaid="95240"/>
|
||||
<ace_table alias="Am-241.71c" awr="238.986" location="1" name="95241.71c" path="293.6K/Am_241_293.6K.ace" temperature="2.53e-08" zaid="95241"/>
|
||||
<ace_table alias="Am-242.71c" awr="239.9801" location="1" name="95242.71c" path="293.6K/Am_242_293.6K.ace" temperature="2.53e-08" zaid="95242"/>
|
||||
<ace_table alias="Am-242m.71c" awr="239.9801" location="1" metastable="1" name="95642.71c" path="293.6K/Am_242m1_293.6K.ace" temperature="2.53e-08" zaid="95642"/>
|
||||
<ace_table alias="Am-243.71c" awr="240.9734" location="1" name="95243.71c" path="293.6K/Am_243_293.6K.ace" temperature="2.53e-08" zaid="95243"/>
|
||||
<ace_table alias="Am-244.71c" awr="241.968" location="1" name="95244.71c" path="293.6K/Am_244_293.6K.ace" temperature="2.53e-08" zaid="95244"/>
|
||||
<ace_table alias="Am-244m.71c" awr="241.968" location="1" metastable="1" name="95644.71c" path="293.6K/Am_244m1_293.6K.ace" temperature="2.53e-08" zaid="95644"/>
|
||||
<ace_table alias="Cm-240.71c" awr="237.993" location="1" name="96240.71c" path="293.6K/Cm_240_293.6K.ace" temperature="2.53e-08" zaid="96240"/>
|
||||
<ace_table alias="Cm-241.71c" awr="238.987" location="1" name="96241.71c" path="293.6K/Cm_241_293.6K.ace" temperature="2.53e-08" zaid="96241"/>
|
||||
<ace_table alias="Cm-242.71c" awr="239.979" location="1" name="96242.71c" path="293.6K/Cm_242_293.6K.ace" temperature="2.53e-08" zaid="96242"/>
|
||||
<ace_table alias="Cm-243.71c" awr="240.973" location="1" name="96243.71c" path="293.6K/Cm_243_293.6K.ace" temperature="2.53e-08" zaid="96243"/>
|
||||
<ace_table alias="Cm-244.71c" awr="241.966" location="1" name="96244.71c" path="293.6K/Cm_244_293.6K.ace" temperature="2.53e-08" zaid="96244"/>
|
||||
<ace_table alias="Cm-245.71c" awr="242.96" location="1" name="96245.71c" path="293.6K/Cm_245_293.6K.ace" temperature="2.53e-08" zaid="96245"/>
|
||||
<ace_table alias="Cm-246.71c" awr="243.953" location="1" name="96246.71c" path="293.6K/Cm_246_293.6K.ace" temperature="2.53e-08" zaid="96246"/>
|
||||
<ace_table alias="Cm-247.71c" awr="244.948" location="1" name="96247.71c" path="293.6K/Cm_247_293.6K.ace" temperature="2.53e-08" zaid="96247"/>
|
||||
<ace_table alias="Cm-248.71c" awr="245.941" location="1" name="96248.71c" path="293.6K/Cm_248_293.6K.ace" temperature="2.53e-08" zaid="96248"/>
|
||||
<ace_table alias="Cm-249.71c" awr="246.936" location="1" name="96249.71c" path="293.6K/Cm_249_293.6K.ace" temperature="2.53e-08" zaid="96249"/>
|
||||
<ace_table alias="Cm-250.71c" awr="247.93" location="1" name="96250.71c" path="293.6K/Cm_250_293.6K.ace" temperature="2.53e-08" zaid="96250"/>
|
||||
<ace_table alias="Bk-245.71c" awr="242.961" location="1" name="97245.71c" path="293.6K/Bk_245_293.6K.ace" temperature="2.53e-08" zaid="97245"/>
|
||||
<ace_table alias="Bk-246.71c" awr="243.955" location="1" name="97246.71c" path="293.6K/Bk_246_293.6K.ace" temperature="2.53e-08" zaid="97246"/>
|
||||
<ace_table alias="Bk-247.71c" awr="244.948" location="1" name="97247.71c" path="293.6K/Bk_247_293.6K.ace" temperature="2.53e-08" zaid="97247"/>
|
||||
<ace_table alias="Bk-248.71c" awr="245.942" location="1" name="97248.71c" path="293.6K/Bk_248_293.6K.ace" temperature="2.53e-08" zaid="97248"/>
|
||||
<ace_table alias="Bk-249.71c" awr="246.935" location="1" name="97249.71c" path="293.6K/Bk_249_293.6K.ace" temperature="2.53e-08" zaid="97249"/>
|
||||
<ace_table alias="Bk-250.71c" awr="247.93" location="1" name="97250.71c" path="293.6K/Bk_250_293.6K.ace" temperature="2.53e-08" zaid="97250"/>
|
||||
<ace_table alias="Cf-246.71c" awr="243.955" location="1" name="98246.71c" path="293.6K/Cf_246_293.6K.ace" temperature="2.53e-08" zaid="98246"/>
|
||||
<ace_table alias="Cf-248.71c" awr="245.941" location="1" name="98248.71c" path="293.6K/Cf_248_293.6K.ace" temperature="2.53e-08" zaid="98248"/>
|
||||
<ace_table alias="Cf-249.71c" awr="246.935" location="1" name="98249.71c" path="293.6K/Cf_249_293.6K.ace" temperature="2.53e-08" zaid="98249"/>
|
||||
<ace_table alias="Cf-250.71c" awr="247.928" location="1" name="98250.71c" path="293.6K/Cf_250_293.6K.ace" temperature="2.53e-08" zaid="98250"/>
|
||||
<ace_table alias="Cf-251.71c" awr="248.923" location="1" name="98251.71c" path="293.6K/Cf_251_293.6K.ace" temperature="2.53e-08" zaid="98251"/>
|
||||
<ace_table alias="Cf-252.71c" awr="249.916" location="1" name="98252.71c" path="293.6K/Cf_252_293.6K.ace" temperature="2.53e-08" zaid="98252"/>
|
||||
<ace_table alias="Cf-253.71c" awr="250.911" location="1" name="98253.71c" path="293.6K/Cf_253_293.6K.ace" temperature="2.53e-08" zaid="98253"/>
|
||||
<ace_table alias="Cf-254.71c" awr="251.905" location="1" name="98254.71c" path="293.6K/Cf_254_293.6K.ace" temperature="2.53e-08" zaid="98254"/>
|
||||
<ace_table alias="Es-251.71c" awr="248.923" location="1" name="99251.71c" path="293.6K/Es_251_293.6K.ace" temperature="2.53e-08" zaid="99251"/>
|
||||
<ace_table alias="Es-252.71c" awr="249.917" location="1" name="99252.71c" path="293.6K/Es_252_293.6K.ace" temperature="2.53e-08" zaid="99252"/>
|
||||
<ace_table alias="Es-253.71c" awr="250.911" location="1" name="99253.71c" path="293.6K/Es_253_293.6K.ace" temperature="2.53e-08" zaid="99253"/>
|
||||
<ace_table alias="Es-254.71c" awr="251.905" location="1" name="99254.71c" path="293.6K/Es_254_293.6K.ace" temperature="2.53e-08" zaid="99254"/>
|
||||
<ace_table alias="Es-254m.71c" awr="251.905" location="1" metastable="1" name="99654.71c" path="293.6K/Es_254m1_293.6K.ace" temperature="2.53e-08" zaid="99654"/>
|
||||
<ace_table alias="Es-255.71c" awr="252.899" location="1" name="99255.71c" path="293.6K/Es_255_293.6K.ace" temperature="2.53e-08" zaid="99255"/>
|
||||
<ace_table alias="Fm-255.71c" awr="252.899" location="1" name="100255.71c" path="293.6K/Fm_255_293.6K.ace" temperature="2.53e-08" zaid="100255"/>
|
||||
<ace_table alias="H-1.72c" awr="0.999167" location="1" name="1001.72c" path="300K/H_001_300K.ace" temperature="2.585e-08" zaid="1001"/>
|
||||
<ace_table alias="H-2.72c" awr="1.9968" location="1" name="1002.72c" path="300K/H_002_300K.ace" temperature="2.585e-08" zaid="1002"/>
|
||||
<ace_table alias="H-3.72c" awr="2.989596" location="1" name="1003.72c" path="300K/H_003_300K.ace" temperature="2.585e-08" zaid="1003"/>
|
||||
<ace_table alias="He-3.72c" awr="2.989032" location="1" name="2003.72c" path="300K/He_003_300K.ace" temperature="2.585e-08" zaid="2003"/>
|
||||
<ace_table alias="He-4.72c" awr="3.968219" location="1" name="2004.72c" path="300K/He_004_300K.ace" temperature="2.585e-08" zaid="2004"/>
|
||||
<ace_table alias="Li-6.72c" awr="5.9634" location="1" name="3006.72c" path="300K/Li_006_300K.ace" temperature="2.585e-08" zaid="3006"/>
|
||||
<ace_table alias="Li-7.72c" awr="6.955732" location="1" name="3007.72c" path="300K/Li_007_300K.ace" temperature="2.585e-08" zaid="3007"/>
|
||||
<ace_table alias="Be-7.72c" awr="6.9545" location="1" name="4007.72c" path="300K/Be_007_300K.ace" temperature="2.585e-08" zaid="4007"/>
|
||||
<ace_table alias="Be-9.72c" awr="8.93478" location="1" name="4009.72c" path="300K/Be_009_300K.ace" temperature="2.585e-08" zaid="4009"/>
|
||||
<ace_table alias="B-10.72c" awr="9.926921" location="1" name="5010.72c" path="300K/B_010_300K.ace" temperature="2.585e-08" zaid="5010"/>
|
||||
<ace_table alias="B-11.72c" awr="10.9147" location="1" name="5011.72c" path="300K/B_011_300K.ace" temperature="2.585e-08" zaid="5011"/>
|
||||
<ace_table alias="C-Nat.72c" awr="11.898" location="1" name="6000.72c" path="300K/C_000_300K.ace" temperature="2.585e-08" zaid="6000"/>
|
||||
<ace_table alias="N-14.72c" awr="13.88278" location="1" name="7014.72c" path="300K/N_014_300K.ace" temperature="2.585e-08" zaid="7014"/>
|
||||
<ace_table alias="N-15.72c" awr="14.871" location="1" name="7015.72c" path="300K/N_015_300K.ace" temperature="2.585e-08" zaid="7015"/>
|
||||
<ace_table alias="O-16.72c" awr="15.85751" location="1" name="8016.72c" path="300K/O_016_300K.ace" temperature="2.585e-08" zaid="8016"/>
|
||||
<ace_table alias="O-17.72c" awr="16.8531" location="1" name="8017.72c" path="300K/O_017_300K.ace" temperature="2.585e-08" zaid="8017"/>
|
||||
<ace_table alias="F-19.72c" awr="18.835" location="1" name="9019.72c" path="300K/F_019_300K.ace" temperature="2.585e-08" zaid="9019"/>
|
||||
<ace_table alias="Na-22.72c" awr="21.8055" location="1" name="11022.72c" path="300K/Na_022_300K.ace" temperature="2.585e-08" zaid="11022"/>
|
||||
<ace_table alias="Na-23.72c" awr="22.792" location="1" name="11023.72c" path="300K/Na_023_300K.ace" temperature="2.585e-08" zaid="11023"/>
|
||||
<ace_table alias="Mg-24.72c" awr="23.779" location="1" name="12024.72c" path="300K/Mg_024_300K.ace" temperature="2.585e-08" zaid="12024"/>
|
||||
<ace_table alias="Mg-25.72c" awr="24.7712" location="1" name="12025.72c" path="300K/Mg_025_300K.ace" temperature="2.585e-08" zaid="12025"/>
|
||||
<ace_table alias="Mg-26.72c" awr="25.7594" location="1" name="12026.72c" path="300K/Mg_026_300K.ace" temperature="2.585e-08" zaid="12026"/>
|
||||
<ace_table alias="Al-27.72c" awr="26.74975" location="1" name="13027.72c" path="300K/Al_027_300K.ace" temperature="2.585e-08" zaid="13027"/>
|
||||
<ace_table alias="Si-28.72c" awr="27.737" location="1" name="14028.72c" path="300K/Si_028_300K.ace" temperature="2.585e-08" zaid="14028"/>
|
||||
<ace_table alias="Si-29.72c" awr="28.728" location="1" name="14029.72c" path="300K/Si_029_300K.ace" temperature="2.585e-08" zaid="14029"/>
|
||||
<ace_table alias="Si-30.72c" awr="29.716" location="1" name="14030.72c" path="300K/Si_030_300K.ace" temperature="2.585e-08" zaid="14030"/>
|
||||
<ace_table alias="P-31.72c" awr="30.708" location="1" name="15031.72c" path="300K/P_031_300K.ace" temperature="2.585e-08" zaid="15031"/>
|
||||
<ace_table alias="S-32.72c" awr="31.6973" location="1" name="16032.72c" path="300K/S_032_300K.ace" temperature="2.585e-08" zaid="16032"/>
|
||||
<ace_table alias="S-33.72c" awr="32.6878" location="1" name="16033.72c" path="300K/S_033_300K.ace" temperature="2.585e-08" zaid="16033"/>
|
||||
<ace_table alias="S-34.72c" awr="33.6762" location="1" name="16034.72c" path="300K/S_034_300K.ace" temperature="2.585e-08" zaid="16034"/>
|
||||
<ace_table alias="S-36.72c" awr="35.658" location="1" name="16036.72c" path="300K/S_036_300K.ace" temperature="2.585e-08" zaid="16036"/>
|
||||
<ace_table alias="Cl-35.72c" awr="34.66845" location="1" name="17035.72c" path="300K/Cl_035_300K.ace" temperature="2.585e-08" zaid="17035"/>
|
||||
<ace_table alias="Cl-37.72c" awr="36.6483" location="1" name="17037.72c" path="300K/Cl_037_300K.ace" temperature="2.585e-08" zaid="17037"/>
|
||||
<ace_table alias="Ar-36.72c" awr="35.6585" location="1" name="18036.72c" path="300K/Ar_036_300K.ace" temperature="2.585e-08" zaid="18036"/>
|
||||
<ace_table alias="Ar-38.72c" awr="37.6366" location="1" name="18038.72c" path="300K/Ar_038_300K.ace" temperature="2.585e-08" zaid="18038"/>
|
||||
<ace_table alias="Ar-40.72c" awr="39.6191" location="1" name="18040.72c" path="300K/Ar_040_300K.ace" temperature="2.585e-08" zaid="18040"/>
|
||||
<ace_table alias="K-39.72c" awr="38.6293" location="1" name="19039.72c" path="300K/K_039_300K.ace" temperature="2.585e-08" zaid="19039"/>
|
||||
<ace_table alias="K-40.72c" awr="39.6207" location="1" name="19040.72c" path="300K/K_040_300K.ace" temperature="2.585e-08" zaid="19040"/>
|
||||
<ace_table alias="K-41.72c" awr="40.6101" location="1" name="19041.72c" path="300K/K_041_300K.ace" temperature="2.585e-08" zaid="19041"/>
|
||||
<ace_table alias="Ca-40.72c" awr="39.6193" location="1" name="20040.72c" path="300K/Ca_040_300K.ace" temperature="2.585e-08" zaid="20040"/>
|
||||
<ace_table alias="Ca-42.72c" awr="41.59818" location="1" name="20042.72c" path="300K/Ca_042_300K.ace" temperature="2.585e-08" zaid="20042"/>
|
||||
<ace_table alias="Ca-43.72c" awr="42.58973" location="1" name="20043.72c" path="300K/Ca_043_300K.ace" temperature="2.585e-08" zaid="20043"/>
|
||||
<ace_table alias="Ca-44.72c" awr="43.57788" location="1" name="20044.72c" path="300K/Ca_044_300K.ace" temperature="2.585e-08" zaid="20044"/>
|
||||
<ace_table alias="Ca-46.72c" awr="45.55893" location="1" name="20046.72c" path="300K/Ca_046_300K.ace" temperature="2.585e-08" zaid="20046"/>
|
||||
<ace_table alias="Ca-48.72c" awr="47.5406" location="1" name="20048.72c" path="300K/Ca_048_300K.ace" temperature="2.585e-08" zaid="20048"/>
|
||||
<ace_table alias="Sc-45.72c" awr="44.5679" location="1" name="21045.72c" path="300K/Sc_045_300K.ace" temperature="2.585e-08" zaid="21045"/>
|
||||
<ace_table alias="Ti-46.72c" awr="45.5579" location="1" name="22046.72c" path="300K/Ti_046_300K.ace" temperature="2.585e-08" zaid="22046"/>
|
||||
<ace_table alias="Ti-47.72c" awr="46.5484" location="1" name="22047.72c" path="300K/Ti_047_300K.ace" temperature="2.585e-08" zaid="22047"/>
|
||||
<ace_table alias="Ti-48.72c" awr="47.5361" location="1" name="22048.72c" path="300K/Ti_048_300K.ace" temperature="2.585e-08" zaid="22048"/>
|
||||
<ace_table alias="Ti-49.72c" awr="48.5274" location="1" name="22049.72c" path="300K/Ti_049_300K.ace" temperature="2.585e-08" zaid="22049"/>
|
||||
<ace_table alias="Ti-50.72c" awr="49.5157" location="1" name="22050.72c" path="300K/Ti_050_300K.ace" temperature="2.585e-08" zaid="22050"/>
|
||||
<ace_table alias="V-50.72c" awr="49.5181" location="1" name="23050.72c" path="300K/V_050_300K.ace" temperature="2.585e-08" zaid="23050"/>
|
||||
<ace_table alias="V-51.72c" awr="50.5063" location="1" name="23051.72c" path="300K/V_051_300K.ace" temperature="2.585e-08" zaid="23051"/>
|
||||
<ace_table alias="Cr-50.72c" awr="49.517" location="1" name="24050.72c" path="300K/Cr_050_300K.ace" temperature="2.585e-08" zaid="24050"/>
|
||||
<ace_table alias="Cr-52.72c" awr="51.494" location="1" name="24052.72c" path="300K/Cr_052_300K.ace" temperature="2.585e-08" zaid="24052"/>
|
||||
<ace_table alias="Cr-53.72c" awr="52.486" location="1" name="24053.72c" path="300K/Cr_053_300K.ace" temperature="2.585e-08" zaid="24053"/>
|
||||
<ace_table alias="Cr-54.72c" awr="53.476" location="1" name="24054.72c" path="300K/Cr_054_300K.ace" temperature="2.585e-08" zaid="24054"/>
|
||||
<ace_table alias="Mn-55.72c" awr="54.4661" location="1" name="25055.72c" path="300K/Mn_055_300K.ace" temperature="2.585e-08" zaid="25055"/>
|
||||
<ace_table alias="Fe-54.72c" awr="53.476" location="1" name="26054.72c" path="300K/Fe_054_300K.ace" temperature="2.585e-08" zaid="26054"/>
|
||||
<ace_table alias="Fe-56.72c" awr="55.454" location="1" name="26056.72c" path="300K/Fe_056_300K.ace" temperature="2.585e-08" zaid="26056"/>
|
||||
<ace_table alias="Fe-57.72c" awr="56.446" location="1" name="26057.72c" path="300K/Fe_057_300K.ace" temperature="2.585e-08" zaid="26057"/>
|
||||
<ace_table alias="Fe-58.72c" awr="57.436" location="1" name="26058.72c" path="300K/Fe_058_300K.ace" temperature="2.585e-08" zaid="26058"/>
|
||||
<ace_table alias="Co-58.72c" awr="57.4381" location="1" name="27058.72c" path="300K/Co_058_300K.ace" temperature="2.585e-08" zaid="27058"/>
|
||||
<ace_table alias="Co-58m.72c" awr="57.4381" location="1" metastable="1" name="27458.72c" path="300K/Co_058m1_300K.ace" temperature="2.585e-08" zaid="27458"/>
|
||||
<ace_table alias="Co-59.72c" awr="58.4269" location="1" name="27059.72c" path="300K/Co_059_300K.ace" temperature="2.585e-08" zaid="27059"/>
|
||||
<ace_table alias="Ni-58.72c" awr="57.438" location="1" name="28058.72c" path="300K/Ni_058_300K.ace" temperature="2.585e-08" zaid="28058"/>
|
||||
<ace_table alias="Ni-59.72c" awr="58.4281" location="1" name="28059.72c" path="300K/Ni_059_300K.ace" temperature="2.585e-08" zaid="28059"/>
|
||||
<ace_table alias="Ni-60.72c" awr="59.416" location="1" name="28060.72c" path="300K/Ni_060_300K.ace" temperature="2.585e-08" zaid="28060"/>
|
||||
<ace_table alias="Ni-61.72c" awr="60.408" location="1" name="28061.72c" path="300K/Ni_061_300K.ace" temperature="2.585e-08" zaid="28061"/>
|
||||
<ace_table alias="Ni-62.72c" awr="61.396" location="1" name="28062.72c" path="300K/Ni_062_300K.ace" temperature="2.585e-08" zaid="28062"/>
|
||||
<ace_table alias="Ni-64.72c" awr="63.379" location="1" name="28064.72c" path="300K/Ni_064_300K.ace" temperature="2.585e-08" zaid="28064"/>
|
||||
<ace_table alias="Cu-63.72c" awr="62.389" location="1" name="29063.72c" path="300K/Cu_063_300K.ace" temperature="2.585e-08" zaid="29063"/>
|
||||
<ace_table alias="Cu-65.72c" awr="64.37" location="1" name="29065.72c" path="300K/Cu_065_300K.ace" temperature="2.585e-08" zaid="29065"/>
|
||||
<ace_table alias="Zn-64.72c" awr="63.38" location="1" name="30064.72c" path="300K/Zn_064_300K.ace" temperature="2.585e-08" zaid="30064"/>
|
||||
<ace_table alias="Zn-65.72c" awr="64.3715" location="1" name="30065.72c" path="300K/Zn_065_300K.ace" temperature="2.585e-08" zaid="30065"/>
|
||||
<ace_table alias="Zn-66.72c" awr="65.3597" location="1" name="30066.72c" path="300K/Zn_066_300K.ace" temperature="2.585e-08" zaid="30066"/>
|
||||
<ace_table alias="Zn-67.72c" awr="66.3522" location="1" name="30067.72c" path="300K/Zn_067_300K.ace" temperature="2.585e-08" zaid="30067"/>
|
||||
<ace_table alias="Zn-68.72c" awr="67.3413" location="1" name="30068.72c" path="300K/Zn_068_300K.ace" temperature="2.585e-08" zaid="30068"/>
|
||||
<ace_table alias="Zn-70.72c" awr="69.3246" location="1" name="30070.72c" path="300K/Zn_070_300K.ace" temperature="2.585e-08" zaid="30070"/>
|
||||
<ace_table alias="Ga-69.72c" awr="68.3336" location="1" name="31069.72c" path="300K/Ga_069_300K.ace" temperature="2.585e-08" zaid="31069"/>
|
||||
<ace_table alias="Ga-71.72c" awr="70.315" location="1" name="31071.72c" path="300K/Ga_071_300K.ace" temperature="2.585e-08" zaid="31071"/>
|
||||
<ace_table alias="Ge-70.72c" awr="69.3236" location="1" name="32070.72c" path="300K/Ge_070_300K.ace" temperature="2.585e-08" zaid="32070"/>
|
||||
<ace_table alias="Ge-72.72c" awr="71.3042" location="1" name="32072.72c" path="300K/Ge_072_300K.ace" temperature="2.585e-08" zaid="32072"/>
|
||||
<ace_table alias="Ge-73.72c" awr="72.297" location="1" name="32073.72c" path="300K/Ge_073_300K.ace" temperature="2.585e-08" zaid="32073"/>
|
||||
<ace_table alias="Ge-74.72c" awr="73.2862" location="1" name="32074.72c" path="300K/Ge_074_300K.ace" temperature="2.585e-08" zaid="32074"/>
|
||||
<ace_table alias="Ge-76.72c" awr="75.2692" location="1" name="32076.72c" path="300K/Ge_076_300K.ace" temperature="2.585e-08" zaid="32076"/>
|
||||
<ace_table alias="As-74.72c" awr="73.2889" location="1" name="33074.72c" path="300K/As_074_300K.ace" temperature="2.585e-08" zaid="33074"/>
|
||||
<ace_table alias="As-75.72c" awr="74.278" location="1" name="33075.72c" path="300K/As_075_300K.ace" temperature="2.585e-08" zaid="33075"/>
|
||||
<ace_table alias="Se-74.72c" awr="73.2875" location="1" name="34074.72c" path="300K/Se_074_300K.ace" temperature="2.585e-08" zaid="34074"/>
|
||||
<ace_table alias="Se-76.72c" awr="75.267" location="1" name="34076.72c" path="300K/Se_076_300K.ace" temperature="2.585e-08" zaid="34076"/>
|
||||
<ace_table alias="Se-77.72c" awr="76.2591" location="1" name="34077.72c" path="300K/Se_077_300K.ace" temperature="2.585e-08" zaid="34077"/>
|
||||
<ace_table alias="Se-78.72c" awr="77.2479" location="1" name="34078.72c" path="300K/Se_078_300K.ace" temperature="2.585e-08" zaid="34078"/>
|
||||
<ace_table alias="Se-79.72c" awr="78.2405" location="1" name="34079.72c" path="300K/Se_079_300K.ace" temperature="2.585e-08" zaid="34079"/>
|
||||
<ace_table alias="Se-80.72c" awr="79.23" location="1" name="34080.72c" path="300K/Se_080_300K.ace" temperature="2.585e-08" zaid="34080"/>
|
||||
<ace_table alias="Se-82.72c" awr="81.213" location="1" name="34082.72c" path="300K/Se_082_300K.ace" temperature="2.585e-08" zaid="34082"/>
|
||||
<ace_table alias="Br-79.72c" awr="78.2403" location="1" name="35079.72c" path="300K/Br_079_300K.ace" temperature="2.585e-08" zaid="35079"/>
|
||||
<ace_table alias="Br-81.72c" awr="80.2212" location="1" name="35081.72c" path="300K/Br_081_300K.ace" temperature="2.585e-08" zaid="35081"/>
|
||||
<ace_table alias="Kr-78.72c" awr="77.25099" location="1" name="36078.72c" path="300K/Kr_078_300K.ace" temperature="2.585e-08" zaid="36078"/>
|
||||
<ace_table alias="Kr-80.72c" awr="79.2299" location="1" name="36080.72c" path="300K/Kr_080_300K.ace" temperature="2.585e-08" zaid="36080"/>
|
||||
<ace_table alias="Kr-82.72c" awr="81.2098" location="1" name="36082.72c" path="300K/Kr_082_300K.ace" temperature="2.585e-08" zaid="36082"/>
|
||||
<ace_table alias="Kr-83.72c" awr="82.202" location="1" name="36083.72c" path="300K/Kr_083_300K.ace" temperature="2.585e-08" zaid="36083"/>
|
||||
<ace_table alias="Kr-84.72c" awr="83.1907" location="1" name="36084.72c" path="300K/Kr_084_300K.ace" temperature="2.585e-08" zaid="36084"/>
|
||||
<ace_table alias="Kr-85.72c" awr="84.1831" location="1" name="36085.72c" path="300K/Kr_085_300K.ace" temperature="2.585e-08" zaid="36085"/>
|
||||
<ace_table alias="Kr-86.72c" awr="85.1726" location="1" name="36086.72c" path="300K/Kr_086_300K.ace" temperature="2.585e-08" zaid="36086"/>
|
||||
<ace_table alias="Rb-85.72c" awr="84.1824" location="1" name="37085.72c" path="300K/Rb_085_300K.ace" temperature="2.585e-08" zaid="37085"/>
|
||||
<ace_table alias="Rb-86.72c" awr="85.1731" location="1" name="37086.72c" path="300K/Rb_086_300K.ace" temperature="2.585e-08" zaid="37086"/>
|
||||
<ace_table alias="Rb-87.72c" awr="86.1626" location="1" name="37087.72c" path="300K/Rb_087_300K.ace" temperature="2.585e-08" zaid="37087"/>
|
||||
<ace_table alias="Sr-84.72c" awr="83.1926" location="1" name="38084.72c" path="300K/Sr_084_300K.ace" temperature="2.585e-08" zaid="38084"/>
|
||||
<ace_table alias="Sr-86.72c" awr="85.1713" location="1" name="38086.72c" path="300K/Sr_086_300K.ace" temperature="2.585e-08" zaid="38086"/>
|
||||
<ace_table alias="Sr-87.72c" awr="86.1623" location="1" name="38087.72c" path="300K/Sr_087_300K.ace" temperature="2.585e-08" zaid="38087"/>
|
||||
<ace_table alias="Sr-88.72c" awr="87.15" location="1" name="38088.72c" path="300K/Sr_088_300K.ace" temperature="2.585e-08" zaid="38088"/>
|
||||
<ace_table alias="Sr-89.72c" awr="88.144" location="1" name="38089.72c" path="300K/Sr_089_300K.ace" temperature="2.585e-08" zaid="38089"/>
|
||||
<ace_table alias="Sr-90.72c" awr="89.1353" location="1" name="38090.72c" path="300K/Sr_090_300K.ace" temperature="2.585e-08" zaid="38090"/>
|
||||
<ace_table alias="Y-89.72c" awr="88.1421" location="1" name="39089.72c" path="300K/Y_089_300K.ace" temperature="2.585e-08" zaid="39089"/>
|
||||
<ace_table alias="Y-90.72c" awr="89.1348" location="1" name="39090.72c" path="300K/Y_090_300K.ace" temperature="2.585e-08" zaid="39090"/>
|
||||
<ace_table alias="Y-91.72c" awr="90.1264" location="1" name="39091.72c" path="300K/Y_091_300K.ace" temperature="2.585e-08" zaid="39091"/>
|
||||
<ace_table alias="Zr-90.72c" awr="89.1324" location="1" name="40090.72c" path="300K/Zr_090_300K.ace" temperature="2.585e-08" zaid="40090"/>
|
||||
<ace_table alias="Zr-91.72c" awr="90.1247" location="1" name="40091.72c" path="300K/Zr_091_300K.ace" temperature="2.585e-08" zaid="40091"/>
|
||||
<ace_table alias="Zr-92.72c" awr="91.1155" location="1" name="40092.72c" path="300K/Zr_092_300K.ace" temperature="2.585e-08" zaid="40092"/>
|
||||
<ace_table alias="Zr-93.72c" awr="92.1084" location="1" name="40093.72c" path="300K/Zr_093_300K.ace" temperature="2.585e-08" zaid="40093"/>
|
||||
<ace_table alias="Zr-94.72c" awr="93.0996" location="1" name="40094.72c" path="300K/Zr_094_300K.ace" temperature="2.585e-08" zaid="40094"/>
|
||||
<ace_table alias="Zr-95.72c" awr="94.0927" location="1" name="40095.72c" path="300K/Zr_095_300K.ace" temperature="2.585e-08" zaid="40095"/>
|
||||
<ace_table alias="Zr-96.72c" awr="95.0844" location="1" name="40096.72c" path="300K/Zr_096_300K.ace" temperature="2.585e-08" zaid="40096"/>
|
||||
<ace_table alias="Nb-93.72c" awr="92.1051" location="1" name="41093.72c" path="300K/Nb_093_300K.ace" temperature="2.585e-08" zaid="41093"/>
|
||||
<ace_table alias="Nb-94.72c" awr="93.1006" location="1" name="41094.72c" path="300K/Nb_094_300K.ace" temperature="2.585e-08" zaid="41094"/>
|
||||
<ace_table alias="Nb-95.72c" awr="94.0915" location="1" name="41095.72c" path="300K/Nb_095_300K.ace" temperature="2.585e-08" zaid="41095"/>
|
||||
<ace_table alias="Mo-92.72c" awr="91.1173" location="1" name="42092.72c" path="300K/Mo_092_300K.ace" temperature="2.585e-08" zaid="42092"/>
|
||||
<ace_table alias="Mo-94.72c" awr="93.0984" location="1" name="42094.72c" path="300K/Mo_094_300K.ace" temperature="2.585e-08" zaid="42094"/>
|
||||
<ace_table alias="Mo-95.72c" awr="94.0906" location="1" name="42095.72c" path="300K/Mo_095_300K.ace" temperature="2.585e-08" zaid="42095"/>
|
||||
<ace_table alias="Mo-96.72c" awr="95.0808" location="1" name="42096.72c" path="300K/Mo_096_300K.ace" temperature="2.585e-08" zaid="42096"/>
|
||||
<ace_table alias="Mo-97.72c" awr="96.0735" location="1" name="42097.72c" path="300K/Mo_097_300K.ace" temperature="2.585e-08" zaid="42097"/>
|
||||
<ace_table alias="Mo-98.72c" awr="97.0643" location="1" name="42098.72c" path="300K/Mo_098_300K.ace" temperature="2.585e-08" zaid="42098"/>
|
||||
<ace_table alias="Mo-99.72c" awr="98.058" location="1" name="42099.72c" path="300K/Mo_099_300K.ace" temperature="2.585e-08" zaid="42099"/>
|
||||
<ace_table alias="Mo-100.72c" awr="99.049" location="1" name="42100.72c" path="300K/Mo_100_300K.ace" temperature="2.585e-08" zaid="42100"/>
|
||||
<ace_table alias="Tc-99.72c" awr="98.0566" location="1" name="43099.72c" path="300K/Tc_099_300K.ace" temperature="2.585e-08" zaid="43099"/>
|
||||
<ace_table alias="Ru-96.72c" awr="95.0837" location="1" name="44096.72c" path="300K/Ru_096_300K.ace" temperature="2.585e-08" zaid="44096"/>
|
||||
<ace_table alias="Ru-98.72c" awr="97.0642" location="1" name="44098.72c" path="300K/Ru_098_300K.ace" temperature="2.585e-08" zaid="44098"/>
|
||||
<ace_table alias="Ru-99.72c" awr="98.0562" location="1" name="44099.72c" path="300K/Ru_099_300K.ace" temperature="2.585e-08" zaid="44099"/>
|
||||
<ace_table alias="Ru-100.72c" awr="99.046" location="1" name="44100.72c" path="300K/Ru_100_300K.ace" temperature="2.585e-08" zaid="44100"/>
|
||||
<ace_table alias="Ru-101.72c" awr="100.039" location="1" name="44101.72c" path="300K/Ru_101_300K.ace" temperature="2.585e-08" zaid="44101"/>
|
||||
<ace_table alias="Ru-102.72c" awr="101.03" location="1" name="44102.72c" path="300K/Ru_102_300K.ace" temperature="2.585e-08" zaid="44102"/>
|
||||
<ace_table alias="Ru-103.72c" awr="102.02" location="1" name="44103.72c" path="300K/Ru_103_300K.ace" temperature="2.585e-08" zaid="44103"/>
|
||||
<ace_table alias="Ru-104.72c" awr="103.01" location="1" name="44104.72c" path="300K/Ru_104_300K.ace" temperature="2.585e-08" zaid="44104"/>
|
||||
<ace_table alias="Ru-105.72c" awr="104.01" location="1" name="44105.72c" path="300K/Ru_105_300K.ace" temperature="2.585e-08" zaid="44105"/>
|
||||
<ace_table alias="Ru-106.72c" awr="104.997" location="1" name="44106.72c" path="300K/Ru_106_300K.ace" temperature="2.585e-08" zaid="44106"/>
|
||||
<ace_table alias="Rh-103.72c" awr="102.021" location="1" name="45103.72c" path="300K/Rh_103_300K.ace" temperature="2.585e-08" zaid="45103"/>
|
||||
<ace_table alias="Rh-105.72c" awr="104.0" location="1" name="45105.72c" path="300K/Rh_105_300K.ace" temperature="2.585e-08" zaid="45105"/>
|
||||
<ace_table alias="Pd-102.72c" awr="101.0302" location="1" name="46102.72c" path="300K/Pd_102_300K.ace" temperature="2.585e-08" zaid="46102"/>
|
||||
<ace_table alias="Pd-104.72c" awr="103.0114" location="1" name="46104.72c" path="300K/Pd_104_300K.ace" temperature="2.585e-08" zaid="46104"/>
|
||||
<ace_table alias="Pd-105.72c" awr="104.004" location="1" name="46105.72c" path="300K/Pd_105_300K.ace" temperature="2.585e-08" zaid="46105"/>
|
||||
<ace_table alias="Pd-106.72c" awr="104.9937" location="1" name="46106.72c" path="300K/Pd_106_300K.ace" temperature="2.585e-08" zaid="46106"/>
|
||||
<ace_table alias="Pd-107.72c" awr="105.987" location="1" name="46107.72c" path="300K/Pd_107_300K.ace" temperature="2.585e-08" zaid="46107"/>
|
||||
<ace_table alias="Pd-108.72c" awr="106.9769" location="1" name="46108.72c" path="300K/Pd_108_300K.ace" temperature="2.585e-08" zaid="46108"/>
|
||||
<ace_table alias="Pd-110.72c" awr="108.961" location="1" name="46110.72c" path="300K/Pd_110_300K.ace" temperature="2.585e-08" zaid="46110"/>
|
||||
<ace_table alias="Ag-107.72c" awr="105.987" location="1" name="47107.72c" path="300K/Ag_107_300K.ace" temperature="2.585e-08" zaid="47107"/>
|
||||
<ace_table alias="Ag-109.72c" awr="107.969" location="1" name="47109.72c" path="300K/Ag_109_300K.ace" temperature="2.585e-08" zaid="47109"/>
|
||||
<ace_table alias="Ag-110m.72c" awr="108.962" location="1" metastable="1" name="47510.72c" path="300K/Ag_110m1_300K.ace" temperature="2.585e-08" zaid="47510"/>
|
||||
<ace_table alias="Ag-111.72c" awr="109.953" location="1" name="47111.72c" path="300K/Ag_111_300K.ace" temperature="2.585e-08" zaid="47111"/>
|
||||
<ace_table alias="Cd-106.72c" awr="104.996" location="1" name="48106.72c" path="300K/Cd_106_300K.ace" temperature="2.585e-08" zaid="48106"/>
|
||||
<ace_table alias="Cd-108.72c" awr="106.977" location="1" name="48108.72c" path="300K/Cd_108_300K.ace" temperature="2.585e-08" zaid="48108"/>
|
||||
<ace_table alias="Cd-110.72c" awr="108.959" location="1" name="48110.72c" path="300K/Cd_110_300K.ace" temperature="2.585e-08" zaid="48110"/>
|
||||
<ace_table alias="Cd-111.72c" awr="109.951" location="1" name="48111.72c" path="300K/Cd_111_300K.ace" temperature="2.585e-08" zaid="48111"/>
|
||||
<ace_table alias="Cd-112.72c" awr="110.942" location="1" name="48112.72c" path="300K/Cd_112_300K.ace" temperature="2.585e-08" zaid="48112"/>
|
||||
<ace_table alias="Cd-113.72c" awr="111.93" location="1" name="48113.72c" path="300K/Cd_113_300K.ace" temperature="2.585e-08" zaid="48113"/>
|
||||
<ace_table alias="Cd-114.72c" awr="112.925" location="1" name="48114.72c" path="300K/Cd_114_300K.ace" temperature="2.585e-08" zaid="48114"/>
|
||||
<ace_table alias="Cd-115m.72c" awr="113.918" location="1" metastable="1" name="48515.72c" path="300K/Cd_115m1_300K.ace" temperature="2.585e-08" zaid="48515"/>
|
||||
<ace_table alias="Cd-116.72c" awr="114.909" location="1" name="48116.72c" path="300K/Cd_116_300K.ace" temperature="2.585e-08" zaid="48116"/>
|
||||
<ace_table alias="In-113.72c" awr="111.934" location="1" name="49113.72c" path="300K/In_113_300K.ace" temperature="2.585e-08" zaid="49113"/>
|
||||
<ace_table alias="In-115.72c" awr="113.917" location="1" name="49115.72c" path="300K/In_115_300K.ace" temperature="2.585e-08" zaid="49115"/>
|
||||
<ace_table alias="Sn-112.72c" awr="110.944" location="1" name="50112.72c" path="300K/Sn_112_300K.ace" temperature="2.585e-08" zaid="50112"/>
|
||||
<ace_table alias="Sn-113.72c" awr="111.935" location="1" name="50113.72c" path="300K/Sn_113_300K.ace" temperature="2.585e-08" zaid="50113"/>
|
||||
<ace_table alias="Sn-114.72c" awr="112.925" location="1" name="50114.72c" path="300K/Sn_114_300K.ace" temperature="2.585e-08" zaid="50114"/>
|
||||
<ace_table alias="Sn-115.72c" awr="113.916" location="1" name="50115.72c" path="300K/Sn_115_300K.ace" temperature="2.585e-08" zaid="50115"/>
|
||||
<ace_table alias="Sn-116.72c" awr="114.906" location="1" name="50116.72c" path="300K/Sn_116_300K.ace" temperature="2.585e-08" zaid="50116"/>
|
||||
<ace_table alias="Sn-117.72c" awr="115.899" location="1" name="50117.72c" path="300K/Sn_117_300K.ace" temperature="2.585e-08" zaid="50117"/>
|
||||
<ace_table alias="Sn-118.72c" awr="116.889" location="1" name="50118.72c" path="300K/Sn_118_300K.ace" temperature="2.585e-08" zaid="50118"/>
|
||||
<ace_table alias="Sn-119.72c" awr="117.882" location="1" name="50119.72c" path="300K/Sn_119_300K.ace" temperature="2.585e-08" zaid="50119"/>
|
||||
<ace_table alias="Sn-120.72c" awr="118.872" location="1" name="50120.72c" path="300K/Sn_120_300K.ace" temperature="2.585e-08" zaid="50120"/>
|
||||
<ace_table alias="Sn-122.72c" awr="120.856" location="1" name="50122.72c" path="300K/Sn_122_300K.ace" temperature="2.585e-08" zaid="50122"/>
|
||||
<ace_table alias="Sn-123.72c" awr="121.85" location="1" name="50123.72c" path="300K/Sn_123_300K.ace" temperature="2.585e-08" zaid="50123"/>
|
||||
<ace_table alias="Sn-124.72c" awr="122.841" location="1" name="50124.72c" path="300K/Sn_124_300K.ace" temperature="2.585e-08" zaid="50124"/>
|
||||
<ace_table alias="Sn-125.72c" awr="123.835" location="1" name="50125.72c" path="300K/Sn_125_300K.ace" temperature="2.585e-08" zaid="50125"/>
|
||||
<ace_table alias="Sn-126.72c" awr="124.826" location="1" name="50126.72c" path="300K/Sn_126_300K.ace" temperature="2.585e-08" zaid="50126"/>
|
||||
<ace_table alias="Sb-121.72c" awr="119.87" location="1" name="51121.72c" path="300K/Sb_121_300K.ace" temperature="2.585e-08" zaid="51121"/>
|
||||
<ace_table alias="Sb-123.72c" awr="121.85" location="1" name="51123.72c" path="300K/Sb_123_300K.ace" temperature="2.585e-08" zaid="51123"/>
|
||||
<ace_table alias="Sb-124.72c" awr="122.842" location="1" name="51124.72c" path="300K/Sb_124_300K.ace" temperature="2.585e-08" zaid="51124"/>
|
||||
<ace_table alias="Sb-125.72c" awr="123.832" location="1" name="51125.72c" path="300K/Sb_125_300K.ace" temperature="2.585e-08" zaid="51125"/>
|
||||
<ace_table alias="Sb-126.72c" awr="124.826" location="1" name="51126.72c" path="300K/Sb_126_300K.ace" temperature="2.585e-08" zaid="51126"/>
|
||||
<ace_table alias="Te-120.72c" awr="118.874" location="1" name="52120.72c" path="300K/Te_120_300K.ace" temperature="2.585e-08" zaid="52120"/>
|
||||
<ace_table alias="Te-122.72c" awr="120.856" location="1" name="52122.72c" path="300K/Te_122_300K.ace" temperature="2.585e-08" zaid="52122"/>
|
||||
<ace_table alias="Te-123.72c" awr="121.848" location="1" name="52123.72c" path="300K/Te_123_300K.ace" temperature="2.585e-08" zaid="52123"/>
|
||||
<ace_table alias="Te-124.72c" awr="122.839" location="1" name="52124.72c" path="300K/Te_124_300K.ace" temperature="2.585e-08" zaid="52124"/>
|
||||
<ace_table alias="Te-125.72c" awr="123.831" location="1" name="52125.72c" path="300K/Te_125_300K.ace" temperature="2.585e-08" zaid="52125"/>
|
||||
<ace_table alias="Te-126.72c" awr="124.821" location="1" name="52126.72c" path="300K/Te_126_300K.ace" temperature="2.585e-08" zaid="52126"/>
|
||||
<ace_table alias="Te-127m.72c" awr="125.815" location="1" metastable="1" name="52527.72c" path="300K/Te_127m1_300K.ace" temperature="2.585e-08" zaid="52526"/>
|
||||
<ace_table alias="Te-128.72c" awr="126.805" location="1" name="52128.72c" path="300K/Te_128_300K.ace" temperature="2.585e-08" zaid="52128"/>
|
||||
<ace_table alias="Te-129m.72c" awr="127.8" location="1" metastable="1" name="52529.72c" path="300K/Te_129m1_300K.ace" temperature="2.585e-08" zaid="52529"/>
|
||||
<ace_table alias="Te-130.72c" awr="128.79" location="1" name="52130.72c" path="300K/Te_130_300K.ace" temperature="2.585e-08" zaid="52130"/>
|
||||
<ace_table alias="Te-132.72c" awr="130.775" location="1" name="52132.72c" path="300K/Te_132_300K.ace" temperature="2.585e-08" zaid="52132"/>
|
||||
<ace_table alias="I-127.72c" awr="125.8143" location="1" name="53127.72c" path="300K/I_127_300K.ace" temperature="2.585e-08" zaid="53127"/>
|
||||
<ace_table alias="I-129.72c" awr="127.798" location="1" name="53129.72c" path="300K/I_129_300K.ace" temperature="2.585e-08" zaid="53129"/>
|
||||
<ace_table alias="I-130.72c" awr="128.791" location="1" name="53130.72c" path="300K/I_130_300K.ace" temperature="2.585e-08" zaid="53130"/>
|
||||
<ace_table alias="I-131.72c" awr="129.781" location="1" name="53131.72c" path="300K/I_131_300K.ace" temperature="2.585e-08" zaid="53131"/>
|
||||
<ace_table alias="I-135.72c" awr="133.75" location="1" name="53135.72c" path="300K/I_135_300K.ace" temperature="2.585e-08" zaid="53135"/>
|
||||
<ace_table alias="Xe-123.72c" awr="121.8526" location="1" name="54123.72c" path="300K/Xe_123_300K.ace" temperature="2.585e-08" zaid="54123"/>
|
||||
<ace_table alias="Xe-124.72c" awr="122.8415" location="1" name="54124.72c" path="300K/Xe_124_300K.ace" temperature="2.585e-08" zaid="54124"/>
|
||||
<ace_table alias="Xe-126.72c" awr="124.822" location="1" name="54126.72c" path="300K/Xe_126_300K.ace" temperature="2.585e-08" zaid="54126"/>
|
||||
<ace_table alias="Xe-128.72c" awr="126.804" location="1" name="54128.72c" path="300K/Xe_128_300K.ace" temperature="2.585e-08" zaid="54128"/>
|
||||
<ace_table alias="Xe-129.72c" awr="127.798" location="1" name="54129.72c" path="300K/Xe_129_300K.ace" temperature="2.585e-08" zaid="54129"/>
|
||||
<ace_table alias="Xe-130.72c" awr="128.788" location="1" name="54130.72c" path="300K/Xe_130_300K.ace" temperature="2.585e-08" zaid="54130"/>
|
||||
<ace_table alias="Xe-131.72c" awr="129.781" location="1" name="54131.72c" path="300K/Xe_131_300K.ace" temperature="2.585e-08" zaid="54131"/>
|
||||
<ace_table alias="Xe-132.72c" awr="130.77" location="1" name="54132.72c" path="300K/Xe_132_300K.ace" temperature="2.585e-08" zaid="54132"/>
|
||||
<ace_table alias="Xe-133.72c" awr="131.764" location="1" name="54133.72c" path="300K/Xe_133_300K.ace" temperature="2.585e-08" zaid="54133"/>
|
||||
<ace_table alias="Xe-134.72c" awr="132.76" location="1" name="54134.72c" path="300K/Xe_134_300K.ace" temperature="2.585e-08" zaid="54134"/>
|
||||
<ace_table alias="Xe-135.72c" awr="133.748" location="1" name="54135.72c" path="300K/Xe_135_300K.ace" temperature="2.585e-08" zaid="54135"/>
|
||||
<ace_table alias="Xe-136.72c" awr="134.74" location="1" name="54136.72c" path="300K/Xe_136_300K.ace" temperature="2.585e-08" zaid="54136"/>
|
||||
<ace_table alias="Cs-133.72c" awr="131.764" location="1" name="55133.72c" path="300K/Cs_133_300K.ace" temperature="2.585e-08" zaid="55133"/>
|
||||
<ace_table alias="Cs-134.72c" awr="132.757" location="1" name="55134.72c" path="300K/Cs_134_300K.ace" temperature="2.585e-08" zaid="55134"/>
|
||||
<ace_table alias="Cs-135.72c" awr="133.747" location="1" name="55135.72c" path="300K/Cs_135_300K.ace" temperature="2.585e-08" zaid="55135"/>
|
||||
<ace_table alias="Cs-136.72c" awr="134.739" location="1" name="55136.72c" path="300K/Cs_136_300K.ace" temperature="2.585e-08" zaid="55136"/>
|
||||
<ace_table alias="Cs-137.72c" awr="135.731" location="1" name="55137.72c" path="300K/Cs_137_300K.ace" temperature="2.585e-08" zaid="55137"/>
|
||||
<ace_table alias="Ba-130.72c" awr="128.79" location="1" name="56130.72c" path="300K/Ba_130_300K.ace" temperature="2.585e-08" zaid="56130"/>
|
||||
<ace_table alias="Ba-132.72c" awr="130.772" location="1" name="56132.72c" path="300K/Ba_132_300K.ace" temperature="2.585e-08" zaid="56132"/>
|
||||
<ace_table alias="Ba-133.72c" awr="131.764" location="1" name="56133.72c" path="300K/Ba_133_300K.ace" temperature="2.585e-08" zaid="56133"/>
|
||||
<ace_table alias="Ba-134.72c" awr="132.754" location="1" name="56134.72c" path="300K/Ba_134_300K.ace" temperature="2.585e-08" zaid="56134"/>
|
||||
<ace_table alias="Ba-135.72c" awr="133.747" location="1" name="56135.72c" path="300K/Ba_135_300K.ace" temperature="2.585e-08" zaid="56135"/>
|
||||
<ace_table alias="Ba-136.72c" awr="134.737" location="1" name="56136.72c" path="300K/Ba_136_300K.ace" temperature="2.585e-08" zaid="56136"/>
|
||||
<ace_table alias="Ba-137.72c" awr="135.73" location="1" name="56137.72c" path="300K/Ba_137_300K.ace" temperature="2.585e-08" zaid="56137"/>
|
||||
<ace_table alias="Ba-138.72c" awr="136.72" location="1" name="56138.72c" path="300K/Ba_138_300K.ace" temperature="2.585e-08" zaid="56138"/>
|
||||
<ace_table alias="Ba-140.72c" awr="138.708" location="1" name="56140.72c" path="300K/Ba_140_300K.ace" temperature="2.585e-08" zaid="56140"/>
|
||||
<ace_table alias="La-138.72c" awr="136.722" location="1" name="57138.72c" path="300K/La_138_300K.ace" temperature="2.585e-08" zaid="57138"/>
|
||||
<ace_table alias="La-139.72c" awr="137.71" location="1" name="57139.72c" path="300K/La_139_300K.ace" temperature="2.585e-08" zaid="57139"/>
|
||||
<ace_table alias="La-140.72c" awr="138.708" location="1" name="57140.72c" path="300K/La_140_300K.ace" temperature="2.585e-08" zaid="57140"/>
|
||||
<ace_table alias="Ce-136.72c" awr="134.74" location="1" name="58136.72c" path="300K/Ce_136_300K.ace" temperature="2.585e-08" zaid="58136"/>
|
||||
<ace_table alias="Ce-138.72c" awr="136.721" location="1" name="58138.72c" path="300K/Ce_138_300K.ace" temperature="2.585e-08" zaid="58138"/>
|
||||
<ace_table alias="Ce-139.72c" awr="137.713" location="1" name="58139.72c" path="300K/Ce_139_300K.ace" temperature="2.585e-08" zaid="58139"/>
|
||||
<ace_table alias="Ce-140.72c" awr="138.704" location="1" name="58140.72c" path="300K/Ce_140_300K.ace" temperature="2.585e-08" zaid="58140"/>
|
||||
<ace_table alias="Ce-141.72c" awr="139.7" location="1" name="58141.72c" path="300K/Ce_141_300K.ace" temperature="2.585e-08" zaid="58141"/>
|
||||
<ace_table alias="Ce-142.72c" awr="140.69" location="1" name="58142.72c" path="300K/Ce_142_300K.ace" temperature="2.585e-08" zaid="58142"/>
|
||||
<ace_table alias="Ce-143.72c" awr="141.685" location="1" name="58143.72c" path="300K/Ce_143_300K.ace" temperature="2.585e-08" zaid="58143"/>
|
||||
<ace_table alias="Ce-144.72c" awr="142.678" location="1" name="58144.72c" path="300K/Ce_144_300K.ace" temperature="2.585e-08" zaid="58144"/>
|
||||
<ace_table alias="Pr-141.72c" awr="139.697" location="1" name="59141.72c" path="300K/Pr_141_300K.ace" temperature="2.585e-08" zaid="59141"/>
|
||||
<ace_table alias="Pr-142.72c" awr="140.691" location="1" name="59142.72c" path="300K/Pr_142_300K.ace" temperature="2.585e-08" zaid="59142"/>
|
||||
<ace_table alias="Pr-143.72c" awr="141.683" location="1" name="59143.72c" path="300K/Pr_143_300K.ace" temperature="2.585e-08" zaid="59143"/>
|
||||
<ace_table alias="Nd-142.72c" awr="140.689" location="1" name="60142.72c" path="300K/Nd_142_300K.ace" temperature="2.585e-08" zaid="60142"/>
|
||||
<ace_table alias="Nd-143.72c" awr="141.682" location="1" name="60143.72c" path="300K/Nd_143_300K.ace" temperature="2.585e-08" zaid="60143"/>
|
||||
<ace_table alias="Nd-144.72c" awr="142.674" location="1" name="60144.72c" path="300K/Nd_144_300K.ace" temperature="2.585e-08" zaid="60144"/>
|
||||
<ace_table alias="Nd-145.72c" awr="143.668" location="1" name="60145.72c" path="300K/Nd_145_300K.ace" temperature="2.585e-08" zaid="60145"/>
|
||||
<ace_table alias="Nd-146.72c" awr="144.66" location="1" name="60146.72c" path="300K/Nd_146_300K.ace" temperature="2.585e-08" zaid="60146"/>
|
||||
<ace_table alias="Nd-147.72c" awr="145.654" location="1" name="60147.72c" path="300K/Nd_147_300K.ace" temperature="2.585e-08" zaid="60147"/>
|
||||
<ace_table alias="Nd-148.72c" awr="146.646" location="1" name="60148.72c" path="300K/Nd_148_300K.ace" temperature="2.585e-08" zaid="60148"/>
|
||||
<ace_table alias="Nd-150.72c" awr="148.633" location="1" name="60150.72c" path="300K/Nd_150_300K.ace" temperature="2.585e-08" zaid="60150"/>
|
||||
<ace_table alias="Pm-147.72c" awr="145.653" location="1" name="61147.72c" path="300K/Pm_147_300K.ace" temperature="2.585e-08" zaid="61147"/>
|
||||
<ace_table alias="Pm-148.72c" awr="146.646" location="1" name="61148.72c" path="300K/Pm_148_300K.ace" temperature="2.585e-08" zaid="61148"/>
|
||||
<ace_table alias="Pm-148m.72c" awr="146.65" location="1" metastable="1" name="61548.72c" path="300K/Pm_148m1_300K.ace" temperature="2.585e-08" zaid="61548"/>
|
||||
<ace_table alias="Pm-149.72c" awr="147.639" location="1" name="61149.72c" path="300K/Pm_149_300K.ace" temperature="2.585e-08" zaid="61149"/>
|
||||
<ace_table alias="Pm-151.72c" awr="149.625" location="1" name="61151.72c" path="300K/Pm_151_300K.ace" temperature="2.585e-08" zaid="61151"/>
|
||||
<ace_table alias="Sm-144.72c" awr="142.676" location="1" name="62144.72c" path="300K/Sm_144_300K.ace" temperature="2.585e-08" zaid="62144"/>
|
||||
<ace_table alias="Sm-147.72c" awr="145.653" location="1" name="62147.72c" path="300K/Sm_147_300K.ace" temperature="2.585e-08" zaid="62147"/>
|
||||
<ace_table alias="Sm-148.72c" awr="146.644" location="1" name="62148.72c" path="300K/Sm_148_300K.ace" temperature="2.585e-08" zaid="62148"/>
|
||||
<ace_table alias="Sm-149.72c" awr="147.638" location="1" name="62149.72c" path="300K/Sm_149_300K.ace" temperature="2.585e-08" zaid="62149"/>
|
||||
<ace_table alias="Sm-150.72c" awr="148.629" location="1" name="62150.72c" path="300K/Sm_150_300K.ace" temperature="2.585e-08" zaid="62150"/>
|
||||
<ace_table alias="Sm-151.72c" awr="149.623" location="1" name="62151.72c" path="300K/Sm_151_300K.ace" temperature="2.585e-08" zaid="62151"/>
|
||||
<ace_table alias="Sm-152.72c" awr="150.615" location="1" name="62152.72c" path="300K/Sm_152_300K.ace" temperature="2.585e-08" zaid="62152"/>
|
||||
<ace_table alias="Sm-153.72c" awr="151.608" location="1" name="62153.72c" path="300K/Sm_153_300K.ace" temperature="2.585e-08" zaid="62153"/>
|
||||
<ace_table alias="Sm-154.72c" awr="152.6" location="1" name="62154.72c" path="300K/Sm_154_300K.ace" temperature="2.585e-08" zaid="62154"/>
|
||||
<ace_table alias="Eu-151.72c" awr="149.62" location="1" name="63151.72c" path="300K/Eu_151_300K.ace" temperature="2.585e-08" zaid="63151"/>
|
||||
<ace_table alias="Eu-152.72c" awr="150.617" location="1" name="63152.72c" path="300K/Eu_152_300K.ace" temperature="2.585e-08" zaid="63152"/>
|
||||
<ace_table alias="Eu-153.72c" awr="151.608" location="1" name="63153.72c" path="300K/Eu_153_300K.ace" temperature="2.585e-08" zaid="63153"/>
|
||||
<ace_table alias="Eu-154.72c" awr="152.6" location="1" name="63154.72c" path="300K/Eu_154_300K.ace" temperature="2.585e-08" zaid="63154"/>
|
||||
<ace_table alias="Eu-155.72c" awr="153.59" location="1" name="63155.72c" path="300K/Eu_155_300K.ace" temperature="2.585e-08" zaid="63155"/>
|
||||
<ace_table alias="Eu-156.72c" awr="154.586" location="1" name="63156.72c" path="300K/Eu_156_300K.ace" temperature="2.585e-08" zaid="63156"/>
|
||||
<ace_table alias="Eu-157.72c" awr="155.577" location="1" name="63157.72c" path="300K/Eu_157_300K.ace" temperature="2.585e-08" zaid="63157"/>
|
||||
<ace_table alias="Gd-152.72c" awr="150.615" location="1" name="64152.72c" path="300K/Gd_152_300K.ace" temperature="2.585e-08" zaid="64152"/>
|
||||
<ace_table alias="Gd-153.72c" awr="151.608" location="1" name="64153.72c" path="300K/Gd_153_300K.ace" temperature="2.585e-08" zaid="64153"/>
|
||||
<ace_table alias="Gd-154.72c" awr="152.599" location="1" name="64154.72c" path="300K/Gd_154_300K.ace" temperature="2.585e-08" zaid="64154"/>
|
||||
<ace_table alias="Gd-155.72c" awr="153.592" location="1" name="64155.72c" path="300K/Gd_155_300K.ace" temperature="2.585e-08" zaid="64155"/>
|
||||
<ace_table alias="Gd-156.72c" awr="154.583" location="1" name="64156.72c" path="300K/Gd_156_300K.ace" temperature="2.585e-08" zaid="64156"/>
|
||||
<ace_table alias="Gd-157.72c" awr="155.576" location="1" name="64157.72c" path="300K/Gd_157_300K.ace" temperature="2.585e-08" zaid="64157"/>
|
||||
<ace_table alias="Gd-158.72c" awr="156.567" location="1" name="64158.72c" path="300K/Gd_158_300K.ace" temperature="2.585e-08" zaid="64158"/>
|
||||
<ace_table alias="Gd-160.72c" awr="158.553" location="1" name="64160.72c" path="300K/Gd_160_300K.ace" temperature="2.585e-08" zaid="64160"/>
|
||||
<ace_table alias="Tb-159.72c" awr="157.56" location="1" name="65159.72c" path="300K/Tb_159_300K.ace" temperature="2.585e-08" zaid="65159"/>
|
||||
<ace_table alias="Tb-160.72c" awr="158.553" location="1" name="65160.72c" path="300K/Tb_160_300K.ace" temperature="2.585e-08" zaid="65160"/>
|
||||
<ace_table alias="Dy-156.72c" awr="154.585" location="1" name="66156.72c" path="300K/Dy_156_300K.ace" temperature="2.585e-08" zaid="66156"/>
|
||||
<ace_table alias="Dy-158.72c" awr="156.568" location="1" name="66158.72c" path="300K/Dy_158_300K.ace" temperature="2.585e-08" zaid="66158"/>
|
||||
<ace_table alias="Dy-160.72c" awr="158.551" location="1" name="66160.72c" path="300K/Dy_160_300K.ace" temperature="2.585e-08" zaid="66160"/>
|
||||
<ace_table alias="Dy-161.72c" awr="159.544" location="1" name="66161.72c" path="300K/Dy_161_300K.ace" temperature="2.585e-08" zaid="66161"/>
|
||||
<ace_table alias="Dy-162.72c" awr="160.536" location="1" name="66162.72c" path="300K/Dy_162_300K.ace" temperature="2.585e-08" zaid="66162"/>
|
||||
<ace_table alias="Dy-163.72c" awr="161.529" location="1" name="66163.72c" path="300K/Dy_163_300K.ace" temperature="2.585e-08" zaid="66163"/>
|
||||
<ace_table alias="Dy-164.72c" awr="162.521" location="1" name="66164.72c" path="300K/Dy_164_300K.ace" temperature="2.585e-08" zaid="66164"/>
|
||||
<ace_table alias="Ho-165.72c" awr="163.513" location="1" name="67165.72c" path="300K/Ho_165_300K.ace" temperature="2.585e-08" zaid="67165"/>
|
||||
<ace_table alias="Ho-166m.72c" awr="164.507" location="1" metastable="1" name="67566.72c" path="300K/Ho_166m1_300K.ace" temperature="2.585e-08" zaid="67566"/>
|
||||
<ace_table alias="Er-162.72c" awr="160.538" location="1" name="68162.72c" path="300K/Er_162_300K.ace" temperature="2.585e-08" zaid="68162"/>
|
||||
<ace_table alias="Er-164.72c" awr="162.521" location="1" name="68164.72c" path="300K/Er_164_300K.ace" temperature="2.585e-08" zaid="68164"/>
|
||||
<ace_table alias="Er-166.72c" awr="164.505" location="1" name="68166.72c" path="300K/Er_166_300K.ace" temperature="2.585e-08" zaid="68166"/>
|
||||
<ace_table alias="Er-167.72c" awr="165.498" location="1" name="68167.72c" path="300K/Er_167_300K.ace" temperature="2.585e-08" zaid="68167"/>
|
||||
<ace_table alias="Er-168.72c" awr="166.487" location="1" name="68168.72c" path="300K/Er_168_300K.ace" temperature="2.585e-08" zaid="68168"/>
|
||||
<ace_table alias="Er-170.72c" awr="168.476" location="1" name="68170.72c" path="300K/Er_170_300K.ace" temperature="2.585e-08" zaid="68170"/>
|
||||
<ace_table alias="Tm-168.72c" awr="166.492" location="1" name="69168.72c" path="300K/Tm_168_300K.ace" temperature="2.585e-08" zaid="69168"/>
|
||||
<ace_table alias="Tm-169.72c" awr="167.483" location="1" name="69169.72c" path="300K/Tm_169_300K.ace" temperature="2.585e-08" zaid="69169"/>
|
||||
<ace_table alias="Tm-170.72c" awr="168.476" location="1" name="69170.72c" path="300K/Tm_170_300K.ace" temperature="2.585e-08" zaid="69170"/>
|
||||
<ace_table alias="Lu-175.72c" awr="173.438" location="1" name="71175.72c" path="300K/Lu_175_300K.ace" temperature="2.585e-08" zaid="71175"/>
|
||||
<ace_table alias="Lu-176.72c" awr="174.43" location="1" name="71176.72c" path="300K/Lu_176_300K.ace" temperature="2.585e-08" zaid="71176"/>
|
||||
<ace_table alias="Hf-174.72c" awr="172.446" location="1" name="72174.72c" path="300K/Hf_174_300K.ace" temperature="2.585e-08" zaid="72174"/>
|
||||
<ace_table alias="Hf-176.72c" awr="174.429" location="1" name="72176.72c" path="300K/Hf_176_300K.ace" temperature="2.585e-08" zaid="72176"/>
|
||||
<ace_table alias="Hf-177.72c" awr="175.42" location="1" name="72177.72c" path="300K/Hf_177_300K.ace" temperature="2.585e-08" zaid="72177"/>
|
||||
<ace_table alias="Hf-178.72c" awr="176.411" location="1" name="72178.72c" path="300K/Hf_178_300K.ace" temperature="2.585e-08" zaid="72178"/>
|
||||
<ace_table alias="Hf-179.72c" awr="177.413" location="1" name="72179.72c" path="300K/Hf_179_300K.ace" temperature="2.585e-08" zaid="72179"/>
|
||||
<ace_table alias="Hf-180.72c" awr="178.404" location="1" name="72180.72c" path="300K/Hf_180_300K.ace" temperature="2.585e-08" zaid="72180"/>
|
||||
<ace_table alias="Ta-180.72c" awr="178.4016" location="1" name="73180.72c" path="300K/Ta_180_300K.ace" temperature="2.585e-08" zaid="73180"/>
|
||||
<ace_table alias="Ta-181.72c" awr="179.3936" location="1" name="73181.72c" path="300K/Ta_181_300K.ace" temperature="2.585e-08" zaid="73181"/>
|
||||
<ace_table alias="Ta-182.72c" awr="180.387" location="1" name="73182.72c" path="300K/Ta_182_300K.ace" temperature="2.585e-08" zaid="73182"/>
|
||||
<ace_table alias="W-180.72c" awr="178.401" location="1" name="74180.72c" path="300K/W_180_300K.ace" temperature="2.585e-08" zaid="74180"/>
|
||||
<ace_table alias="W-182.72c" awr="180.385" location="1" name="74182.72c" path="300K/W_182_300K.ace" temperature="2.585e-08" zaid="74182"/>
|
||||
<ace_table alias="W-183.72c" awr="181.379" location="1" name="74183.72c" path="300K/W_183_300K.ace" temperature="2.585e-08" zaid="74183"/>
|
||||
<ace_table alias="W-184.72c" awr="182.371" location="1" name="74184.72c" path="300K/W_184_300K.ace" temperature="2.585e-08" zaid="74184"/>
|
||||
<ace_table alias="W-186.72c" awr="184.357" location="1" name="74186.72c" path="300K/W_186_300K.ace" temperature="2.585e-08" zaid="74186"/>
|
||||
<ace_table alias="Re-185.72c" awr="183.3641" location="1" name="75185.72c" path="300K/Re_185_300K.ace" temperature="2.585e-08" zaid="75185"/>
|
||||
<ace_table alias="Re-187.72c" awr="185.3497" location="1" name="75187.72c" path="300K/Re_187_300K.ace" temperature="2.585e-08" zaid="75187"/>
|
||||
<ace_table alias="Ir-191.72c" awr="189.32" location="1" name="77191.72c" path="300K/Ir_191_300K.ace" temperature="2.585e-08" zaid="77191"/>
|
||||
<ace_table alias="Ir-193.72c" awr="191.305" location="1" name="77193.72c" path="300K/Ir_193_300K.ace" temperature="2.585e-08" zaid="77193"/>
|
||||
<ace_table alias="Au-197.72c" awr="195.274" location="1" name="79197.72c" path="300K/Au_197_300K.ace" temperature="2.585e-08" zaid="79197"/>
|
||||
<ace_table alias="Hg-196.72c" awr="194.282" location="1" name="80196.72c" path="300K/Hg_196_300K.ace" temperature="2.585e-08" zaid="80196"/>
|
||||
<ace_table alias="Hg-198.72c" awr="196.266" location="1" name="80198.72c" path="300K/Hg_198_300K.ace" temperature="2.585e-08" zaid="80198"/>
|
||||
<ace_table alias="Hg-199.72c" awr="197.259" location="1" name="80199.72c" path="300K/Hg_199_300K.ace" temperature="2.585e-08" zaid="80199"/>
|
||||
<ace_table alias="Hg-200.72c" awr="198.25" location="1" name="80200.72c" path="300K/Hg_200_300K.ace" temperature="2.585e-08" zaid="80200"/>
|
||||
<ace_table alias="Hg-201.72c" awr="199.244" location="1" name="80201.72c" path="300K/Hg_201_300K.ace" temperature="2.585e-08" zaid="80201"/>
|
||||
<ace_table alias="Hg-202.72c" awr="200.236" location="1" name="80202.72c" path="300K/Hg_202_300K.ace" temperature="2.585e-08" zaid="80202"/>
|
||||
<ace_table alias="Hg-204.72c" awr="202.221" location="1" name="80204.72c" path="300K/Hg_204_300K.ace" temperature="2.585e-08" zaid="80204"/>
|
||||
<ace_table alias="Tl-203.72c" awr="201.229" location="1" name="81203.72c" path="300K/Tl_203_300K.ace" temperature="2.585e-08" zaid="81203"/>
|
||||
<ace_table alias="Tl-205.72c" awr="203.214" location="1" name="81205.72c" path="300K/Tl_205_300K.ace" temperature="2.585e-08" zaid="81205"/>
|
||||
<ace_table alias="Pb-204.72c" awr="202.2208" location="1" name="82204.72c" path="300K/Pb_204_300K.ace" temperature="2.585e-08" zaid="82204"/>
|
||||
<ace_table alias="Pb-206.72c" awr="204.205" location="1" name="82206.72c" path="300K/Pb_206_300K.ace" temperature="2.585e-08" zaid="82206"/>
|
||||
<ace_table alias="Pb-207.72c" awr="205.1979" location="1" name="82207.72c" path="300K/Pb_207_300K.ace" temperature="2.585e-08" zaid="82207"/>
|
||||
<ace_table alias="Pb-208.72c" awr="206.19" location="1" name="82208.72c" path="300K/Pb_208_300K.ace" temperature="2.585e-08" zaid="82208"/>
|
||||
<ace_table alias="Bi-209.72c" awr="207.185" location="1" name="83209.72c" path="300K/Bi_209_300K.ace" temperature="2.585e-08" zaid="83209"/>
|
||||
<ace_table alias="Ra-223.72c" awr="221.103" location="1" name="88223.72c" path="300K/Ra_223_300K.ace" temperature="2.585e-08" zaid="88223"/>
|
||||
<ace_table alias="Ra-224.72c" awr="222.096" location="1" name="88224.72c" path="300K/Ra_224_300K.ace" temperature="2.585e-08" zaid="88224"/>
|
||||
<ace_table alias="Ra-225.72c" awr="223.091" location="1" name="88225.72c" path="300K/Ra_225_300K.ace" temperature="2.585e-08" zaid="88225"/>
|
||||
<ace_table alias="Ra-226.72c" awr="224.084" location="1" name="88226.72c" path="300K/Ra_226_300K.ace" temperature="2.585e-08" zaid="88226"/>
|
||||
<ace_table alias="Ac-225.72c" awr="223.09" location="1" name="89225.72c" path="300K/Ac_225_300K.ace" temperature="2.585e-08" zaid="89225"/>
|
||||
<ace_table alias="Ac-226.72c" awr="224.084" location="1" name="89226.72c" path="300K/Ac_226_300K.ace" temperature="2.585e-08" zaid="89226"/>
|
||||
<ace_table alias="Ac-227.72c" awr="225.077" location="1" name="89227.72c" path="300K/Ac_227_300K.ace" temperature="2.585e-08" zaid="89227"/>
|
||||
<ace_table alias="Th-227.72c" awr="225.077" location="1" name="90227.72c" path="300K/Th_227_300K.ace" temperature="2.585e-08" zaid="90227"/>
|
||||
<ace_table alias="Th-228.72c" awr="226.07" location="1" name="90228.72c" path="300K/Th_228_300K.ace" temperature="2.585e-08" zaid="90228"/>
|
||||
<ace_table alias="Th-229.72c" awr="227.064" location="1" name="90229.72c" path="300K/Th_229_300K.ace" temperature="2.585e-08" zaid="90229"/>
|
||||
<ace_table alias="Th-230.72c" awr="228.057" location="1" name="90230.72c" path="300K/Th_230_300K.ace" temperature="2.585e-08" zaid="90230"/>
|
||||
<ace_table alias="Th-231.72c" awr="229.052" location="1" name="90231.72c" path="300K/Th_231_300K.ace" temperature="2.585e-08" zaid="90231"/>
|
||||
<ace_table alias="Th-232.72c" awr="230.045" location="1" name="90232.72c" path="300K/Th_232_300K.ace" temperature="2.585e-08" zaid="90232"/>
|
||||
<ace_table alias="Th-233.72c" awr="231.04" location="1" name="90233.72c" path="300K/Th_233_300K.ace" temperature="2.585e-08" zaid="90233"/>
|
||||
<ace_table alias="Th-234.72c" awr="232.033" location="1" name="90234.72c" path="300K/Th_234_300K.ace" temperature="2.585e-08" zaid="90234"/>
|
||||
<ace_table alias="Pa-229.72c" awr="227.065" location="1" name="91229.72c" path="300K/Pa_229_300K.ace" temperature="2.585e-08" zaid="91229"/>
|
||||
<ace_table alias="Pa-230.72c" awr="228.058" location="1" name="91230.72c" path="300K/Pa_230_300K.ace" temperature="2.585e-08" zaid="91230"/>
|
||||
<ace_table alias="Pa-231.72c" awr="229.051" location="1" name="91231.72c" path="300K/Pa_231_300K.ace" temperature="2.585e-08" zaid="91231"/>
|
||||
<ace_table alias="Pa-232.72c" awr="230.045" location="1" name="91232.72c" path="300K/Pa_232_300K.ace" temperature="2.585e-08" zaid="91232"/>
|
||||
<ace_table alias="Pa-233.72c" awr="231.038" location="1" name="91233.72c" path="300K/Pa_233_300K.ace" temperature="2.585e-08" zaid="91233"/>
|
||||
<ace_table alias="U-230.72c" awr="228.058" location="1" name="92230.72c" path="300K/U_230_300K.ace" temperature="2.585e-08" zaid="92230"/>
|
||||
<ace_table alias="U-231.72c" awr="229.052" location="1" name="92231.72c" path="300K/U_231_300K.ace" temperature="2.585e-08" zaid="92231"/>
|
||||
<ace_table alias="U-232.72c" awr="230.044" location="1" name="92232.72c" path="300K/U_232_300K.ace" temperature="2.585e-08" zaid="92232"/>
|
||||
<ace_table alias="U-233.72c" awr="231.0377" location="1" name="92233.72c" path="300K/U_233_300K.ace" temperature="2.585e-08" zaid="92233"/>
|
||||
<ace_table alias="U-234.72c" awr="232.0304" location="1" name="92234.72c" path="300K/U_234_300K.ace" temperature="2.585e-08" zaid="92234"/>
|
||||
<ace_table alias="U-235.72c" awr="233.0248" location="1" name="92235.72c" path="300K/U_235_300K.ace" temperature="2.585e-08" zaid="92235"/>
|
||||
<ace_table alias="U-236.72c" awr="234.0178" location="1" name="92236.72c" path="300K/U_236_300K.ace" temperature="2.585e-08" zaid="92236"/>
|
||||
<ace_table alias="U-237.72c" awr="235.0124" location="1" name="92237.72c" path="300K/U_237_300K.ace" temperature="2.585e-08" zaid="92237"/>
|
||||
<ace_table alias="U-238.72c" awr="236.0058" location="1" name="92238.72c" path="300K/U_238_300K.ace" temperature="2.585e-08" zaid="92238"/>
|
||||
<ace_table alias="U-239.72c" awr="237.0007" location="1" name="92239.72c" path="300K/U_239_300K.ace" temperature="2.585e-08" zaid="92239"/>
|
||||
<ace_table alias="U-240.72c" awr="237.9944" location="1" name="92240.72c" path="300K/U_240_300K.ace" temperature="2.585e-08" zaid="92240"/>
|
||||
<ace_table alias="U-241.72c" awr="238.9895" location="1" name="92241.72c" path="300K/U_241_300K.ace" temperature="2.585e-08" zaid="92241"/>
|
||||
<ace_table alias="Np-234.72c" awr="232.032" location="1" name="93234.72c" path="300K/Np_234_300K.ace" temperature="2.585e-08" zaid="93234"/>
|
||||
<ace_table alias="Np-235.72c" awr="233.025" location="1" name="93235.72c" path="300K/Np_235_300K.ace" temperature="2.585e-08" zaid="93235"/>
|
||||
<ace_table alias="Np-236.72c" awr="234.019" location="1" name="93236.72c" path="300K/Np_236_300K.ace" temperature="2.585e-08" zaid="93236"/>
|
||||
<ace_table alias="Np-237.72c" awr="235.0118" location="1" name="93237.72c" path="300K/Np_237_300K.ace" temperature="2.585e-08" zaid="93237"/>
|
||||
<ace_table alias="Np-238.72c" awr="236.006" location="1" name="93238.72c" path="300K/Np_238_300K.ace" temperature="2.585e-08" zaid="93238"/>
|
||||
<ace_table alias="Np-239.72c" awr="236.999" location="1" name="93239.72c" path="300K/Np_239_300K.ace" temperature="2.585e-08" zaid="93239"/>
|
||||
<ace_table alias="Pu-236.72c" awr="234.018" location="1" name="94236.72c" path="300K/Pu_236_300K.ace" temperature="2.585e-08" zaid="94236"/>
|
||||
<ace_table alias="Pu-237.72c" awr="235.012" location="1" name="94237.72c" path="300K/Pu_237_300K.ace" temperature="2.585e-08" zaid="94237"/>
|
||||
<ace_table alias="Pu-238.72c" awr="236.0046" location="1" name="94238.72c" path="300K/Pu_238_300K.ace" temperature="2.585e-08" zaid="94238"/>
|
||||
<ace_table alias="Pu-239.72c" awr="236.9986" location="1" name="94239.72c" path="300K/Pu_239_300K.ace" temperature="2.585e-08" zaid="94239"/>
|
||||
<ace_table alias="Pu-240.72c" awr="237.9916" location="1" name="94240.72c" path="300K/Pu_240_300K.ace" temperature="2.585e-08" zaid="94240"/>
|
||||
<ace_table alias="Pu-241.72c" awr="238.978" location="1" name="94241.72c" path="300K/Pu_241_300K.ace" temperature="2.585e-08" zaid="94241"/>
|
||||
<ace_table alias="Pu-242.72c" awr="239.979" location="1" name="94242.72c" path="300K/Pu_242_300K.ace" temperature="2.585e-08" zaid="94242"/>
|
||||
<ace_table alias="Pu-243.72c" awr="240.974" location="1" name="94243.72c" path="300K/Pu_243_300K.ace" temperature="2.585e-08" zaid="94243"/>
|
||||
<ace_table alias="Pu-244.72c" awr="241.967" location="1" name="94244.72c" path="300K/Pu_244_300K.ace" temperature="2.585e-08" zaid="94244"/>
|
||||
<ace_table alias="Pu-246.72c" awr="243.956" location="1" name="94246.72c" path="300K/Pu_246_300K.ace" temperature="2.585e-08" zaid="94246"/>
|
||||
<ace_table alias="Am-240.72c" awr="237.993" location="1" name="95240.72c" path="300K/Am_240_300K.ace" temperature="2.585e-08" zaid="95240"/>
|
||||
<ace_table alias="Am-241.72c" awr="238.986" location="1" name="95241.72c" path="300K/Am_241_300K.ace" temperature="2.585e-08" zaid="95241"/>
|
||||
<ace_table alias="Am-242.72c" awr="239.9801" location="1" name="95242.72c" path="300K/Am_242_300K.ace" temperature="2.585e-08" zaid="95242"/>
|
||||
<ace_table alias="Am-242m.72c" awr="239.9801" location="1" metastable="1" name="95642.72c" path="300K/Am_242m1_300K.ace" temperature="2.585e-08" zaid="95642"/>
|
||||
<ace_table alias="Am-243.72c" awr="240.9734" location="1" name="95243.72c" path="300K/Am_243_300K.ace" temperature="2.585e-08" zaid="95243"/>
|
||||
<ace_table alias="Am-244.72c" awr="241.968" location="1" name="95244.72c" path="300K/Am_244_300K.ace" temperature="2.585e-08" zaid="95244"/>
|
||||
<ace_table alias="Am-244m.72c" awr="241.968" location="1" metastable="1" name="95644.72c" path="300K/Am_244m1_300K.ace" temperature="2.585e-08" zaid="95644"/>
|
||||
<ace_table alias="Cm-240.72c" awr="237.993" location="1" name="96240.72c" path="300K/Cm_240_300K.ace" temperature="2.585e-08" zaid="96240"/>
|
||||
<ace_table alias="Cm-241.72c" awr="238.987" location="1" name="96241.72c" path="300K/Cm_241_300K.ace" temperature="2.585e-08" zaid="96241"/>
|
||||
<ace_table alias="Cm-242.72c" awr="239.979" location="1" name="96242.72c" path="300K/Cm_242_300K.ace" temperature="2.585e-08" zaid="96242"/>
|
||||
<ace_table alias="Cm-243.72c" awr="240.973" location="1" name="96243.72c" path="300K/Cm_243_300K.ace" temperature="2.585e-08" zaid="96243"/>
|
||||
<ace_table alias="Cm-244.72c" awr="241.966" location="1" name="96244.72c" path="300K/Cm_244_300K.ace" temperature="2.585e-08" zaid="96244"/>
|
||||
<ace_table alias="Cm-245.72c" awr="242.96" location="1" name="96245.72c" path="300K/Cm_245_300K.ace" temperature="2.585e-08" zaid="96245"/>
|
||||
<ace_table alias="Cm-246.72c" awr="243.953" location="1" name="96246.72c" path="300K/Cm_246_300K.ace" temperature="2.585e-08" zaid="96246"/>
|
||||
<ace_table alias="Cm-247.72c" awr="244.948" location="1" name="96247.72c" path="300K/Cm_247_300K.ace" temperature="2.585e-08" zaid="96247"/>
|
||||
<ace_table alias="Cm-248.72c" awr="245.941" location="1" name="96248.72c" path="300K/Cm_248_300K.ace" temperature="2.585e-08" zaid="96248"/>
|
||||
<ace_table alias="Cm-249.72c" awr="246.936" location="1" name="96249.72c" path="300K/Cm_249_300K.ace" temperature="2.585e-08" zaid="96249"/>
|
||||
<ace_table alias="Cm-250.72c" awr="247.93" location="1" name="96250.72c" path="300K/Cm_250_300K.ace" temperature="2.585e-08" zaid="96250"/>
|
||||
<ace_table alias="Bk-245.72c" awr="242.961" location="1" name="97245.72c" path="300K/Bk_245_300K.ace" temperature="2.585e-08" zaid="97245"/>
|
||||
<ace_table alias="Bk-246.72c" awr="243.955" location="1" name="97246.72c" path="300K/Bk_246_300K.ace" temperature="2.585e-08" zaid="97246"/>
|
||||
<ace_table alias="Bk-247.72c" awr="244.948" location="1" name="97247.72c" path="300K/Bk_247_300K.ace" temperature="2.585e-08" zaid="97247"/>
|
||||
<ace_table alias="Bk-248.72c" awr="245.942" location="1" name="97248.72c" path="300K/Bk_248_300K.ace" temperature="2.585e-08" zaid="97248"/>
|
||||
<ace_table alias="Bk-249.72c" awr="246.935" location="1" name="97249.72c" path="300K/Bk_249_300K.ace" temperature="2.585e-08" zaid="97249"/>
|
||||
<ace_table alias="Bk-250.72c" awr="247.93" location="1" name="97250.72c" path="300K/Bk_250_300K.ace" temperature="2.585e-08" zaid="97250"/>
|
||||
<ace_table alias="Cf-246.72c" awr="243.955" location="1" name="98246.72c" path="300K/Cf_246_300K.ace" temperature="2.585e-08" zaid="98246"/>
|
||||
<ace_table alias="Cf-248.72c" awr="245.941" location="1" name="98248.72c" path="300K/Cf_248_300K.ace" temperature="2.585e-08" zaid="98248"/>
|
||||
<ace_table alias="Cf-249.72c" awr="246.935" location="1" name="98249.72c" path="300K/Cf_249_300K.ace" temperature="2.585e-08" zaid="98249"/>
|
||||
<ace_table alias="Cf-250.72c" awr="247.928" location="1" name="98250.72c" path="300K/Cf_250_300K.ace" temperature="2.585e-08" zaid="98250"/>
|
||||
<ace_table alias="Cf-251.72c" awr="248.923" location="1" name="98251.72c" path="300K/Cf_251_300K.ace" temperature="2.585e-08" zaid="98251"/>
|
||||
<ace_table alias="Cf-252.72c" awr="249.916" location="1" name="98252.72c" path="300K/Cf_252_300K.ace" temperature="2.585e-08" zaid="98252"/>
|
||||
<ace_table alias="Cf-253.72c" awr="250.911" location="1" name="98253.72c" path="300K/Cf_253_300K.ace" temperature="2.585e-08" zaid="98253"/>
|
||||
<ace_table alias="Cf-254.72c" awr="251.905" location="1" name="98254.72c" path="300K/Cf_254_300K.ace" temperature="2.585e-08" zaid="98254"/>
|
||||
<ace_table alias="Es-251.72c" awr="248.923" location="1" name="99251.72c" path="300K/Es_251_300K.ace" temperature="2.585e-08" zaid="99251"/>
|
||||
<ace_table alias="Es-252.72c" awr="249.917" location="1" name="99252.72c" path="300K/Es_252_300K.ace" temperature="2.585e-08" zaid="99252"/>
|
||||
<ace_table alias="Es-253.72c" awr="250.911" location="1" name="99253.72c" path="300K/Es_253_300K.ace" temperature="2.585e-08" zaid="99253"/>
|
||||
<ace_table alias="Es-254.72c" awr="251.905" location="1" name="99254.72c" path="300K/Es_254_300K.ace" temperature="2.585e-08" zaid="99254"/>
|
||||
<ace_table alias="Es-254m.72c" awr="251.905" location="1" metastable="1" name="99654.72c" path="300K/Es_254m1_300K.ace" temperature="2.585e-08" zaid="99654"/>
|
||||
<ace_table alias="Es-255.72c" awr="252.899" location="1" name="99255.72c" path="300K/Es_255_300K.ace" temperature="2.585e-08" zaid="99255"/>
|
||||
<ace_table alias="Fm-255.72c" awr="252.899" location="1" name="100255.72c" path="300K/Fm_255_300K.ace" temperature="2.585e-08" zaid="100255"/>
|
||||
<ace_table awr="26.74975" location="1" name="Al.71t" path="tsl/al.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="8.93478" location="1" name="BeBeO.71t" path="tsl/bebeo.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="8.93478" location="1" name="Be.71t" path="tsl/be.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="Benz.71t" path="tsl/benzine.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="1.9968" location="1" name="DD2O.71t" path="tsl/dd2o.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="55.454" location="1" name="Fe.71t" path="tsl/fe.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="11.898" location="1" name="Graph.71t" path="tsl/graphite.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="HCH2.71t" path="tsl/hch2.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="HH2O.71t" path="tsl/hh2o.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="HZrH.71t" path="tsl/hzrh.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="lCH4.71t" path="tsl/lch4.acer" temperature="8.617e-09" zaid="0"/>
|
||||
<ace_table awr="15.85751" location="1" name="OBeO.71t" path="tsl/obeo.acer" temperature="2.53e-08" zaid="0"/>
|
||||
<ace_table awr="1.9968" location="1" name="orthoD.71t" path="tsl/orthod.acer" temperature="1.637e-09" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="orthoH.71t" path="tsl/orthoh.acer" temperature="1.723e-09" zaid="0"/>
|
||||
<ace_table awr="15.85751" location="1" name="OUO2.71t" path="tsl/ouo2.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="1.9968" location="1" name="paraD.71t" path="tsl/parad.acer" temperature="1.637e-09" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="paraH.71t" path="tsl/parah.acer" temperature="1.723e-09" zaid="0"/>
|
||||
<ace_table awr="0.999167" location="1" name="sCH4.71t" path="tsl/sch4.acer" temperature="1.896e-09" zaid="0"/>
|
||||
<ace_table awr="236.0058" location="1" name="UUO2.71t" path="tsl/uuo2.acer" temperature="2.551e-08" zaid="0"/>
|
||||
<ace_table awr="89.1324" location="1" name="ZrZrH.71t" path="tsl/zrzrh.acer" temperature="2.551e-08" zaid="0"/>
|
||||
</cross_sections>
|
||||
File diff suppressed because it is too large
Load diff
BIN
data/fission_Q_data_endfb71.h5
Normal file
BIN
data/fission_Q_data_endfb71.h5
Normal file
Binary file not shown.
226
data/get_jeff_data.py
Executable file
226
data/get_jeff_data.py
Executable file
|
|
@ -0,0 +1,226 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function
|
||||
import os
|
||||
from collections import defaultdict
|
||||
import sys
|
||||
import tarfile
|
||||
import zipfile
|
||||
import glob
|
||||
import argparse
|
||||
from string import digits
|
||||
|
||||
import openmc.data
|
||||
|
||||
try:
|
||||
from urllib.request import urlopen
|
||||
except ImportError:
|
||||
from urllib2 import urlopen
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
askuser = raw_input
|
||||
else:
|
||||
askuser = input
|
||||
|
||||
|
||||
download_warning = """
|
||||
WARNING: This script will download approximately 9 GB of data. Extracting and
|
||||
processing the data may require as much as 40 GB of additional free disk
|
||||
space. Note that if you don't need all 11 temperatures, you can modify the
|
||||
'files' list in the script to download only the data you want.
|
||||
|
||||
Are you sure you want to continue? ([y]/n)
|
||||
"""
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('-b', '--batch', action='store_true',
|
||||
help='supresses standard in')
|
||||
parser.add_argument('-d', '--destination', default='jeff-3.2-hdf5',
|
||||
help='Directory to create new library in')
|
||||
args = parser.parse_args()
|
||||
|
||||
response = askuser(download_warning) if not args.batch else 'y'
|
||||
if response.lower().startswith('n'):
|
||||
sys.exit()
|
||||
|
||||
base_url = 'https://www.oecd-nea.org/dbforms/data/eva/evatapes/jeff_32/Processed/'
|
||||
files = ['JEFF32-ACE-293K.tar.gz',
|
||||
'JEFF32-ACE-400K.tar.gz',
|
||||
'JEFF32-ACE-500K.tar.gz',
|
||||
'JEFF32-ACE-600K.tar.gz',
|
||||
'JEFF32-ACE-700K.tar.gz',
|
||||
'JEFF32-ACE-800K.zip',
|
||||
'JEFF32-ACE-900K.tar.gz',
|
||||
'JEFF32-ACE-1000K.tar.gz',
|
||||
'JEFF32-ACE-1200K.tar.gz',
|
||||
'JEFF32-ACE-1500K.tar.gz',
|
||||
'JEFF32-ACE-1800K.tar.gz',
|
||||
'TSLs.tar.gz']
|
||||
|
||||
block_size = 16384
|
||||
|
||||
# ==============================================================================
|
||||
# DOWNLOAD FILES FROM OECD SITE
|
||||
|
||||
files_complete = []
|
||||
for f in files:
|
||||
# Establish connection to URL
|
||||
url = base_url + f
|
||||
req = urlopen(url)
|
||||
|
||||
# Get file size from header
|
||||
if sys.version_info[0] < 3:
|
||||
file_size = int(req.info().getheaders('Content-Length')[0])
|
||||
else:
|
||||
file_size = req.length
|
||||
downloaded = 0
|
||||
|
||||
# Check if file already downloaded
|
||||
if os.path.exists(f):
|
||||
if os.path.getsize(f) == file_size:
|
||||
print('Skipping {}, already downloaded'.format(f))
|
||||
files_complete.append(f)
|
||||
continue
|
||||
else:
|
||||
overwrite = askuser('Overwrite {}? ([y]/n) '.format(f))
|
||||
if overwrite.lower().startswith('n'):
|
||||
continue
|
||||
|
||||
# Copy file to disk
|
||||
print('Downloading {}... '.format(f), end='')
|
||||
with open(f, 'wb') as fh:
|
||||
while True:
|
||||
chunk = req.read(block_size)
|
||||
if not chunk: break
|
||||
fh.write(chunk)
|
||||
downloaded += len(chunk)
|
||||
status = '{:10} [{:3.2f}%]'.format(downloaded, downloaded * 100. / file_size)
|
||||
print(status + chr(8)*len(status), end='')
|
||||
print('')
|
||||
files_complete.append(f)
|
||||
|
||||
# ==============================================================================
|
||||
# EXTRACT FILES FROM TGZ
|
||||
|
||||
for f in files:
|
||||
if f not in files_complete:
|
||||
continue
|
||||
|
||||
# Extract files
|
||||
if f.endswith('.zip'):
|
||||
with zipfile.ZipFile(f, 'r') as zipf:
|
||||
print('Extracting {}...'.format(f))
|
||||
zipf.extractall('jeff-3.2')
|
||||
|
||||
else:
|
||||
suffix = 'ACEs_293K' if '293' in f else ''
|
||||
with tarfile.open(f, 'r') as tgz:
|
||||
print('Extracting {}...'.format(f))
|
||||
tgz.extractall(os.path.join('jeff-3.2', suffix))
|
||||
|
||||
# Remove thermal scattering tables from 293K data since they are
|
||||
# redundant
|
||||
if '293' in f:
|
||||
for path in glob.glob(os.path.join('jeff-3.2', 'ACEs_293K', '*-293.ACE')):
|
||||
os.remove(path)
|
||||
|
||||
# ==============================================================================
|
||||
# CHANGE ZAID FOR METASTABLES
|
||||
|
||||
metastables = glob.glob(os.path.join('jeff-3.2', '**', '*M.ACE'))
|
||||
for path in metastables:
|
||||
print(' Fixing {} (ensure metastable)...'.format(path))
|
||||
text = open(path, 'r').read()
|
||||
mass_first_digit = int(text[3])
|
||||
if mass_first_digit <= 2:
|
||||
text = text[:3] + str(mass_first_digit + 4) + text[4:]
|
||||
open(path, 'w').write(text)
|
||||
|
||||
# ==============================================================================
|
||||
# GENERATE HDF5 LIBRARY -- NEUTRON FILES
|
||||
|
||||
# Get a list of all ACE files
|
||||
neutron_files = glob.glob(os.path.join('jeff-3.2', '*', '*.ACE'))
|
||||
|
||||
# Group together tables for same nuclide
|
||||
tables = defaultdict(list)
|
||||
for filename in sorted(neutron_files):
|
||||
dirname, basename = os.path.split(filename)
|
||||
name = basename.split('.')[0]
|
||||
tables[name].append(filename)
|
||||
|
||||
# Sort temperatures from lowest to highest
|
||||
for name, filenames in sorted(tables.items()):
|
||||
filenames.sort(key=lambda x: int(
|
||||
x.split(os.path.sep)[1].split('_')[1][:-1]))
|
||||
|
||||
# Create output directory if it doesn't exist
|
||||
if not os.path.isdir(args.destination):
|
||||
os.mkdir(args.destination)
|
||||
|
||||
library = openmc.data.DataLibrary()
|
||||
|
||||
for name, filenames in sorted(tables.items()):
|
||||
# Convert first temperature for the table
|
||||
print('Converting: ' + filenames[0])
|
||||
data = openmc.data.IncidentNeutron.from_ace(filenames[0])
|
||||
|
||||
# For each higher temperature, add cross sections to the existing table
|
||||
for filename in filenames[1:]:
|
||||
print('Adding: ' + filename)
|
||||
data.add_temperature_from_ace(filename)
|
||||
|
||||
# Export HDF5 file
|
||||
h5_file = os.path.join(args.destination, data.name + '.h5')
|
||||
print('Writing {}...'.format(h5_file))
|
||||
data.export_to_hdf5(h5_file, 'w')
|
||||
|
||||
# Register with library
|
||||
library.register_file(h5_file)
|
||||
|
||||
# ==============================================================================
|
||||
# GENERATE HDF5 LIBRARY -- S(A,B) FILES
|
||||
|
||||
sab_files = glob.glob(os.path.join('jeff-3.2', 'ANNEX_6_3_STLs', '*', '*.ace'))
|
||||
|
||||
# Group together tables for same nuclide
|
||||
tables = defaultdict(list)
|
||||
for filename in sorted(sab_files):
|
||||
dirname, basename = os.path.split(filename)
|
||||
name = basename.split('-')[0]
|
||||
tables[name].append(filename)
|
||||
|
||||
# Sort temperatures from lowest to highest
|
||||
for name, filenames in sorted(tables.items()):
|
||||
filenames.sort(key=lambda x: int(
|
||||
os.path.split(x)[1].split('-')[1].split('.')[0]))
|
||||
|
||||
for name, filenames in sorted(tables.items()):
|
||||
# Convert first temperature for the table
|
||||
print('Converting: ' + filenames[0])
|
||||
|
||||
# Take numbers out of table name, e.g. lw10.32t -> lw.32t
|
||||
table = openmc.data.ace.get_table(filenames[0])
|
||||
name, xs = table.name.split('.')
|
||||
table.name = '.'.join((name.strip(digits), xs))
|
||||
data = openmc.data.ThermalScattering.from_ace(table)
|
||||
|
||||
# For each higher temperature, add cross sections to the existing table
|
||||
for filename in filenames[1:]:
|
||||
print('Adding: ' + filename)
|
||||
table = openmc.data.ace.get_table(filename)
|
||||
name, xs = table.name.split('.')
|
||||
table.name = '.'.join((name.strip(digits), xs))
|
||||
data.add_temperature_from_ace(table)
|
||||
|
||||
# Export HDF5 file
|
||||
h5_file = os.path.join(args.destination, data.name + '.h5')
|
||||
print('Writing {}...'.format(h5_file))
|
||||
data.export_to_hdf5(h5_file, 'w')
|
||||
|
||||
# Register with library
|
||||
library.register_file(h5_file)
|
||||
|
||||
# Write cross_sections.xml
|
||||
libpath = os.path.join(args.destination, 'cross_sections.xml')
|
||||
library.export_to_xml(libpath)
|
||||
|
|
@ -11,8 +11,8 @@ import hashlib
|
|||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('-b', '--batch', action = 'store_true',
|
||||
help = 'supresses standard in')
|
||||
parser.add_argument('-b', '--batch', action='store_true',
|
||||
help='supresses standard in')
|
||||
args = parser.parse_args()
|
||||
|
||||
try:
|
||||
|
|
@ -25,7 +25,7 @@ sys.path.insert(0, os.path.join(cwd, '..'))
|
|||
|
||||
baseUrl = 'https://github.com/smharper/windowed_multipole_library/blob/master/'
|
||||
files = ['multipole_lib.tar.gz?raw=true']
|
||||
checksums = ['9f0307132fe5beca78b8fc7a01fb401c']
|
||||
checksums = ['3985aea96f7162a9419c7ed8352e6abb']
|
||||
block_size = 16384
|
||||
|
||||
# ==============================================================================
|
||||
|
|
@ -92,7 +92,7 @@ for f, checksum in zip(files, checksums):
|
|||
|
||||
for f in files:
|
||||
fname = f[:-9] if f.endswith('?raw=true') else f
|
||||
if not fname in filesComplete:
|
||||
if fname not in filesComplete:
|
||||
continue
|
||||
|
||||
# Extract files
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@ import hashlib
|
|||
import argparse
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('-b', '--batch', action = 'store_true',
|
||||
help = 'supresses standard in')
|
||||
parser.add_argument('-b', '--batch', action='store_true',
|
||||
help='supresses standard in')
|
||||
args = parser.parse_args()
|
||||
|
||||
try:
|
||||
|
|
@ -20,10 +20,6 @@ try:
|
|||
except ImportError:
|
||||
from urllib2 import urlopen
|
||||
|
||||
cwd = os.getcwd()
|
||||
sys.path.insert(0, os.path.join(cwd, '..'))
|
||||
from openmc.ace import ascii_to_binary
|
||||
|
||||
baseUrl = 'http://www.nndc.bnl.gov/endf/b7.1/aceFiles/'
|
||||
files = ['ENDF-B-VII.1-neutron-293.6K.tar.gz',
|
||||
'ENDF-B-VII.1-tsl.tar.gz']
|
||||
|
|
@ -90,7 +86,7 @@ for f, checksum in zip(files, checksums):
|
|||
# EXTRACT FILES FROM TGZ
|
||||
|
||||
for f in files:
|
||||
if not f in filesComplete:
|
||||
if f not in filesComplete:
|
||||
continue
|
||||
|
||||
# Extract files
|
||||
|
|
@ -114,12 +110,6 @@ text = text.replace('6012', '6000', 1)
|
|||
with open(graphite, 'w') as fh:
|
||||
fh.write(text)
|
||||
|
||||
# ==============================================================================
|
||||
# COPY CROSS_SECTIONS.XML
|
||||
|
||||
print('Copying cross_sections_nndc.xml...')
|
||||
shutil.copyfile('cross_sections_nndc.xml', 'nndc/cross_sections.xml')
|
||||
|
||||
# ==============================================================================
|
||||
# PROMPT USER TO DELETE .TAR.GZ FILES
|
||||
|
||||
|
|
@ -140,44 +130,27 @@ if not response or response.lower().startswith('y'):
|
|||
os.remove(f)
|
||||
|
||||
# ==============================================================================
|
||||
# PROMPT USER TO CONVERT ASCII TO BINARY
|
||||
# PROMPT USER TO GENERATE HDF5 LIBRARY
|
||||
|
||||
# Ask user to convert
|
||||
if not args.batch:
|
||||
if sys.version_info[0] < 3:
|
||||
response = raw_input('Convert ACE files to binary? ([y]/n) ')
|
||||
response = raw_input('Generate HDF5 library? ([y]/n) ')
|
||||
else:
|
||||
response = input('Convert ACE files to binary? ([y]/n) ')
|
||||
response = input('Generate HDF5 library? ([y]/n) ')
|
||||
else:
|
||||
response = 'y'
|
||||
|
||||
# Convert files if requested
|
||||
if not response or response.lower().startswith('y'):
|
||||
# get a list of all ACE files
|
||||
ace_files = sorted(glob.glob(os.path.join('nndc', '**', '*.ace*')))
|
||||
|
||||
# get a list of directories
|
||||
ace_dirs = glob.glob(os.path.join('nndc', '*K'))
|
||||
ace_dirs += glob.glob(os.path.join('nndc', 'tsl'))
|
||||
# Ensure 'import openmc.data' works in the openmc-ace-to-xml script
|
||||
cwd = os.getcwd()
|
||||
env = os.environ.copy()
|
||||
env['PYTHONPATH'] = os.path.join(cwd, '..')
|
||||
|
||||
# loop around ace directories
|
||||
for d in ace_dirs:
|
||||
print('Converting {0}...'.format(d))
|
||||
|
||||
# get a list of files to convert
|
||||
ace_files = glob.glob(os.path.join(d, '*.ace*'))
|
||||
|
||||
# convert files
|
||||
for f in ace_files:
|
||||
print(' Converting {0}...'.format(os.path.split(f)[1]))
|
||||
ascii_to_binary(f, f)
|
||||
|
||||
# Change cross_sections.xml file
|
||||
xs_file = os.path.join('nndc', 'cross_sections.xml')
|
||||
asc_str = "<filetype>ascii</filetype>"
|
||||
bin_str = "<filetype> binary </filetype>\n "
|
||||
bin_str += "<record_length> 4096 </record_length>\n "
|
||||
bin_str += "<entries> 512 </entries>"
|
||||
with open(xs_file) as fh:
|
||||
text = fh.read()
|
||||
text = text.replace(asc_str, bin_str)
|
||||
with open(xs_file, 'w') as fh:
|
||||
fh.write(text)
|
||||
subprocess.call(['../scripts/openmc-ace-to-hdf5', '-d', 'nndc_hdf5',
|
||||
'--fission_energy_release', 'fission_Q_data_endfb71.h5']
|
||||
+ ace_files, env=env)
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 8.7 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 6.8 KiB |
BIN
docs/source/_images/openmc_logo.png
Normal file
BIN
docs/source/_images/openmc_logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
60
docs/source/_images/openmc_logo.svg
Normal file
60
docs/source/_images/openmc_logo.svg
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="257.157px" height="60px" viewBox="0 0 257.157 60" enable-background="new 0 0 257.157 60" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path fill="#656565" d="M81.676,48.809c-2.67,0-5.128-0.469-7.367-1.409c-2.243-0.937-4.179-2.206-5.81-3.805
|
||||
c-1.632-1.601-2.901-3.477-3.807-5.638c-0.908-2.158-1.36-4.475-1.36-6.947v-0.099c0-2.472,0.46-4.788,1.385-6.945
|
||||
c0.922-2.159,2.199-4.057,3.832-5.688c1.63-1.631,3.576-2.916,5.834-3.856s4.724-1.409,7.392-1.409
|
||||
c2.67,0,5.125,0.469,7.367,1.409s4.179,2.21,5.812,3.808c1.63,1.6,2.899,3.479,3.805,5.637c0.907,2.161,1.361,4.476,1.361,6.947
|
||||
v0.099c0,2.472-0.463,4.79-1.385,6.945c-0.922,2.161-2.2,4.059-3.832,5.688c-1.63,1.629-3.576,2.918-5.834,3.854
|
||||
C86.81,48.34,84.344,48.809,81.676,48.809z M81.773,41.788c1.517,0,2.918-0.279,4.203-0.839c1.286-0.561,2.382-1.336,3.288-2.325
|
||||
c0.907-0.986,1.614-2.131,2.126-3.437c0.512-1.302,0.768-2.694,0.768-4.178v-0.099c0-1.481-0.256-2.883-0.768-4.202
|
||||
c-0.512-1.318-1.235-2.475-2.175-3.461c-0.94-0.991-2.053-1.771-3.338-2.35c-1.285-0.576-2.687-0.864-4.201-0.864
|
||||
c-1.552,0-2.958,0.279-4.228,0.838c-1.27,0.562-2.358,1.336-3.264,2.327c-0.907,0.987-1.616,2.132-2.125,3.436
|
||||
c-0.511,1.303-0.768,2.693-0.768,4.178v0.099c0,1.483,0.257,2.884,0.768,4.205c0.51,1.318,1.234,2.47,2.175,3.46
|
||||
c0.939,0.988,2.042,1.772,3.313,2.347C78.815,41.499,80.224,41.788,81.773,41.788z"/>
|
||||
<path fill="#656565" d="M102.145,21.715h7.516v3.808c0.924-1.253,2.035-2.283,3.338-3.09c1.301-0.809,2.942-1.211,4.92-1.211
|
||||
c1.549,0,3.048,0.297,4.498,0.889c1.453,0.594,2.737,1.475,3.859,2.645c1.119,1.17,2.019,2.604,2.694,4.301
|
||||
c0.675,1.7,1.013,3.652,1.013,5.859v0.1c0,2.209-0.338,4.162-1.013,5.858c-0.675,1.697-1.565,3.133-2.67,4.301
|
||||
c-1.105,1.173-2.381,2.054-3.832,2.648c-1.452,0.594-2.966,0.889-4.548,0.889c-2.012,0-3.667-0.397-4.971-1.187
|
||||
c-1.302-0.79-2.396-1.712-3.287-2.768v11.371h-7.516V21.715z M115.989,42.332c0.889,0,1.722-0.172,2.498-0.518
|
||||
c0.773-0.348,1.458-0.843,2.051-1.484c0.592-0.641,1.064-1.408,1.409-2.298c0.347-0.89,0.52-1.896,0.52-3.018v-0.1
|
||||
c0-1.087-0.173-2.082-0.52-2.99c-0.345-0.907-0.816-1.682-1.409-2.325c-0.593-0.642-1.278-1.137-2.051-1.482
|
||||
c-0.776-0.345-1.609-0.52-2.498-0.52s-1.722,0.175-2.496,0.52c-0.775,0.346-1.451,0.841-2.028,1.482
|
||||
c-0.577,0.644-1.037,1.418-1.385,2.325c-0.345,0.908-0.518,1.903-0.518,2.99v0.1c0,1.087,0.173,2.086,0.518,2.991
|
||||
c0.348,0.906,0.808,1.684,1.385,2.324c0.577,0.642,1.253,1.137,2.028,1.484C114.267,42.16,115.101,42.332,115.989,42.332z"/>
|
||||
<path fill="#656565" d="M145.62,48.809c-1.979,0-3.814-0.329-5.514-0.986c-1.696-0.661-3.162-1.6-4.399-2.816
|
||||
c-1.237-1.223-2.199-2.666-2.891-4.331c-0.693-1.661-1.041-3.517-1.041-5.559v-0.102c0-1.877,0.321-3.658,0.964-5.34
|
||||
c0.645-1.682,1.543-3.147,2.695-4.4c1.154-1.251,2.53-2.241,4.129-2.967c1.6-0.725,3.37-1.086,5.316-1.086
|
||||
c2.206,0,4.118,0.394,5.733,1.187c1.617,0.791,2.958,1.854,4.03,3.188c1.072,1.335,1.864,2.867,2.374,4.598
|
||||
c0.511,1.731,0.766,3.537,0.766,5.417c0,0.295-0.008,0.61-0.024,0.938c-0.016,0.331-0.04,0.676-0.074,1.038h-18.442
|
||||
c0.364,1.716,1.112,3.009,2.25,3.881c1.138,0.873,2.547,1.313,4.228,1.313c1.251,0,2.373-0.216,3.363-0.646
|
||||
c0.988-0.427,2.01-1.118,3.064-2.076l4.304,3.81c-1.254,1.547-2.771,2.76-4.552,3.633C150.12,48.372,148.026,48.809,145.62,48.809
|
||||
z M150.464,32.89c-0.227-1.681-0.821-3.042-1.777-4.08c-0.956-1.037-2.226-1.557-3.807-1.557c-1.582,0-2.861,0.512-3.832,1.53
|
||||
c-0.973,1.023-1.607,2.393-1.904,4.106H150.464z"/>
|
||||
<path fill="#656565" d="M159.415,21.715h7.518v3.787c0.428-0.562,0.896-1.103,1.408-1.616c0.512-0.517,1.08-0.971,1.706-1.371
|
||||
c0.625-0.397,1.318-0.712,2.078-0.946c0.757-0.233,1.613-0.347,2.569-0.347c2.867,0,5.084,0.873,6.65,2.619
|
||||
c1.565,1.746,2.35,4.152,2.35,7.219v17.156h-7.518V33.471c0-1.776-0.395-3.118-1.186-4.021c-0.792-0.903-1.913-1.355-3.361-1.355
|
||||
c-1.451,0-2.598,0.452-3.437,1.355c-0.841,0.903-1.261,2.245-1.261,4.021v14.745h-7.518V21.715z"/>
|
||||
<path fill="#A31F34" d="M187.056,13.607h8.209l9.095,14.634l9.099-14.634h8.207v34.608h-7.513V25.619l-9.742,14.784h-0.196
|
||||
l-9.645-14.634v22.446h-7.514V13.607z"/>
|
||||
<path fill="#A31F34" d="M242.235,48.809c-2.537,0-4.893-0.459-7.071-1.385c-2.175-0.922-4.052-2.18-5.636-3.78
|
||||
c-1.583-1.601-2.819-3.485-3.709-5.66c-0.888-2.179-1.333-4.501-1.333-6.974v-0.099c0-2.472,0.445-4.788,1.333-6.945
|
||||
c0.89-2.159,2.126-4.057,3.709-5.688c1.584-1.631,3.477-2.916,5.687-3.856c2.207-0.94,4.647-1.409,7.317-1.409
|
||||
c1.613,0,3.091,0.132,4.425,0.396c1.336,0.265,2.547,0.625,3.635,1.089c1.088,0.461,2.093,1.021,3.016,1.682
|
||||
c0.923,0.657,1.781,1.385,2.57,2.175l-4.846,5.586c-1.349-1.218-2.728-2.175-4.128-2.866c-1.401-0.692-2.974-1.038-4.721-1.038
|
||||
c-1.453,0-2.793,0.279-4.03,0.838c-1.235,0.562-2.299,1.336-3.188,2.327c-0.89,0.987-1.582,2.132-2.077,3.436
|
||||
c-0.494,1.303-0.742,2.693-0.742,4.178v0.099c0,1.483,0.248,2.884,0.742,4.205c0.495,1.318,1.178,2.47,2.053,3.46
|
||||
c0.872,0.988,1.929,1.772,3.164,2.347c1.235,0.576,2.594,0.865,4.079,0.865c1.979,0,3.65-0.362,5.02-1.086
|
||||
c1.366-0.726,2.726-1.714,4.079-2.968l4.844,4.895c-0.89,0.958-1.814,1.814-2.768,2.571c-0.958,0.758-2.003,1.411-3.142,1.953
|
||||
c-1.136,0.544-2.379,0.959-3.733,1.236C245.433,48.669,243.915,48.809,242.235,48.809z"/>
|
||||
</g>
|
||||
<path fill="#A31F34" d="M30.614,1.024c-10.866,0-20.325,5.991-25.284,14.845h20.495l13.167,22.804l-11.609,20.11
|
||||
c1.062,0.119,2.139,0.192,3.231,0.192c16.003,0,28.975-12.972,28.975-28.976C59.589,13.997,46.617,1.024,30.614,1.024z"/>
|
||||
<path fill="#656565" d="M16.416,55.243h5.807l9.567-16.57l-9.567-16.566H3.093l-0.607,1.052C1.954,25.355,1.639,27.638,1.639,30
|
||||
C1.639,40.84,7.603,50.274,16.416,55.243z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.9 KiB |
|
|
@ -8,3 +8,15 @@
|
|||
max-width: 100%;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.wy-plain-list-disc, .rst-content .section ul, .rst-content .toctree-wrapper ul, article ul {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.wy-table, .rst-content table.docutils, .rst-content table.field-list {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.wy-side-nav-search {
|
||||
background-color: #343131;
|
||||
}
|
||||
|
|
|
|||
8
docs/source/_templates/myclassinherit.rst
Normal file
8
docs/source/_templates/myclassinherit.rst
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{{ fullname }}
|
||||
{{ underline }}
|
||||
|
||||
.. currentmodule:: {{ module }}
|
||||
|
||||
.. autoclass:: {{ objname }}
|
||||
:members:
|
||||
:inherited-members:
|
||||
|
|
@ -24,9 +24,13 @@ except ImportError:
|
|||
from mock import Mock as MagicMock
|
||||
|
||||
|
||||
MOCK_MODULES = ['numpy', 'h5py', 'pandas', 'opencg']
|
||||
MOCK_MODULES = ['numpy', 'numpy.polynomial', 'numpy.polynomial.polynomial',
|
||||
'h5py', 'pandas', 'opencg']
|
||||
sys.modules.update((mod_name, MagicMock()) for mod_name in MOCK_MODULES)
|
||||
|
||||
import numpy as np
|
||||
np.polynomial.Polynomial = MagicMock
|
||||
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
|
|
@ -69,9 +73,9 @@ copyright = u'2011-2016, Massachusetts Institute of Technology'
|
|||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = "0.7"
|
||||
version = "0.8"
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = "0.7.1"
|
||||
release = "0.8.0"
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
|
@ -125,7 +129,7 @@ if not on_rtd:
|
|||
html_theme = 'sphinx_rtd_theme'
|
||||
html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
|
||||
|
||||
html_logo = '_images/openmc200px.png'
|
||||
html_logo = '_images/openmc_logo.png'
|
||||
|
||||
# The name for this set of Sphinx documents. If None, it defaults to
|
||||
# "<project> v<release> documentation".
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@ The OpenMC Monte Carlo Code
|
|||
OpenMC is a Monte Carlo particle transport simulation code focused on neutron
|
||||
criticality calculations. It is capable of simulating 3D models based on
|
||||
constructive solid geometry with second-order surfaces. OpenMC supports either
|
||||
continuous-energy or multi-group transport. The continuous-energy
|
||||
particle interaction data is based on ACE format cross sections, also used
|
||||
in the MCNP and Serpent Monte Carlo codes.
|
||||
continuous-energy or multi-group transport. The continuous-energy particle
|
||||
interaction data is based on a native HDF5 format that can be generated from ACE
|
||||
files used by the MCNP and Serpent Monte Carlo codes.
|
||||
|
||||
OpenMC was originally developed by members of the `Computational Reactor Physics
|
||||
Group`_ at the `Massachusetts Institute of Technology`_ starting
|
||||
|
|
|
|||
|
|
@ -1,8 +1,11 @@
|
|||
.. _io_data_wmp:
|
||||
|
||||
==========================================
|
||||
The Windowed Multipole Library Format v0.2
|
||||
==========================================
|
||||
=================================
|
||||
Windowed Multipole Library Format
|
||||
=================================
|
||||
|
||||
**/version** (*char[]*)
|
||||
The format version of the file. The current version is "v0.2"
|
||||
|
||||
**/nuclide/**
|
||||
- **broaden_poly** (*int[]*)
|
||||
|
|
@ -12,14 +15,17 @@ The Windowed Multipole Library Format v0.2
|
|||
Curve fit coefficients. Indexed by (reaction type, coefficient index,
|
||||
window index).
|
||||
- **data** (*complex[][]*)
|
||||
Complex poles and residues. Each pole has a corresponding set of
|
||||
residues. For example, the `i`th pole and corresponding residues are
|
||||
stored as `data[:,i] = [pole, residue_1, residue_2, ...]`. The
|
||||
residues are in the order: total, competitive if present, absorption,
|
||||
fission. Complex numbers are stored by forming a type with `"r"` and
|
||||
`"i"` identifiers, similar to how `h5py` does it.
|
||||
- **start_E** (*double*)
|
||||
Lowest energy the windowed multipole part of the library is valid for.
|
||||
Complex poles and residues. Each pole has a corresponding set of
|
||||
residues. For example, the :math:`i`-th pole and corresponding residues
|
||||
are stored as
|
||||
|
||||
.. math::
|
||||
\text{data}[:,i] = [\text{pole},~\text{residue}_1,~\text{residue}_2,
|
||||
~\ldots]
|
||||
|
||||
The residues are in the order: total, competitive if present,
|
||||
absorption, fission. Complex numbers are stored by forming a type with
|
||||
":math:`r`" and ":math:`i`" identifiers, similar to how `h5py`_ does it.
|
||||
- **end_E** (*double*)
|
||||
Highest energy the windowed multipole part of the library is valid for.
|
||||
- **energy_points** (*double[]*)
|
||||
|
|
@ -59,24 +65,27 @@ The Windowed Multipole Library Format v0.2
|
|||
Number of possible :math:`l` quantum states for this nuclide.
|
||||
- **pseudo_K0RS** (*double[]*)
|
||||
:math:`l` dependent value of
|
||||
|
||||
|
||||
.. math::
|
||||
\sqrt{\frac{2 m_n}{\hbar}}\frac{AWR}{AWR + 1} r_{s,l}
|
||||
|
||||
|
||||
Where :math:`m_n` is mass of neutron, :math:`AWR` is the atomic weight
|
||||
ratio of the target to the neutron, and :math:`r_{s,l}` is the
|
||||
scattering radius for a given :math:`l`.
|
||||
- **spacing** (*double*)
|
||||
.. math::
|
||||
\frac{\sqrt{E_{max}}- \sqrt{E_{min}}}{n_w}
|
||||
|
||||
|
||||
Where :math:`E_{max}` is the maximum energy the windows go up to. This
|
||||
is not equivalent to the maximum energy for which the windowed multipole
|
||||
data is valid for. It is slightly higher to ensure an integer number of
|
||||
windows. :math:`E_{min}` is the minimum energy and equivalent to
|
||||
`start_E`, and :math:`n_w` is the number of windows, given by `windows`.
|
||||
``start_E``, and :math:`n_w` is the number of windows, given by
|
||||
``windows``.
|
||||
- **sqrtAWR** (*double*)
|
||||
Square root of the atomic weight ratio.
|
||||
- **start_E** (*double*)
|
||||
Lowest energy the windowed multipole part of the library is valid for.
|
||||
- **w_start** (*int[]*)
|
||||
The pole to start from for each window.
|
||||
- **w_end** (*int[]*)
|
||||
|
|
@ -87,6 +96,7 @@ The Windowed Multipole Library Format v0.2
|
|||
**/nuclide/reactions/MT<i>**
|
||||
- **MT_sigma** (*double[]*) -- Cross section value for this reaction.
|
||||
- **Q_value** (*double*) -- Energy released in this reaction, in eV.
|
||||
- **threshold** (*int*) -- The first non-zero entry in `MT_sigma`.
|
||||
- **threshold** (*int*) -- The first non-zero entry in ``MT_sigma``.
|
||||
|
||||
.. _h5py: http://docs.h5py.org/en/latest/
|
||||
.. _ENDF-6: https://www.oecd-nea.org/dbdata/data/manual-endf/endf102.pdf
|
||||
|
|
|
|||
53
docs/source/io_formats/fission_energy.rst
Normal file
53
docs/source/io_formats/fission_energy.rst
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
.. _usersguide_fission_energy:
|
||||
|
||||
==================================
|
||||
Fission Energy Release File Format
|
||||
==================================
|
||||
|
||||
This file is a compact HDF5 representation of the ENDF MT=1, MF=458 data (see
|
||||
ENDF-102_ for details). It gives the information needed to compute the energy
|
||||
carried away from fission reactions by each reaction product (e.g. fragment
|
||||
nuclei, neutrons) which depends on the incident neutron energy. OpenMC is
|
||||
distributed with one of these files under
|
||||
data/fission_Q_data_endfb71.h5. More files of this format can be created from
|
||||
ENDF files with the
|
||||
``openmc.data.write_compact_458_library`` function. They can be read with the
|
||||
``openmc.data.FissionEnergyRelease.from_compact_hdf5`` class method.
|
||||
|
||||
:Attributes: - **comment** (*char[]*) -- An optional text comment
|
||||
- **component order** (*char[][]*) -- An array of strings
|
||||
specifying the order each reaction product occurs in the data
|
||||
arrays. The components use the 2-3 letter abbreviations
|
||||
specified in ENDF-102 e.g. EFR for fission fragments and ENP for
|
||||
prompt neutrons.
|
||||
|
||||
**/<nuclide name>/**
|
||||
Nuclides are named by concatenating their atomic symbol and mass number. For
|
||||
example, 'U235' or 'Pu239'. Metastable nuclides are appended with an
|
||||
'_m' and their metastable number. For example, 'Am242_m1'
|
||||
|
||||
:Datasets:
|
||||
- **data** (*double[][][]*) -- The energy release coefficients. The
|
||||
first axis indexes the component type. The second axis specifies
|
||||
values or uncertainties. The third axis indexes the polynomial
|
||||
order. If the data uses the Sher-Beck format, then the last axis
|
||||
will have a length of one and ENDF-102 should be consulted for
|
||||
energy dependence. Otherwise, the data uses the Madland format
|
||||
which is a polynomial of incident energy.
|
||||
|
||||
For example, if 'EFR' is given first in the **component order**
|
||||
attribute and the data uses the Madland format, then the energy
|
||||
released in the form of fission fragments at an incident energy
|
||||
:math:`E` is given by
|
||||
|
||||
.. math::
|
||||
\text{data}[0, 0, 0] + \text{data}[0, 0, 1] \cdot E
|
||||
+ \text{data}[0, 0, 2] \cdot E^2 + \ldots
|
||||
|
||||
And its uncertainty is
|
||||
|
||||
.. math::
|
||||
\text{data}[0, 1, 0] + \text{data}[0, 1, 1] \cdot E
|
||||
+ \text{data}[0, 1, 2] \cdot E^2 + \ldots
|
||||
|
||||
.. _ENDF-102: http://www.nndc.bnl.gov/endfdocs/ENDF-102-2012.pdf
|
||||
|
|
@ -1,18 +1,34 @@
|
|||
.. _io_file_formats:
|
||||
|
||||
===============
|
||||
IO File Formats
|
||||
===============
|
||||
==========================
|
||||
File Format Specifications
|
||||
==========================
|
||||
|
||||
----------
|
||||
Data Files
|
||||
----------
|
||||
|
||||
.. toctree::
|
||||
:numbered:
|
||||
:maxdepth: 3
|
||||
:maxdepth: 2
|
||||
|
||||
data_wmp
|
||||
nuclear_data
|
||||
mgxs_library
|
||||
data_wmp
|
||||
fission_energy
|
||||
|
||||
------------
|
||||
Output Files
|
||||
------------
|
||||
|
||||
.. toctree::
|
||||
:numbered:
|
||||
:maxdepth: 2
|
||||
|
||||
statepoint
|
||||
source
|
||||
summary
|
||||
particle_restart
|
||||
track
|
||||
voxel
|
||||
volume
|
||||
|
|
|
|||
|
|
@ -22,9 +22,11 @@ materials.
|
|||
|
||||
.. _XML: http://www.w3.org/XML/
|
||||
|
||||
--------------------------------------
|
||||
MGXS Library Specification -- mgxs.xml
|
||||
--------------------------------------
|
||||
.. _mgxs_lib_spec:
|
||||
|
||||
--------------------------
|
||||
MGXS Library Specification
|
||||
--------------------------
|
||||
|
||||
The multi-group library meta-data is contained within the groups_,
|
||||
group_structure_, and inverse_velocities_ elements.
|
||||
|
|
@ -171,9 +173,9 @@ attributes/sub-elements required to describe the meta-data:
|
|||
provided via the ``scatt_type`` element above, is represented and thus used
|
||||
during the scattering process. Specifically, the options are to either
|
||||
convert the Legendre expansion to a tabular representation or leave it as
|
||||
a set of Legendre coefficients. Converting to a tabular representation will
|
||||
cost memory but is likely to decrease runtime compared to leaving as a
|
||||
set of Legendre coefficients. This element has the following
|
||||
a set of Legendre coefficients. Converting to a tabular representation
|
||||
will cost memory but can allow for a decrease in runtime compared to
|
||||
leaving as a set of Legendre coefficients. This element has the following
|
||||
attributes/sub-elements:
|
||||
|
||||
:enable:
|
||||
|
|
|
|||
426
docs/source/io_formats/nuclear_data.rst
Normal file
426
docs/source/io_formats/nuclear_data.rst
Normal file
|
|
@ -0,0 +1,426 @@
|
|||
.. _io_nuclear_data:
|
||||
|
||||
========================
|
||||
Nuclear Data File Format
|
||||
========================
|
||||
|
||||
---------------------
|
||||
Incident Neutron Data
|
||||
---------------------
|
||||
|
||||
|
||||
**/<nuclide name>/**
|
||||
|
||||
:Attributes: - **Z** (*int*) -- Atomic number
|
||||
- **A** (*int*) -- Mass number. For a natural element, A=0 is given.
|
||||
- **metastable** (*int*) -- Metastable state (0=ground, 1=first
|
||||
excited, etc.)
|
||||
- **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses
|
||||
- **n_reaction** (*int*) -- Number of reactions
|
||||
|
||||
:Datasets: - **energy** (*double[]*) -- Energy points at which cross sections are tabulated
|
||||
|
||||
**/<nuclide name>/kTs/**
|
||||
|
||||
<TTT>K is the temperature in Kelvin, rounded to the nearest integer, of the
|
||||
temperature-dependent data set. For example, the data set corresponding to
|
||||
300 Kelvin would be located at `300K`.
|
||||
|
||||
:Datasets:
|
||||
- **<TTT>K** (*double*) -- kT values (in MeV) for each Temperature
|
||||
TTT (in Kelvin)
|
||||
|
||||
**/<nuclide name>/reactions/reaction_<mt>/**
|
||||
|
||||
:Attributes: - **mt** (*int*) -- ENDF MT reaction number
|
||||
- **label** (*char[]*) -- Name of the reaction
|
||||
- **Q_value** (*double*) -- Q value in MeV
|
||||
- **center_of_mass** (*int*) -- Whether the reference frame for
|
||||
scattering is center-of-mass (1) or laboratory (0)
|
||||
- **n_product** (*int*) -- Number of reaction products
|
||||
|
||||
**/<nuclide name>/reactions/reaction_<mt>/<TTT>K/**
|
||||
|
||||
<TTT>K is the temperature in Kelvin, rounded to the nearest integer, of the
|
||||
temperature-dependent data set. For example, the data set corresponding to
|
||||
300 Kelvin would be located at `300K`.
|
||||
|
||||
:Datasets:
|
||||
- **xs** (*double[]*) -- Cross section values tabulated against the
|
||||
nuclide energy grid for temperature TTT (in Kelvin)
|
||||
|
||||
:Attributes:
|
||||
- **threshold_idx** (*int*) -- Index on the energy
|
||||
grid that the reaction threshold corresponds to for
|
||||
temperature TTT (in Kelvin)
|
||||
|
||||
**/<nuclide name>/reactions/reaction_<mt>/product_<j>/**
|
||||
|
||||
Reaction product data is described in :ref:`product`.
|
||||
|
||||
**/<nuclide name>/urr/<TTT>K/**
|
||||
|
||||
<TTT>K is the temperature in Kelvin, rounded to the nearest integer, of the
|
||||
temperature-dependent data set. For example, the data set corresponding to
|
||||
300 Kelvin would be located at `300K`.
|
||||
|
||||
:Attributes: - **interpolation** (*int*) -- interpolation scheme
|
||||
- **inelastic** (*int*) -- flag indicating inelastic scattering
|
||||
- **other_absorb** (*int*) -- flag indicating other absorption
|
||||
- **factors** (*int*) -- flag indicating whether tables are
|
||||
absolute or multipliers
|
||||
|
||||
:Datasets: - **energy** (*double[]*) -- Energy at which probability tables exist
|
||||
- **table** (*double[][][]*) -- Probability tables
|
||||
|
||||
**/<nuclide name>/total_nu/**
|
||||
|
||||
This special product is used to define the total number of neutrons produced
|
||||
from fission. It is formatted as a reaction product, described in
|
||||
:ref:`product`.
|
||||
|
||||
**/<nuclide name>/fission_energy_release/**
|
||||
|
||||
:Datasets: - **fragments** (:ref:`polynomial <1d_polynomial>`) -- Energy
|
||||
released in the form of fragments as a function of incident
|
||||
neutron energy.
|
||||
- **prompt_neutrons** (:ref:`polynomial <1d_polynomial>` or
|
||||
:ref:`tabulated <1d_tabulated>`) -- Energy released in the form of
|
||||
prompt neutrons as a function of incident neutron energy.
|
||||
- **delayed_neutrons** (:ref:`polynomial <1d_polynomial>`) -- Energy
|
||||
released in the form of delayed neutrons as a function of incident
|
||||
neutron energy.
|
||||
- **prompt_photons** (:ref:`polynomial <1d_polynomial>`) -- Energy
|
||||
released in the form of prompt photons as a function of incident
|
||||
neutron energy.
|
||||
- **delayed_photons** (:ref:`polynomial <1d_polynomial>`) -- Energy
|
||||
released in the form of delayed photons as a function of incident
|
||||
neutron energy.
|
||||
- **betas** (:ref:`polynomial <1d_polynomial>`) -- Energy
|
||||
released in the form of betas as a function of incident
|
||||
neutron energy.
|
||||
- **neutrinos** (:ref:`polynomial <1d_polynomial>`) -- Energy
|
||||
released in the form of neutrinos as a function of incident
|
||||
neutron energy.
|
||||
- **q_prompt** (:ref:`polynomial <1d_polynomial>` or
|
||||
:ref:`tabulated <1d_tabulated>`) -- The prompt fission Q-value
|
||||
(fragments + prompt neutrons + prompt photons - incident energy)
|
||||
- **q_recoverable** (:ref:`polynomial <1d_polynomial>` or
|
||||
:ref:`tabulated <1d_tabulated>`) -- The recoverable fission Q-value
|
||||
(Q_prompt + delayed neutrons + delayed photons + betas)
|
||||
|
||||
-------------------------------
|
||||
Thermal Neutron Scattering Data
|
||||
-------------------------------
|
||||
|
||||
**/<thermal name>/**
|
||||
|
||||
:Attributes: - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses
|
||||
- **nuclides** (*char[][]*) -- Names of nuclides for which the thermal
|
||||
scattering data applies to
|
||||
- **secondary_mode** (*char[]*) -- Indicates how the inelastic
|
||||
outgoing angle-energy distributions are represented ('equal',
|
||||
'skewed', or 'continuous').
|
||||
|
||||
**/<thermal name>/kTs/**
|
||||
|
||||
<TTT>K is the temperature in Kelvin, rounded to the nearest integer, of the
|
||||
temperature-dependent data set. For example, the data set corresponding to
|
||||
300 Kelvin would be located at `300K`.
|
||||
|
||||
:Datasets:
|
||||
- **<TTT>K** (*double*) -- kT values (in MeV) for each Temperature
|
||||
TTT (in Kelvin)
|
||||
|
||||
**/<thermal name>/elastic/<TTT>K/**
|
||||
|
||||
<TTT>K is the temperature in Kelvin, rounded to the nearest integer, of the
|
||||
temperature-dependent data set. For example, the data set corresponding to
|
||||
300 Kelvin would be located at `300K`.
|
||||
|
||||
:Datasets: - **xs** (:ref:`tabulated <1d_tabulated>`) -- Thermal inelastic
|
||||
scattering cross section for temperature TTT (in Kelvin)
|
||||
- **mu_out** (*double[][]*) -- Distribution of outgoing energies
|
||||
and angles for coherent elastic scattering for temperature TTT
|
||||
(in Kelvin)
|
||||
|
||||
**/<thermal name>/inelastic/<TTT>K/**
|
||||
|
||||
<TTT>K is the temperature in Kelvin, rounded to the nearest integer, of the
|
||||
temperature-dependent data set. For example, the data set corresponding to
|
||||
300 Kelvin would be located at `300K`.
|
||||
|
||||
:Datasets: - **xs** (:ref:`tabulated <1d_tabulated>`) -- Thermal inelastic
|
||||
scattering cross section for temperature TTT (in Kelvin)
|
||||
- **energy_out** (*double[][]*) -- Distribution of outgoing
|
||||
energies for each incoming energy for temperature TTT (in Kelvin).
|
||||
Only present if secondary mode is not continuous.
|
||||
- **mu_out** (*double[][][]*) -- Distribution of scattering cosines
|
||||
for each pair of incoming and outgoing energies. for temperature
|
||||
TTT (in Kelvin). Only present if secondary mode is not continuous.
|
||||
|
||||
If the secondary mode is continuous, the outgoing energy-angle distribution is
|
||||
given as a :ref:`correlated angle-energy distribution
|
||||
<correlated_angle_energy>`.
|
||||
|
||||
.. _product:
|
||||
|
||||
-----------------
|
||||
Reaction Products
|
||||
-----------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **particle** (*char[]*) -- Type of particle
|
||||
- **emission_mode** (*char[]*) -- Emission mode (prompt, delayed,
|
||||
total)
|
||||
- **decay_rate** (*double*) -- Rate of decay in inverse seconds
|
||||
- **n_distribution** (*int*) -- Number of angle/energy
|
||||
distributions
|
||||
:Datasets:
|
||||
- **yield** (:ref:`function <1d_functions>`) -- Energy-dependent
|
||||
yield of the product.
|
||||
|
||||
:Groups:
|
||||
- **distribution_<k>** -- Formats for angle-energy distributions are
|
||||
detailed in :ref:`angle_energy`. When multiple angle-energy
|
||||
distributions occur, one dataset also may appear for each
|
||||
distribution:
|
||||
|
||||
:Datasets:
|
||||
- **applicability** (:ref:`function <1d_functions>`) --
|
||||
Probability of selecting this distribution as a function
|
||||
of incident energy
|
||||
|
||||
.. _1d_functions:
|
||||
|
||||
-------------------------
|
||||
One-dimensional Functions
|
||||
-------------------------
|
||||
|
||||
Scalar
|
||||
------
|
||||
|
||||
:Object type: Dataset
|
||||
:Datatype: *double*
|
||||
:Attributes: - **type** (*char[]*) -- 'constant'
|
||||
|
||||
.. _1d_tabulated:
|
||||
|
||||
Tabulated
|
||||
---------
|
||||
|
||||
:Object type: Dataset
|
||||
:Datatype: *double[2][]*
|
||||
:Description: x-values are listed first followed by corresponding y-values
|
||||
:Attributes: - **type** (*char[]*) -- 'Tabulated1D'
|
||||
- **breakpoints** (*int[]*) -- Region breakpoints
|
||||
- **interpolation** (*int[]*) -- Region interpolation codes
|
||||
|
||||
.. _1d_polynomial:
|
||||
|
||||
Polynomial
|
||||
----------
|
||||
|
||||
:Object type: Dataset
|
||||
:Datatype: *double[]*
|
||||
:Description: Polynomial coefficients listed in order of increasing power
|
||||
:Attributes: - **type** (*char[]*) -- 'Polynomial'
|
||||
|
||||
Coherent elastic scattering
|
||||
---------------------------
|
||||
|
||||
:Object type: Dataset
|
||||
:Datatype: *double[2][]*
|
||||
:Description: The first row lists Bragg edges and the second row lists structure
|
||||
factor cumulative sums.
|
||||
:Attributes: - **type** (*char[]*) -- 'bragg'
|
||||
|
||||
.. _angle_energy:
|
||||
|
||||
--------------------------
|
||||
Angle-Energy Distributions
|
||||
--------------------------
|
||||
|
||||
Uncorrelated Angle-Energy
|
||||
-------------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'uncorrelated'
|
||||
:Datasets: - **angle/energy** (*double[]*) -- energies at which angle distributions exist
|
||||
- **angle/mu** (*double[3][]*) -- tabulated angular distributions for
|
||||
each energy. The first row gives :math:`\mu` values, the second row
|
||||
gives the probability density, and the third row gives the
|
||||
cumulative distribution.
|
||||
|
||||
:Attributes: - **offsets** (*int[]*) -- indices indicating where
|
||||
each angular distribution starts
|
||||
- **interpolation** (*int[]*) -- interpolation code
|
||||
for each angular distribution
|
||||
|
||||
:Groups: - **energy/** (:ref:`energy distribution <energy_distribution>`)
|
||||
|
||||
.. _correlated_angle_energy:
|
||||
|
||||
Correlated Angle-Energy
|
||||
-----------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'correlated'
|
||||
:Datasets: - **energy** (*double[]*) -- Incoming energies at which distributions exist
|
||||
|
||||
:Attributes:
|
||||
- **interpolation** (*double[2][]*) -- Breakpoints and
|
||||
interpolation codes for incoming energy regions
|
||||
|
||||
- **energy_out** (*double[5][]*) -- Distribution of outgoing energies
|
||||
corresponding to each incoming energy. The distributions are
|
||||
flattened into a single array; the start of a given distribution
|
||||
can be determined using the ``offsets`` attribute. The first row
|
||||
gives outgoing energies, the second row gives the probability
|
||||
density, the third row gives the cumulative distribution, the
|
||||
fourth row gives interpolation codes for angular distributions, and
|
||||
the fifth row gives offsets for angular distributions.
|
||||
|
||||
:Attributes: - **offsets** (*double[]*) -- Offset for each
|
||||
distribution
|
||||
- **interpolation** (*int[]*) -- Interpolation code
|
||||
for each distribution
|
||||
- **n_discrete_lines** (*int[]*) -- Number of discrete
|
||||
lines in each distribution
|
||||
|
||||
- **mu** (*double[3][]*) -- Distribution of angular cosines
|
||||
corresponding to each pair of incoming and outgoing energies. The
|
||||
distributions are flattened into a single array; the start of a
|
||||
given distribution can be determined using offsets in the fifth row
|
||||
of the ``energy_out`` dataset. The first row gives angular cosines,
|
||||
the second row gives the probability density, and the third row
|
||||
gives the cumulative distribution.
|
||||
|
||||
Kalbach-Mann
|
||||
------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'kalbach-mann'
|
||||
:Datasets: - **energy** (*double[]*) -- Incoming energies at which distributions exist
|
||||
|
||||
:Attributes:
|
||||
- **interpolation** (*double[2][]*) -- Breakpoints and
|
||||
interpolation codes for incoming energy regions
|
||||
|
||||
- **distribution** (*double[5][]*) -- Distribution of outgoing
|
||||
energies and angles corresponding to each incoming energy. The
|
||||
distributions are flattened into a single array; the start of a
|
||||
given distribution can be determined using the ``offsets``
|
||||
attribute. The first row gives outgoing energies, the second row
|
||||
gives the probability density, the third row gives the cumulative
|
||||
distribution, the fourth row gives Kalbach-Mann precompound
|
||||
factors, and the fifth row gives Kalbach-Mann angular distribution
|
||||
slopes.
|
||||
|
||||
:Attributes: - **offsets** (*double[]*) -- Offset for each
|
||||
distribution
|
||||
- **interpolation** (*int[]*) -- Interpolation code
|
||||
for each distribution
|
||||
- **n_discrete_lines** (*int[]*) -- Number of discrete
|
||||
lines in each distribution
|
||||
|
||||
N-Body Phase Space
|
||||
------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'nbody'
|
||||
- **total_mass** (*double*) -- Total mass of product particles
|
||||
- **n_particles** (*int*) -- Number of product particles
|
||||
- **atomic_weight_ratio** (*double*) -- Atomic weight ratio of the
|
||||
target nuclide in neutron masses
|
||||
- **q_value** (*double*) -- Q value for the reaction in MeV
|
||||
|
||||
.. _energy_distribution:
|
||||
|
||||
--------------------
|
||||
Energy Distributions
|
||||
--------------------
|
||||
|
||||
Maxwell
|
||||
-------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'maxwell'
|
||||
- **u** (*double*) -- Restriction energy in MeV
|
||||
:Datasets:
|
||||
- **theta** (:ref:`tabulated <1d_tabulated>`) -- Maxwellian
|
||||
temperature as a function of energy
|
||||
|
||||
Evaporation
|
||||
-----------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'evaporation'
|
||||
- **u** (*double*) -- Restriction energy in MeV
|
||||
:Datasets:
|
||||
- **theta** (:ref:`tabulated <1d_tabulated>`) -- Evaporation
|
||||
temperature as a function of energy
|
||||
|
||||
Watt Fission Spectrum
|
||||
---------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'watt'
|
||||
- **u** (*double*) -- Restriction energy in MeV
|
||||
:Datasets: - **a** (:ref:`tabulated <1d_tabulated>`) -- Watt parameter :math:`a`
|
||||
as a function of incident energy
|
||||
- **b** (:ref:`tabulated <1d_tabulated>`) -- Watt parameter :math:`b`
|
||||
as a function of incident energy
|
||||
|
||||
Madland-Nix
|
||||
-----------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'watt'
|
||||
- **efl** (*double*) -- Average energy of light fragment in eV
|
||||
- **efh** (*double*) -- Average energy of heavy fragment in eV
|
||||
|
||||
Discrete Photon
|
||||
---------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'discrete_photon'
|
||||
- **primary_flag** (*int*) -- Whether photon is a primary
|
||||
- **energy** (*double*) -- Photon energy in MeV
|
||||
- **atomic_weight_ratio** (*double*) -- Atomic weight ratio of
|
||||
target nuclide in neutron masses
|
||||
|
||||
Level Inelastic
|
||||
---------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'level'
|
||||
- **threshold** (*double*) -- Energy threshold in the laboratory
|
||||
system in MeV
|
||||
- **mass_ratio** (*double*) -- :math:`(A/(A + 1))^2`
|
||||
|
||||
Continuous Tabular
|
||||
------------------
|
||||
|
||||
:Object type: Group
|
||||
:Attributes: - **type** (*char[]*) -- 'continuous'
|
||||
:Datasets: - **energy** (*double[]*) -- Incoming energies at which distributions exist
|
||||
|
||||
:Attributes:
|
||||
- **interpolation** (*double[2][]*) -- Breakpoints and
|
||||
interpolation codes for incoming energy regions
|
||||
|
||||
- **distribution** (*double[3][]*) -- Distribution of outgoing
|
||||
energies corresponding to each incoming energy. The distributions
|
||||
are flattened into a single array; the start of a given
|
||||
distribution can be determined using the ``offsets`` attribute. The
|
||||
first row gives outgoing energies, the second row gives the
|
||||
probability density, and the third row gives the cumulative
|
||||
distribution.
|
||||
|
||||
:Attributes: - **offsets** (*double[]*) -- Offset for each
|
||||
distribution
|
||||
- **interpolation** (*int[]*) -- Interpolation code
|
||||
for each distribution
|
||||
- **n_discrete_lines** (*int[]*) -- Number of discrete
|
||||
lines in each distribution
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
Summary File Format
|
||||
===================
|
||||
|
||||
The current revision of the summary file format is 1.
|
||||
The current revision of the summary file format is 4.
|
||||
|
||||
**/filetype** (*char[]*)
|
||||
|
||||
|
|
@ -129,7 +129,16 @@ The current revision of the summary file format is 1.
|
|||
|
||||
**/geometry/cells/cell <uid>/distribcell_index** (*int*)
|
||||
|
||||
Index of this cell in distribcell filter arrays.
|
||||
Index of this cell in distribcell arrays. Only present if this cell is
|
||||
listed in a distribcell filter or if it uses distributed materials.
|
||||
|
||||
**/geometry/cells/cell <uid>/paths** (*char[][]*)
|
||||
|
||||
The paths traversed through the CSG tree to reach each distribcell
|
||||
instance. This consists of the integer IDs for each universe, cell and
|
||||
lattice delimited by '->'. Each lattice cell is specified by its (x,y) or
|
||||
(x,y,z) indices. Only present if this cell is listed in a distribcell filter
|
||||
or if it uses distributed materials.
|
||||
|
||||
**/geometry/surfaces/surface <uid>/index** (*int*)
|
||||
|
||||
|
|
@ -244,90 +253,6 @@ The current revision of the summary file format is 1.
|
|||
|
||||
Names of S(:math:`\alpha`,:math:`\beta`) tables assigned to the material.
|
||||
|
||||
**/tallies/n_tallies** (*int*)
|
||||
|
||||
Number of tallies in the problem.
|
||||
|
||||
**/tallies/n_meshes** (*int*)
|
||||
|
||||
Number of meshes in the problem.
|
||||
|
||||
**/tallies/mesh <uid>/index** (*int*)
|
||||
|
||||
Index in the meshes array used internally in OpenMC.
|
||||
|
||||
**/tallies/mesh <uid>/type** (*char[]*)
|
||||
|
||||
Type of the mesh. The only valid option is currently 'regular'.
|
||||
|
||||
**/tallies/mesh <uid>/dimension** (*int[]*)
|
||||
|
||||
Number of mesh cells in each direction.
|
||||
|
||||
**/tallies/mesh <uid>/lower_left** (*double[]*)
|
||||
|
||||
Coordinates of the lower-left corner of the mesh.
|
||||
|
||||
**/tallies/mesh <uid>/upper_right** (*double[]*)
|
||||
|
||||
Coordinates of the upper-right corner of the mesh.
|
||||
|
||||
**/tallies/mesh <uid>/width** (*double[]*)
|
||||
|
||||
Width of a single mesh cell in each direction.
|
||||
|
||||
**/tallies/tally <uid>/index** (*int*)
|
||||
|
||||
Index in tallies array used internally in OpenMC.
|
||||
|
||||
**/tallies/tally <uid>/name** (*char[]*)
|
||||
|
||||
Name of the tally.
|
||||
|
||||
**/tallies/tally <uid>/n_filters** (*int*)
|
||||
|
||||
Number of filters applied to the tally.
|
||||
|
||||
**/tallies/tally <uid>/filter <j>/type** (*char[]*)
|
||||
|
||||
Type of the j-th filter. Can be 'universe', 'material', 'cell', 'cellborn',
|
||||
'surface', 'mesh', 'energy', 'energyout', or 'distribcell'.
|
||||
|
||||
**/tallies/tally <uid>/filter <j>/offset** (*int*)
|
||||
|
||||
Filter offset (used for distribcell filter).
|
||||
|
||||
**/tallies/tally <uid>/filter <j>/paths** (*char[][]*)
|
||||
|
||||
The paths traversed through the CSG tree to reach each distribcell
|
||||
instance (for 'distribcell' filters only). This consists of the integer
|
||||
IDs for each universe, cell and lattice delimited by '->'. Each lattice
|
||||
cell is specified by its (x,y) or (x,y,z) indices.
|
||||
|
||||
**/tallies/tally <uid>/filter <j>/n_bins** (*int*)
|
||||
|
||||
Number of bins for the j-th filter.
|
||||
|
||||
**/tallies/tally <uid>/filter <j>/bins** (*int[]* or *double[]*)
|
||||
|
||||
Value for each filter bin of this type.
|
||||
|
||||
**/tallies/tally <uid>/nuclides** (*char[][]*)
|
||||
|
||||
Array of nuclides to tally. Note that if no nuclide is specified in the user
|
||||
input, a single 'total' nuclide appears here.
|
||||
|
||||
**/tallies/tally <uid>/n_score_bins** (*int*)
|
||||
|
||||
Number of scoring bins for a single nuclide. In general, this can be greater
|
||||
than the number of user-specified scores since each score might have
|
||||
multiple scoring bins, e.g., scatter-PN.
|
||||
|
||||
**/tallies/tally <uid>/moment_orders** (*char[][]*)
|
||||
|
||||
Tallying moment orders for Legendre and spherical harmonic tally expansions
|
||||
(*e.g.*, 'P2', 'Y1,2', etc.).
|
||||
|
||||
**/tallies/tally <uid>/score_bins** (*char[][]*)
|
||||
|
||||
Scoring bins for the tally.
|
||||
|
|
|
|||
22
docs/source/io_formats/volume.rst
Normal file
22
docs/source/io_formats/volume.rst
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
.. _io_volume:
|
||||
|
||||
==================
|
||||
Volume File Format
|
||||
==================
|
||||
|
||||
**/**
|
||||
|
||||
:Attributes: - **samples** (*int*) -- Number of samples
|
||||
- **lower_left** (*double[3]*) -- Lower-left coordinates of
|
||||
bounding box
|
||||
- **upper_right** (*double[3]*) -- Upper-right coordinates of
|
||||
bounding box
|
||||
|
||||
**/cell_<id>/**
|
||||
|
||||
:Datasets: - **volume** (*double[2]*) -- Calculated volume and its uncertainty
|
||||
in cubic centimeters
|
||||
- **nuclides** (*char[][]*) -- Names of nuclides identified in the
|
||||
cell
|
||||
- **atoms** (*double[][2]*) -- Total number of atoms of each nuclide
|
||||
and its uncertainty
|
||||
|
|
@ -8,6 +8,10 @@ This page section discusses how nonlinear diffusion acceleration (NDA) using
|
|||
coarse mesh finite difference (CMFD) is implemented into OpenMC. Before we get
|
||||
into the theory, general notation for this section is discussed.
|
||||
|
||||
Note that the methods discussed in this section are written specifically for
|
||||
continuous-energy mode but equivalent apply to the multi-group mode if the
|
||||
particle's energy is replaced with the particle's group
|
||||
|
||||
--------
|
||||
Notation
|
||||
--------
|
||||
|
|
|
|||
|
|
@ -1,16 +1,20 @@
|
|||
.. _methods_cross_sections:
|
||||
|
||||
============================
|
||||
Cross Section Representation
|
||||
============================
|
||||
=============================
|
||||
Cross Section Representations
|
||||
=============================
|
||||
|
||||
The data governing the interaction of neutrons with various nuclei are
|
||||
represented using the ACE format which is used by MCNP_ and Serpent_. ACE-format
|
||||
data can be generated with the NJOY_ nuclear data processing system which
|
||||
converts raw `ENDF/B data`_ into linearly-interpolable data as required by most
|
||||
Monte Carlo codes. The use of a standard cross section format allows for a
|
||||
direct comparison of OpenMC with other codes since the same cross section
|
||||
libraries can be used.
|
||||
----------------------
|
||||
Continuous-Energy Data
|
||||
----------------------
|
||||
|
||||
The data governing the interaction of neutrons with
|
||||
various nuclei for continous-energy problems are represented using the ACE
|
||||
format which is used by MCNP_ and Serpent_. ACE-format data can be generated
|
||||
with the NJOY_ nuclear data processing system which converts raw
|
||||
`ENDF/B data`_ into linearly-interpolable data as required by most Monte Carlo
|
||||
codes. The use of a standard cross section format allows for a direct comparison
|
||||
of OpenMC with other codes since the same cross section libraries can be used.
|
||||
|
||||
The ACE format contains continuous-energy cross sections for the following types
|
||||
of reactions: elastic scattering, fission (or first-chance fission,
|
||||
|
|
@ -24,7 +28,6 @@ accurate treatment of self-shielding in the unresolved resonance range. For
|
|||
bound scatterers, separate tables with :math:`S(\alpha,\beta,T)` scattering law
|
||||
data can be used.
|
||||
|
||||
-------------------
|
||||
Energy Grid Methods
|
||||
-------------------
|
||||
|
||||
|
|
@ -48,22 +51,23 @@ implement a method of reducing the number of energy grid searches in order to
|
|||
speed up the calculation.
|
||||
|
||||
Logarithmic Mapping
|
||||
-------------------
|
||||
+++++++++++++++++++
|
||||
|
||||
To speed up energy grid searches, OpenMC uses logarithmic mapping technique
|
||||
[Brown]_ to limit the range of energies that must be searched for each
|
||||
nuclide. The entire energy range is divided up into equal-lethargy segments, and
|
||||
the bounding energies of each segment are mapped to bounding indices on each of
|
||||
the nuclide energy grids. By default, OpenMC uses 8000 equal-lethargy segments
|
||||
as recommended by Brown.
|
||||
To speed up energy grid searches, OpenMC uses a `logarithmic mapping technique`_
|
||||
to limit the range of energies that must be searched for each nuclide. The
|
||||
entire energy range is divided up into equal-lethargy segments, and the bounding
|
||||
energies of each segment are mapped to bounding indices on each of the nuclide
|
||||
energy grids. By default, OpenMC uses 8000 equal-lethargy segments as
|
||||
recommended by Brown.
|
||||
|
||||
Other Methods
|
||||
-------------
|
||||
+++++++++++++
|
||||
|
||||
A good survey of other energy grid techniques, including unionized energy grids,
|
||||
can be found in a paper by Leppanen_.
|
||||
|
||||
---------------------------------
|
||||
.. _windowed_multipole:
|
||||
|
||||
Windowed Multipole Representation
|
||||
---------------------------------
|
||||
|
||||
|
|
@ -72,9 +76,9 @@ offers support for an experimental data format called windowed multipole (WMP).
|
|||
This data format requires less memory than pointwise cross sections, and it
|
||||
allows on-the-fly Doppler broadening to arbitrary temperature.
|
||||
|
||||
The multipole method was introduced by [Hwang]_ and the faster windowed
|
||||
multipole method by [Josey]_. In the multipole format, cross section resonances
|
||||
are represented by poles, :math:`p_j`, and residues, :math:`r_j`, in the complex
|
||||
The multipole method was introduced by Hwang_ and the faster windowed multipole
|
||||
method by Josey_. In the multipole format, cross section resonances are
|
||||
represented by poles, :math:`p_j`, and residues, :math:`r_j`, in the complex
|
||||
plane. The 0K cross sections in the resolved resonance region can be computed
|
||||
by summing up a contribution from each pole:
|
||||
|
||||
|
|
@ -137,23 +141,137 @@ scattering does not occur in the resolved resonance region. This is usually,
|
|||
but not always the case. Future library versions may eliminate this issue.
|
||||
|
||||
The data format used by OpenMC to represent windowed multipole data is specified
|
||||
in :ref:`io_data_wmp`
|
||||
in :ref:`io_data_wmp`.
|
||||
|
||||
.. only:: html
|
||||
.. _temperature_treatment:
|
||||
|
||||
.. rubric:: References
|
||||
Temperature Treatment
|
||||
---------------------
|
||||
|
||||
.. [Brown] Forrest B. Brown, "New Hash-based Energy Lookup Algorithm for Monte
|
||||
Carlo codes," LA-UR-14-24530, Los Alamos National Laboratory (2014).
|
||||
At the beginning of a simulation, OpenMC collects a list of all temperatures
|
||||
that are present in a model. It then uses this list to determine what cross
|
||||
sections to load. The data that is loaded depends on what temperature method has
|
||||
been selected. There are three methods available:
|
||||
|
||||
.. [Hwang] R. N. Hwang, "A Rigorous Pole Representation of Multilevel Cross
|
||||
Sections and Its Practical Application," *Nucl. Sci. Eng.*, **96**,
|
||||
192-209 (1987).
|
||||
:Nearest: Cross sections are loaded only if they are within a specified
|
||||
tolerance of the actual temperatures in the model.
|
||||
|
||||
.. [Josey] Colin Josey, Pablo Ducru, Benoit Forget, and Kord Smith, "Windowed
|
||||
Multipole for Cross Section Doppler Broadening," *J. Comp. Phys*,
|
||||
**307**, 715-727 (2016). http://dx.doi.org/10.1016/j.jcp.2015.08.013
|
||||
:Interpolation: Cross sections are loaded at temperatures that bound the actual
|
||||
temperatures in the model. During transport, cross sections for
|
||||
each material are calculated using statistical linear-linear
|
||||
interpolation between bounding temperature. Suppose cross
|
||||
sections are available at temperatures :math:`T_1, T_2, ...,
|
||||
T_n` and a material is assigned a temperature :math:`T` where
|
||||
:math:`T_i < T < T_{i+1}`. Statistical interpolation is applied
|
||||
as follows: a uniformly-distributed random number of the unit
|
||||
interval, :math:`\xi`, is sampled. If :math:`\xi < (T -
|
||||
T_i)/(T_{i+1} - T_i)`, then cross sections at temperature
|
||||
:math:`T_{i+1}` are used. Otherwise, cross sections at
|
||||
:math:`T_i` are used. This procedure is applied for pointwise
|
||||
cross sections in the resolved resonance range, unresolved
|
||||
resonance probability tables, and :math:`S(\alpha,\beta)`
|
||||
thermal scattering tables.
|
||||
|
||||
:Multipole: Resolved resonance cross sections are calculated on-the-fly using
|
||||
techniques/data described in :ref:`windowed_multipole`. Cross
|
||||
section data is loaded for a single temperature and is used in the
|
||||
unresolved resonance and fast energy ranges.
|
||||
|
||||
----------------
|
||||
Multi-Group Data
|
||||
----------------
|
||||
|
||||
The data governing the interaction of particles with various nuclei or materials
|
||||
are represented using a multi-group library format specific to the OpenMC code.
|
||||
The format is described in the :ref:`mgxs_lib_spec`.
|
||||
The data itself can be prepared via traditional paths or directly from a
|
||||
continuous-energy OpenMC calculation by use of the Python API as is shown in the
|
||||
:ref:`notebook_mgxs_part_iv` example notebook. This multi-group
|
||||
library consists of meta-data (such as the energy group structure) and multiple
|
||||
`xsdata` objects which contains the required microscopic or macroscopic
|
||||
multi-group data.
|
||||
|
||||
At a minimum, the library must contain the absorption cross section
|
||||
(:math:`\sigma_{a,g}`) and a scattering matrix. If the problem is an eigenvalue
|
||||
problem then all fissionable materials must also contain either
|
||||
a fission production matrix cross section
|
||||
(:math:`\nu\sigma_{f,g\rightarrow g'}`), or
|
||||
both the fission spectrum data (:math:`\chi_{g'}`) and a fission production
|
||||
cross section (:math:`\nu\sigma_{f,g}`), or, . The library must also contain
|
||||
the fission cross section (:math:`\sigma_{f,g}`) or the fission energy release
|
||||
cross section (:math:`\kappa\sigma_{f,g}`) if the associated tallies are
|
||||
required by the model using the library.
|
||||
|
||||
After a scattering collision, the outgoing particle experiences a change in both
|
||||
energy and angle. The probability of a particle resulting in a given outgoing
|
||||
energy group (`g'`) given a certain incoming energy group (`g`) is provided
|
||||
by the scattering matrix data. The angular information can be expressed either
|
||||
via Legendre expansion of the particle's change-in-angle (:math:`\mu`), a
|
||||
tabular representation of the probability distribution function of :math:`\mu`,
|
||||
or a histogram representation of the same PDF. The formats used to
|
||||
represent these are described in the :ref:`mgxs_lib_spec`.
|
||||
|
||||
Unlike the continuous-energy mode, the multi-group mode does not explicitly
|
||||
track particles produced from scattering multiplication (i.e., :math:`(n,xn)`)
|
||||
reactions. These are instead accounted for by adjusting the weight of the
|
||||
particle after the collision such that the correct total weight is maintained.
|
||||
The weight adjustment factor is optionally provided by the `multiplicity` data
|
||||
which is required to be provided in the form of a group-wise matrix.
|
||||
This data is provided as a group-wise matrix since the probability of producing
|
||||
multiple particles in a scattering reaction depends on both the incoming energy,
|
||||
`g`, and the sampled outgoing energy, `g'`. This data represents the average
|
||||
number of particles emitted from a scattering reaction, given a scattering
|
||||
reaction has occurred:
|
||||
|
||||
.. math::
|
||||
|
||||
multiplicity_{g \rightarrow g'} = \frac{\nu_{scatter}\sigma_{s,g \rightarrow g'}}{
|
||||
\sigma_{s,g \rightarrow g'}}
|
||||
|
||||
If this scattering multiplication information is not provided in the library
|
||||
then no weight adjustment will be performed. This is equivalent to neglecting
|
||||
any additional particles produced in scattering multiplication reactions.
|
||||
However, this assumption will result in a loss of accuracy since the total
|
||||
particle population would not be conserved. This reduction in accuracy due to
|
||||
the loss in particle conservation can be mitigated by reducing the absorption
|
||||
cross section as needed to maintain particle conservation. This adjustment can
|
||||
be done when generating the library, or by OpenMC. To have OpenMC perform the
|
||||
adjustment, the total cross section (:math:`\sigma_{t,g}`) must be provided.
|
||||
With this information, OpenMC will then adjust the absorption cross section as
|
||||
follows:
|
||||
|
||||
.. math::
|
||||
|
||||
\sigma_{a,g} = \sigma_{t,g} - \sum_{g'}\nu_{scatter}\sigma_{s,g \rightarrow g'}
|
||||
|
||||
The above method is the same as is usually done with most deterministic solvers.
|
||||
Note that this method is less accurate than using the scattering multiplication
|
||||
weight adjustment since simply reducing the absorption cross section does not
|
||||
include any information about the outgoing energy of the particles produced in
|
||||
these reactions.
|
||||
|
||||
All of the data discussed in this section can be provided to the code
|
||||
independent of the particle's direction of motion (i.e., isotropic), or the data
|
||||
can be provided as a tabular distribution of the polar and azimuthal particle
|
||||
direction angles. The isotropic representation is the most commonly used,
|
||||
however inaccuracies are to be expected especially near material interfaces
|
||||
where a material has a very large cross sections relative to the other material
|
||||
(as can be expected in the resonance range). The angular representation can be
|
||||
used to minimize this error.
|
||||
|
||||
Finally, the above options for representing the physics do not have to be
|
||||
consistent across the problem. The number of groups and the structure, however,
|
||||
does have to be consistent across the data sets. That is to say that each
|
||||
microscopic or macroscopic data set does not have to apply the same scattering
|
||||
expansion, treatment of multiplicity or angular representation of the cross
|
||||
sections. This allows flexibility for the model to use highly anisotropic
|
||||
scattering information in the water while the fuel can be simulated with linear
|
||||
or even isotropic scattering.
|
||||
|
||||
.. _logarithmic mapping technique:
|
||||
https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-14-24530.pdf
|
||||
.. _Hwang: http://www.ans.org/pubs/journals/nse/a_16381
|
||||
.. _Josey: http://dx.doi.org/10.1016/j.jcp.2015.08.013
|
||||
.. _MCNP: http://mcnp.lanl.gov
|
||||
.. _Serpent: http://montecarlo.vtt.fi
|
||||
.. _NJOY: http://t2.lanl.gov/codes.shtml
|
||||
|
|
|
|||
|
|
@ -205,7 +205,7 @@ traveling in its current direction, it will not hit the surface. The complete
|
|||
derivation for different types of surfaces used in OpenMC will be presented in
|
||||
the following sections.
|
||||
|
||||
Since :math:f(x,y,z)` in general is quadratic in :math:`x`, :math:`y`, and
|
||||
Since :math:`f(x,y,z)` in general is quadratic in :math:`x`, :math:`y`, and
|
||||
:math:`z`, this implies that :math:`f(x_0 + du_0, y + dv_0, z + dw_0)` is
|
||||
quadratic in :math:`d`. Thus we expect at most two real solutions to
|
||||
:eq:`dist-to-boundary-1`. If no solutions to :eq:`dist-to-boundary-1` exist or
|
||||
|
|
@ -265,6 +265,8 @@ Again, we need to check whether the denominator is zero. If so, this means that
|
|||
the particle's direction of flight is parallel to the plane and it will
|
||||
therefore never hit the plane.
|
||||
|
||||
.. _cylinder_distance:
|
||||
|
||||
Cylinder Parallel to an Axis
|
||||
----------------------------
|
||||
|
||||
|
|
@ -366,7 +368,74 @@ will then be either both positive or both negative. If they are both positive,
|
|||
the smaller (closer) one will be the solution with a negative sign on the square
|
||||
root of the discriminant.
|
||||
|
||||
.. TODO: Need to add derivation for x-cone, y-cone, and z-cone.
|
||||
Cone Parallel to an Axis
|
||||
------------------------
|
||||
|
||||
The equation for a cone parallel to, for example, the x-axis is :math:`(y -
|
||||
y_0)^2 + (z - z_0)^2 = R^2(x - x_0)^2`. Thus, we need to solve :math:`(y + dv -
|
||||
y_0)^2 + (z + dw - z_0)^2 = R^2(x + du - x_0)^2`. Let us define :math:`\bar{x} =
|
||||
x - x_0`, :math:`\bar{y} = y - y_0`, and :math:`\bar{z} = z - z_0`. We then have
|
||||
|
||||
.. math::
|
||||
:label: dist-xcone-1
|
||||
|
||||
(\bar{y} + dv)^2 + (\bar{z} + dw)^2 = R^2(\bar{x} + du)^2
|
||||
|
||||
Expanding equation :eq:`dist-xcone-1` and rearranging terms, we obtain
|
||||
|
||||
.. math::
|
||||
:label: dist-xcylinder-2
|
||||
|
||||
(v^2 + w^2 - R^2u^2) d^2 + 2 (\bar{y}v + \bar{z}w - R^2\bar{x}u) d +
|
||||
(\bar{y}^2 + \bar{z}^2 - R^2\bar{x}^2) = 0
|
||||
|
||||
Defining the terms
|
||||
|
||||
.. math::
|
||||
:label: dist-quadric-terms
|
||||
|
||||
a = v^2 + w^2 - R^2u^2
|
||||
|
||||
k = \bar{y}v + \bar{z}w - R^2\bar{x}u
|
||||
|
||||
c = \bar{y}^2 + \bar{z}^2 - R^2\bar{x}^2
|
||||
|
||||
we then have the simple quadratic equation :math:`ad^2 + 2kd + c = 0` which can
|
||||
be solved as described in :ref:`cylinder_distance`.
|
||||
|
||||
General Quadric
|
||||
---------------
|
||||
|
||||
The equation for a general quadric surface is :math:`Ax^2 + By^2 + Cz^2 + Dxy +
|
||||
Eyz + Fxz + Gx + Hy + Jz + K = 0`. Thus, we need to solve the equation
|
||||
|
||||
.. math::
|
||||
:label: dist-quadric-1
|
||||
|
||||
A(x+du)^2 + B(y+dv)^2 + C(z+dw)^2 + D(x+du)(y+dv) + E(y+dv)(z+dw) + \\
|
||||
F(x+du)(z+dw) + G(x+du) + H(y+dv) + J(z+dw) + K = 0
|
||||
|
||||
Expanding equation :eq:`dist-quadric-1` and rearranging terms, we obtain
|
||||
|
||||
.. math::
|
||||
:label: dist-quadric-2
|
||||
|
||||
d^2(uv + vw + uw) + 2d(Aux + Bvy + Cwx + (D(uv + vx) + E(vz + wy) + \\
|
||||
F(wx + uz))/2) + (x(Ax + Dy) + y(By + Ez) + z(Cz + Fx)) = 0
|
||||
|
||||
Defining the terms
|
||||
|
||||
.. math::
|
||||
:label: dist-quadric-terms
|
||||
|
||||
a = uv + vw + uw
|
||||
|
||||
k = Aux + Bvy + Cwx + (D(uv + vx) + E(vz + wy) + F(wx + uz))/2
|
||||
|
||||
c = x(Ax + Dy) + y(By + Ez) + z(Cz + Fx)
|
||||
|
||||
we then have the simple quadratic equation :math:`ad^2 + 2kd + c = 0` which can
|
||||
be solved as described in :ref:`cylinder_distance`.
|
||||
|
||||
.. _find-cell:
|
||||
|
||||
|
|
@ -437,6 +506,8 @@ where :math:`(x_0, y_0, z_0)` are the coordinates to the lower-left-bottom
|
|||
corner of the lattice, and :math:`p_0, p_1, p_2` are the pitches along the
|
||||
:math:`x`, :math:`y`, and :math:`z` axes, respectively.
|
||||
|
||||
.. _hexagonal_indexing:
|
||||
|
||||
Hexagonal Lattice Indexing
|
||||
--------------------------
|
||||
|
||||
|
|
@ -808,6 +879,18 @@ form of the solution:
|
|||
|
||||
w' = w + \frac{2 (\bar{x}u + \bar{y}v - R^2\bar{z}w)}{R^2 (1 + R^2) \bar{z}}
|
||||
|
||||
General Quadric
|
||||
---------------
|
||||
|
||||
A general quadric surface has the form :math:`f(x,y,z) = Ax^2 + By^2 + Cz^2 +
|
||||
Dxy + Eyz + Fxz + Gx + Hy + Jz + K = 0`. Thus, the gradient to the surface is
|
||||
|
||||
.. math::
|
||||
:label: reflection-quadric-grad
|
||||
|
||||
\nabla f = \left ( \begin{array}{c} 2Ax + Dy + Fz + G \\ 2By + Dx + Ez + H
|
||||
\\ 2Cz + Ey + Fx + J \end{array} \right ).
|
||||
|
||||
|
||||
.. _constructive solid geometry: http://en.wikipedia.org/wiki/Constructive_solid_geometry
|
||||
.. _surfaces: http://en.wikipedia.org/wiki/Surface
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ The physical process by which a population of particles evolves over time is
|
|||
governed by a number of `probability distributions`_. For instance, given a
|
||||
particle traveling through some material, there is a probability distribution
|
||||
for the distance it will travel until its next collision (an exponential
|
||||
distribution). Then, when it collides with a nucleus, there is associated
|
||||
distribution). Then, when it collides with a nucleus, there is an associated
|
||||
probability of undergoing each possible reaction with that nucleus. While the
|
||||
behavior of any single particle is unpredictable, the average behavior of a
|
||||
large population of particles originating from the same source is well defined.
|
||||
|
|
@ -45,15 +45,20 @@ following steps:
|
|||
|
||||
- Initialize the pseudorandom number generator.
|
||||
|
||||
- Read ACE format cross sections specified in the problem.
|
||||
- Read the contiuous-energy or multi-group cross section data specified in
|
||||
the problem.
|
||||
|
||||
- If using a special energy grid treatment such as a union energy grid or
|
||||
lethargy bins, that must be initialized as well.
|
||||
lethargy bins, that must be initialized as well in a continuous-energy
|
||||
problem.
|
||||
|
||||
- In a multi-group problem, individual nuclide cross section information is
|
||||
combined to produce material-specific cross section data.
|
||||
|
||||
- In a fixed source problem, source sites are sampled from the specified
|
||||
source. In an eigenvalue problem, source sites are sampled from some initial
|
||||
source distribution or from a source file. The source sites consist of
|
||||
coordinates, a direction, and an energy.
|
||||
source. In an eigenvalue problem, source sites are sampled from some
|
||||
initial source distribution or from a source file. The source sites
|
||||
consist of coordinates, a direction, and an energy.
|
||||
|
||||
Once initialization is complete, the actual transport simulation can
|
||||
proceed. The life of a single particle will proceed as follows:
|
||||
|
|
@ -95,6 +100,10 @@ proceed. The life of a single particle will proceed as follows:
|
|||
|
||||
P(i) = \frac{\Sigma_{t,i}}{\Sigma_t}.
|
||||
|
||||
Note that the above selection of collided nuclide only applies to
|
||||
continuous-energy simulations as multi-group simulations use nuclide
|
||||
data which has already been combined in to material-specific data.
|
||||
|
||||
8. Once the specific nuclide is sampled, the random samples a reaction for
|
||||
that nuclide based on the microscopic cross sections. If the microscopic
|
||||
cross section for some reaction :math:`x` is :math:`\sigma_x` and the total
|
||||
|
|
@ -105,13 +114,20 @@ proceed. The life of a single particle will proceed as follows:
|
|||
|
||||
P(x) = \frac{\sigma_x}{\sigma_t}.
|
||||
|
||||
Since multi-group simulations use material-specific data, the above is
|
||||
performed with those material multi-group cross sections (i.e.,
|
||||
macroscopic cross sections for the material) instead of microscopic
|
||||
cross sections for the nuclide).
|
||||
|
||||
9. If the sampled reaction is elastic or inelastic scattering, the outgoing
|
||||
energy and angle is sampled from the appropriate distribution. Reactions
|
||||
of type :math:`(n,xn)` are treated as scattering and the weight of the
|
||||
particle is increased by the multiplicity of the reaction. The particle
|
||||
then continues from step 3. If the reaction is absorption or fission, the
|
||||
particle dies and if necessary, fission sites are created and stored in the
|
||||
fission bank.
|
||||
energy and angle is sampled from the appropriate distribution. In
|
||||
continuous-energy simulation, reactions of type :math:`(n,xn)` are treated
|
||||
as scattering and any additional particles which may be created are added
|
||||
to a secondary particle bank to be tracked later. In a multi-group
|
||||
simulation, this secondary bank is not used but the particle weight is
|
||||
increased accordingly. The original particle then continues from step 3.
|
||||
If the reaction is absorption or fission, the particle dies and if
|
||||
necessary, fission sites are created and stored in the fission bank.
|
||||
|
||||
After all particles have been simulated, there are a few final tasks that must
|
||||
be performed before the run is finished. This include the following:
|
||||
|
|
|
|||
|
|
@ -4,6 +4,12 @@
|
|||
Physics
|
||||
=======
|
||||
|
||||
There are limited differences between physics treatments used in the
|
||||
continuous-energy and multi-group modes. If distinctions are necessary, each
|
||||
of the following sections will provide an explanation of the differences.
|
||||
Otherwise, replacing any references of the particle's energy (`E`) with
|
||||
references to the particle's energy group (`g`) will suffice.
|
||||
|
||||
-----------------------------------
|
||||
Sampling Distance to Next Collision
|
||||
-----------------------------------
|
||||
|
|
@ -79,6 +85,10 @@ originating from :math:`(n,\gamma)` and other reactions.
|
|||
Elastic Scattering
|
||||
------------------
|
||||
|
||||
Note that the multi-group mode makes no distinction between elastic or
|
||||
inelastic scattering reactions. The spceific multi-group scattering
|
||||
implementation is discussed in the :ref:`multi-group-scatter` section.
|
||||
|
||||
Elastic scattering refers to the process by which a neutron scatters off a
|
||||
nucleus and does not leave it in an excited. It is referred to as "elastic"
|
||||
because in the center-of-mass system, the neutron does not actually lose
|
||||
|
|
@ -170,6 +180,10 @@ final direction in the lab system.
|
|||
Inelastic Scattering
|
||||
--------------------
|
||||
|
||||
Note that the multi-group mode makes no distinction between elastic or
|
||||
inelastic scattering reactions. The spceific multi-group scattering
|
||||
implementation is discussed in the :ref:`multi-group-scatter` section.
|
||||
|
||||
The major algorithms for inelastic scattering were described in previous
|
||||
sections. First, a scattering cosine is sampled using the algorithms in
|
||||
:ref:`sample-angle`. Then an outgoing energy is sampled using the algorithms in
|
||||
|
|
@ -186,12 +200,69 @@ secondary photons from nuclear de-excitation are tracked in OpenMC.
|
|||
:math:`(n,xn)` Reactions
|
||||
------------------------
|
||||
|
||||
Note that the multi-group mode makes no distinction between elastic or
|
||||
inelastic scattering reactions. The specific multi-group scattering
|
||||
implementation is discussed in the :ref:`multi-group-scatter` section.
|
||||
|
||||
These types of reactions are just treated as inelastic scattering and as such
|
||||
are subject to the same procedure as described in :ref:`inelastic-scatter`. For
|
||||
reactions with integral multiplicity, e.g., :math:`(n,2n)`, an appropriate
|
||||
number of secondary neutrons are created. For reactions that have a multiplicity
|
||||
given as a function of the incoming neutron energy (which occasionally occurs
|
||||
for MT=5), the weight of the outgoing neutron is multiplied by the multiplcity.
|
||||
for MT=5), the weight of the outgoing neutron is multiplied by the multiplicity.
|
||||
|
||||
.. _multi-group-scatter:
|
||||
|
||||
----------------------
|
||||
Multi-Group Scattering
|
||||
----------------------
|
||||
|
||||
In multi-group mode, a scattering collision requires that the outgoing energy
|
||||
group of the simulated particle be selected from a probability distribution,
|
||||
the change-in-angle selected from a probability distribution according to
|
||||
the outgoing energy group, and finally the particle's weight adjusted again
|
||||
according to the outgoing energy group.
|
||||
|
||||
The first step in selecting an outgoing energy group for a particle in a given
|
||||
incoming energy group is to select a random number (:math:`\xi`) between 0 and
|
||||
1. This number is then compared to the cumulative distribution function
|
||||
produced from the outgoing group (`g'`) data for the given incoming group (`g`):
|
||||
|
||||
.. math::
|
||||
CDF = \sum_{g'=0}^{h}\Sigma_{s,g \rightarrow g'}
|
||||
|
||||
If the scattering data is represented as a Legendre expansion, then the
|
||||
value of :math:`\Sigma_{s,g \rightarrow g'}` above is the 0th order forthe
|
||||
given group transfer. If the data is provided as tabular or histogram data, then
|
||||
:math:`\Sigma_{s,g \rightarrow g'}` is the sum of all bins of data for a given
|
||||
`g` and `g'` pair.
|
||||
|
||||
Now that the outgoing energy is known the change-in-angle, :math:`\mu` can be
|
||||
determined. If the data is provided as a Legendre expansion, this is done by
|
||||
rejection sampling of the probability distribution represented by the Legendre
|
||||
series. For efficiency, the selected values of the PDF (:math:`f(\mu)`) are
|
||||
chosen to be between 0 and the maximum value of :math:`f(\mu)` in the domain of
|
||||
-1 to 1. Note that this sampling scheme automatically forces negative values of
|
||||
the :math:`f(\mu)` probability distribution function to be treated as zero
|
||||
probabilities.
|
||||
|
||||
If the angular data is instead provided as a tabular representation, then the
|
||||
value of :math:`\mu` is selected as described in the :ref:`angle-tabular`
|
||||
section with a linear-linear interpolation scheme.
|
||||
|
||||
If the angular data is provided as a histogram representation, then
|
||||
the value of :math:`\mu` is selected in a similar fashion to that described for
|
||||
the selection of the outgoing energy (since the energy group representation is
|
||||
simply a histogram representation) except the CDF is composed of the angular
|
||||
bins and not the energy groups. However, since we are interested in a specific
|
||||
value of :math:`\mu` instead of a group, then an angle selected from a uniform
|
||||
distribution within from the chosen angular bin.
|
||||
|
||||
The final step in the scattering treatment is to adjust the weight of the
|
||||
neutron to account for any production of neutrons due to :math:`(n,xn)`
|
||||
reactions. This data is obtained from the multiplicity data provided in the
|
||||
multi-group cross section library for the material of interest.
|
||||
The scaled value will default to 1.0 if no value is provided in the library.
|
||||
|
||||
.. _fission:
|
||||
|
||||
|
|
@ -208,9 +279,9 @@ idiosyncrasies in treating fission. In an eigenvalue calculation, secondary
|
|||
neutrons from fission are only "banked" for use in the next generation rather
|
||||
than being tracked as secondary neutrons from elastic and inelastic scattering
|
||||
would be. On top of this, fission is sometimes broken into first-chance fission,
|
||||
second-chance fission, etc. An ACE table either lists the partial fission
|
||||
reactions with secondary energy distributions for each one, or a total fission
|
||||
reaction with a single secondary energy distribution.
|
||||
second-chance fission, etc. The nuclear data file either lists the partial
|
||||
fission reactions with secondary energy distributions for each one, or a total
|
||||
fission reaction with a single secondary energy distribution.
|
||||
|
||||
When a fission reaction is sampled in OpenMC (either total fission or, if data
|
||||
exists, first- or second-chance fission), the following algorithm is used to
|
||||
|
|
@ -219,7 +290,7 @@ number of prompt and delayed neutrons must be determined to decide whether the
|
|||
secondary neutrons will be prompt or delayed. This is important because delayed
|
||||
neutrons have a markedly different spectrum from prompt neutrons, one that has a
|
||||
lower average energy of emission. The total number of neutrons emitted
|
||||
:math:`\nu_t` is given as a function of incident energy in the ACE format. Two
|
||||
:math:`\nu_t` is given as a function of incident energy in the ENDF format. Two
|
||||
representations exist for :math:`\nu_t`. The first is a polynomial of order
|
||||
:math:`N` with coefficients :math:`c_0,c_1,\dots,c_N`. If :math:`\nu_t` has this
|
||||
format, we can evaluate it at incoming energy :math:`E` by using the equation
|
||||
|
|
@ -271,22 +342,57 @@ position of the collision site are stored in an array called the fission
|
|||
bank. In a subsequent generation, these fission bank sites are used as starting
|
||||
source sites.
|
||||
|
||||
-----------------------------------------
|
||||
Secondary Angles and Energy Distributions
|
||||
-----------------------------------------
|
||||
The above description is similar for the multi-group mode except the data are
|
||||
provided as group-wise data instead of in a continuous-energy format. In this
|
||||
case, the outgoing energy of the fission neutrons are represented as histograms
|
||||
by way of either the nu-fission matrix or chi vector.
|
||||
|
||||
For any reactions with secondary neutrons, it is necessary to sample secondary
|
||||
angle and energy distributions. This includes elastic and inelastic scattering,
|
||||
fission, and :math:`(n,xn)` reactions. In some cases, the angle and energy
|
||||
distributions may be specified separately, and in other cases, they may be
|
||||
specified as a correlated angle-energy distribution. In the following sections,
|
||||
we will outline the methods used to sample secondary distributions as well as
|
||||
how they are used to modify the state of a particle.
|
||||
------------------------------------
|
||||
Secondary Angle-Energy Distributions
|
||||
------------------------------------
|
||||
|
||||
Note that this section is specific to continuous-energy mode since the
|
||||
multi-group scattering process has already been described including the
|
||||
secondary energy and angle sampling.
|
||||
|
||||
For a reaction with secondary products, it is necessary to determine the
|
||||
outgoing angle and energy of the products. For any reaction other than elastic
|
||||
and level inelastic scattering, the outgoing energy must be determined based on
|
||||
tabulated or parameterized data. The `ENDF-6 Format`_ specifies a variety of
|
||||
ways that the secondary energy distribution can be represented. ENDF File 5
|
||||
contains uncorrelated energy distribution whereas ENDF File 6 contains
|
||||
correlated energy-angle distributions. The ACE format specifies its own
|
||||
representations based loosely on the formats given in ENDF-6. OpenMC's HDF5
|
||||
nuclear data files use a combination of ENDF and ACE distributions; in this
|
||||
section, we will describe how the outgoing angle and energy of secondary
|
||||
particles are sampled.
|
||||
|
||||
One of the subtleties in the nuclear data format is the fact that a single
|
||||
reaction product can have multiple angle-energy distributions. This is mainly
|
||||
useful for reactions with multiple products of the same type in the exit channel
|
||||
such as :math:`(n,2n)` or :math:`(n,3n)`. In these types of reactions, each
|
||||
neutron is emitted corresponding to a different excitation level of the compound
|
||||
nucleus, and thus in general the neutrons will originate from different energy
|
||||
distributions. If multiple angle-energy distributions are present, they are
|
||||
assigned incoming-energy-dependent probabilities that can then be used to
|
||||
randomly select one.
|
||||
|
||||
Once a distribution has been selected, the procedure for determining the
|
||||
outgoing angle and energy will depend on the type of the distribution.
|
||||
|
||||
Uncorrelated Angle-Energy Distributions
|
||||
---------------------------------------
|
||||
|
||||
The first set of distributions we will look at are uncorrelated angle-energy
|
||||
distributions, where angle and energy are specified separately. For these
|
||||
distributions, OpenMC first samples the angular distribution as described
|
||||
:ref:`sample-angle` and then samples an energy as described in
|
||||
:ref:`sample-energy`.
|
||||
|
||||
.. _sample-angle:
|
||||
|
||||
Sampling Secondary Angle Distributions
|
||||
--------------------------------------
|
||||
Sampling Angular Distributions
|
||||
++++++++++++++++++++++++++++++
|
||||
|
||||
For elastic scattering, it is only necessary to specific a secondary angle
|
||||
distribution since the outgoing energy can be determined analytically. Other
|
||||
|
|
@ -294,15 +400,14 @@ reactions may also have separate secondary angle and secondary energy
|
|||
distributions that are uncorrelated. In these cases, the secondary angle
|
||||
distribution is represented as either
|
||||
|
||||
- An Isotropic angular distribution,
|
||||
- An equiprobable distribution with 32 bins, or
|
||||
- An isotropic angular distribution,
|
||||
- A tabular distribution.
|
||||
|
||||
Isotropic Angular Distribution
|
||||
++++++++++++++++++++++++++++++
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
In the first case, no data needs to be stored on the ACE table, and the cosine
|
||||
of the scattering angle is simply calculated as
|
||||
In the first case, no data is stored in the nuclear data file, and the cosine of
|
||||
the scattering angle is simply calculated as
|
||||
|
||||
.. math::
|
||||
:label: isotropic-angle
|
||||
|
|
@ -312,42 +417,17 @@ of the scattering angle is simply calculated as
|
|||
where :math:`\mu` is the cosine of the scattering angle and :math:`\xi` is a
|
||||
random number sampled uniformly on :math:`[0,1)`.
|
||||
|
||||
Equiprobable Angle Bin Distribution
|
||||
+++++++++++++++++++++++++++++++++++
|
||||
|
||||
For a 32 equiprobable bin distribution, we select a random number :math:`\xi` to
|
||||
sample a cosine bin :math:`i` such that
|
||||
|
||||
.. math::
|
||||
:label: equiprobable-bin
|
||||
|
||||
i = 1 + \lfloor 32\xi \rfloor.
|
||||
|
||||
The same random number can then also be used to interpolate between neighboring
|
||||
:math:`\mu` values to get the final scattering cosine:
|
||||
|
||||
.. math::
|
||||
:label: equiprobable-cosine
|
||||
|
||||
\mu = \mu_i + (32\xi - i) (\mu_{i+1} - \mu_i)
|
||||
|
||||
where :math:`\mu_i` is the :math:`i`-th scattering cosine.
|
||||
|
||||
.. _angle-tabular:
|
||||
|
||||
Tabular Angular Distribution
|
||||
++++++++++++++++++++++++++++
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
As the `MCNP Manual`_ points out, using an equiprobable bin distribution works
|
||||
well for high-probability regions of the scattering cosine probability, but for
|
||||
low-probability regions it is not very accurate. Thus, a more accurate method is
|
||||
to represent the scattering cosine with a tabular distribution. In this case, we
|
||||
have a table of cosines and their corresponding values for a probability
|
||||
distribution function and cumulative distribution function. For each incoming
|
||||
neutron energy :math:`E_i`, let us call :math:`p_{i,j}` the j-th value in the
|
||||
probability distribution function and :math:`c_{i,j}` the j-th value in the
|
||||
cumulative distribution function. We first find the interpolation factor on the
|
||||
incoming energy grid:
|
||||
In this case, we have a table of cosines and their corresponding values for a
|
||||
probability distribution function and cumulative distribution function. For each
|
||||
incoming neutron energy :math:`E_i`, let us call :math:`p_{i,j}` the j-th value
|
||||
in the probability distribution function and :math:`c_{i,j}` the j-th value in
|
||||
the cumulative distribution function. We first find the interpolation factor on
|
||||
the incoming energy grid:
|
||||
|
||||
.. math::
|
||||
:label: interpolation-factor
|
||||
|
|
@ -465,89 +545,11 @@ linear-linear interpolation:
|
|||
|
||||
.. _sample-energy:
|
||||
|
||||
Sampling Secondary Energy and Correlated Angle/Energy Distributions
|
||||
-------------------------------------------------------------------
|
||||
Sampling Energy Distributions
|
||||
+++++++++++++++++++++++++++++
|
||||
|
||||
For a reaction with secondary neutrons, it is necessary to determine the
|
||||
outgoing energy of the neutrons. For any reaction other than elastic scattering,
|
||||
the outgoing energy must be determined based on tabulated or parameterized
|
||||
data. The `ENDF-6 Format`_ specifies a variety of ways that the secondary energy
|
||||
distribution can be represented. ENDF File 5 contains uncorrelated energy
|
||||
distribution where ENDF File 6 contains correlated energy-angle
|
||||
distributions. The ACE format specifies its own representations based loosely on
|
||||
the formats given in ENDF-6. In this section, we will describe how the outgoing
|
||||
energy of secondary particles is determined based on each ACE law.
|
||||
|
||||
One of the subtleties in the ACE format is the fact that a single reaction can
|
||||
have multiple secondary energy distributions. This is mainly useful for
|
||||
reactions with multiple neutrons in the exit channel such as :math:`(n,2n)` or
|
||||
:math:`(n,3n)`. In these types of reactions, each neutron is emitted
|
||||
corresponding to a different excitation level of the compound nucleus, and thus
|
||||
in general the neutrons will originate from different energy distributions. If
|
||||
multiple energy distributions are present, they are assigned probabilities that
|
||||
can then be used to randomly select one.
|
||||
|
||||
Once a secondary energy distribution has been sampled, the procedure for
|
||||
determining the outgoing energy will depend on which ACE law has been specified
|
||||
for the data.
|
||||
|
||||
.. _ace-law-1:
|
||||
|
||||
ACE Law 1 - Tabular Equiprobable Energy Bins
|
||||
++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
In the tabular equiprobable bin representation, an array of equiprobable
|
||||
outgoing energy bins is given for a number of incident energies. While the
|
||||
representation itself is simple, the complexity lies in how one interpolates
|
||||
between incident as well as outgoing energies on such a table. If one performs
|
||||
simple interpolation between tables for neighboring incident energies, it is
|
||||
possible that the resulting energies would violate laws governing the
|
||||
kinematics, i.e. the outgoing energy may be outside the range of available
|
||||
energy in the reaction.
|
||||
|
||||
To avoid this situation, the accepted practice is to use a process known as
|
||||
scaled interpolation [Doyas]_. First, we find the tabulated incident energies
|
||||
which bound the actual incoming energy of the particle, i.e. find :math:`i` such
|
||||
that :math:`E_i < E < E_{i+1}` and calculate the interpolation factor :math:`f`
|
||||
via :eq:`interpolation-factor`. Then, we interpolate between the minimum and
|
||||
maximum energies of the outgoing energy distributions corresponding to
|
||||
:math:`E_i` and :math:`E_{i+1}`:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-1-minmax
|
||||
|
||||
E_{min} = E_{i,1} + f ( E_{i+1,1} - E_i ) \\
|
||||
E_{max} = E_{i,M} + f ( E_{i+1,M} - E_M )
|
||||
|
||||
where :math:`E_{min}` and :math:`E_{max}` are the minimum and maximum outgoing
|
||||
energies of a scaled distribution, :math:`E_{i,j}` is the j-th outgoing energy
|
||||
corresponding to the incoming energy :math:`E_i`, and :math:`M` is the number of
|
||||
outgoing energy bins. Next, statistical interpolation is performed to choose
|
||||
between using the outgoing energy distributions corresponding to energy
|
||||
:math:`E_i` and :math:`E_{i+1}`. Let :math:`\ell` be the chosen table where
|
||||
:math:`\ell = i` if :math:`\xi_1 > f` and :math:`\ell = i + 1` otherwise, and
|
||||
:math:`\xi_1` is a random number. Now, we randomly sample an equiprobable
|
||||
outgoing energy bin :math:`j` and interpolate between successive values on the
|
||||
outgoing energy distribution:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-1-intermediate
|
||||
|
||||
\hat{E} = E_{\ell,j} + \xi_2 (E_{\ell,j+1} - E_{\ell,j})
|
||||
|
||||
where :math:`\xi_2` is a random number sampled uniformly on :math:`[0,1)`. Since
|
||||
this outgoing energy may violate reaction kinematics, we then scale it to the
|
||||
minimum and maximum energies we calculated earlier to get the final outgoing
|
||||
energy:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-1-energy
|
||||
|
||||
E' = E_{min} + \frac{\hat{E} - E_{\ell,1}}{E_{\ell,M} - E_{\ell,1}}
|
||||
(E_{max} - E_{min})
|
||||
|
||||
ACE Law 3 - Inelastic Level Scattering
|
||||
++++++++++++++++++++++++++++++++++++++
|
||||
Inelastic Level Scattering
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
It can be shown (see Foderaro_) that in inelastic level scattering, the outgoing
|
||||
energy of the neutron :math:`E'` can be related to the Q-value of the reaction
|
||||
|
|
@ -560,31 +562,50 @@ and the incoming energy:
|
|||
|
||||
where :math:`A` is the mass of the target nucleus measured in neutron masses.
|
||||
|
||||
.. _ace-law-4:
|
||||
.. _continuous-tabular:
|
||||
|
||||
ACE Law 4 - Continuous Tabular Distribution
|
||||
+++++++++++++++++++++++++++++++++++++++++++
|
||||
Continuous Tabular Distribution
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
This representation is very similar to :ref:`ace-law-1` except that instead of
|
||||
equiprobable outgoing energy bins, the outgoing energy distribution for each
|
||||
incoming energy is represented with a probability distribution function. For
|
||||
each incoming neutron energy :math:`E_i`, let us call :math:`p_{i,j}` the j-th
|
||||
value in the probability distribution function, :math:`c_{i,j}` the j-th value
|
||||
in the cumulative distribution function, and :math:`E_{i,j}` the j-th outgoing
|
||||
energy.
|
||||
In a continuous tabular distribution, a tabulated energy distribution is
|
||||
provided for each of a set of incoming energies. While the representation itself
|
||||
is simple, the complexity lies in how one interpolates between incident as well
|
||||
as outgoing energies on such a table. If one performs simple interpolation
|
||||
between tables for neighboring incident energies, it is possible that the
|
||||
resulting energies would violate laws governing the kinematics, i.e., the
|
||||
outgoing energy may be outside the range of available energy in the reaction.
|
||||
|
||||
We proceed first as we did for ACE Law 1, determining the bounding energies of
|
||||
the particle's incoming energy such that :math:`E_i < E < E_{i+1}` and
|
||||
calculating an interpolation factor :math:`f` with equation
|
||||
:eq:`interpolation-factor`. Next, statistical interpolation is performed to
|
||||
choose between using the outgoing energy distributions corresponding to energy
|
||||
:math:`E_i` and :math:`E_{i+1}`. Let :math:`\ell` be the chosen table where
|
||||
:math:`\ell = i` if :math:`\xi_1 > f` and :math:`\ell = i + 1` otherwise, and
|
||||
:math:`\xi_1` is a random number. Then, we sample an outgoing energy bin
|
||||
To avoid this situation, the accepted practice is to use a process known as
|
||||
scaled interpolation [Doyas]_. First, we find the tabulated incident energies
|
||||
which bound the actual incoming energy of the particle, i.e., find :math:`i`
|
||||
such that :math:`E_i < E < E_{i+1}` and calculate the interpolation factor
|
||||
:math:`f` via :eq:`interpolation-factor`. Then, we interpolate between the
|
||||
minimum and maximum energies of the outgoing energy distributions corresponding
|
||||
to :math:`E_i` and :math:`E_{i+1}`:
|
||||
|
||||
.. math::
|
||||
:label: continuous-minmax
|
||||
|
||||
E_{min} = E_{i,1} + f ( E_{i+1,1} - E_{i,1} ) \\
|
||||
E_{max} = E_{i,M} + f ( E_{i+1,M} - E_{i,M} )
|
||||
|
||||
where :math:`E_{min}` and :math:`E_{max}` are the minimum and maximum outgoing
|
||||
energies of a scaled distribution, :math:`E_{i,j}` is the j-th outgoing energy
|
||||
corresponding to the incoming energy :math:`E_i`, and :math:`M` is the number of
|
||||
outgoing energy bins.
|
||||
|
||||
Next, statistical interpolation is performed to choose between using the
|
||||
outgoing energy distributions corresponding to energy :math:`E_i` and
|
||||
:math:`E_{i+1}`. Let :math:`\ell` be the chosen table where :math:`\ell = i` if
|
||||
:math:`\xi_1 > f` and :math:`\ell = i + 1` otherwise, and :math:`\xi_1` is a
|
||||
random number. For each incoming neutron energy :math:`E_i`, let us call
|
||||
:math:`p_{i,j}` the j-th value in the probability distribution function,
|
||||
:math:`c_{i,j}` the j-th value in the cumulative distribution function, and
|
||||
:math:`E_{i,j}` the j-th outgoing energy. We then sample an outgoing energy bin
|
||||
:math:`j` using the cumulative distribution function:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-4-sample-cdf
|
||||
:label: continuous-sample-cdf
|
||||
|
||||
c_{\ell,j} < \xi_2 < c_{\ell,j+1}
|
||||
|
||||
|
|
@ -612,22 +633,22 @@ If linear-linear interpolation is to be used, the outgoing energy on the
|
|||
\right ).
|
||||
|
||||
Since this outgoing energy may violate reaction kinematics, we then scale it to
|
||||
minimum and maximum energies interpolated between the neighboring outgoing
|
||||
energy distributions to get the final outgoing energy:
|
||||
minimum and maximum energies calculated in equation :eq:`continuous-minmax` to
|
||||
get the final outgoing energy:
|
||||
|
||||
.. math::
|
||||
:label: ace-law-4-energy
|
||||
:label: continuous-eout
|
||||
|
||||
E' = E_{min} + \frac{\hat{E} - E_{\ell,1}}{E_{\ell,M} - E_{\ell,1}}
|
||||
(E_{max} - E_{min})
|
||||
|
||||
where :math:`E_{min}` and :math:`E_{max}` are defined the same as in equation
|
||||
:eq:`ace-law-1-minmax`.
|
||||
:eq:`continuous-minmax`.
|
||||
|
||||
.. _maxwell:
|
||||
|
||||
ACE Law 7 - Maxwell Fission Spectrum
|
||||
++++++++++++++++++++++++++++++++++++
|
||||
Maxwell Fission Spectrum
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
One representation of the secondary energies for neutrons from fission is the
|
||||
so-called Maxwell spectrum. A probability distribution for the Maxwell spectrum
|
||||
|
|
@ -640,7 +661,7 @@ can be written in the form
|
|||
|
||||
where :math:`E` is the incoming energy of the neutron and :math:`T` is the
|
||||
so-called nuclear temperature, which is a function of the incoming energy of the
|
||||
neutron. The ACE format contains a list of nuclear temperatures versus incoming
|
||||
neutron. The ENDF format contains a list of nuclear temperatures versus incoming
|
||||
energies. The nuclear temperature is interpolated between neighboring incoming
|
||||
energies using a specified interpolation law. Once the temperature :math:`T` is
|
||||
determined, we then calculate a candidate outgoing energy based on rule C64 in
|
||||
|
|
@ -660,12 +681,12 @@ interval. The outgoing energy is only accepted if
|
|||
|
||||
0 \le E' \le E - U
|
||||
|
||||
where :math:`U` is called the restriction energy and is specified on the ACE
|
||||
table. If the outgoing energy is rejected, it is resampled using equation
|
||||
where :math:`U` is called the restriction energy and is specified in the ENDF
|
||||
data. If the outgoing energy is rejected, it is resampled using equation
|
||||
:eq:`maxwell-E-candidate`.
|
||||
|
||||
ACE Law 9 - Evaporation Spectrum
|
||||
++++++++++++++++++++++++++++++++
|
||||
Evaporation Spectrum
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Evaporation spectra are primarily used in compound nucleus processes where a
|
||||
secondary particle can "evaporate" from the compound nucleus if it has
|
||||
|
|
@ -679,7 +700,7 @@ be written in the form
|
|||
|
||||
where :math:`E` is the incoming energy of the neutron and :math:`T` is the
|
||||
nuclear temperature, which is a function of the incoming energy of the
|
||||
neutron. The ACE format contains a list of nuclear temperatures versus incoming
|
||||
neutron. The ENDF format contains a list of nuclear temperatures versus incoming
|
||||
energies. The nuclear temperature is interpolated between neighboring incoming
|
||||
energies using a specified interpolation law. Once the temperature :math:`T` is
|
||||
determined, we then calculate a candidate outgoing energy based on the algorithm
|
||||
|
|
@ -697,11 +718,11 @@ energy as in equation :eq:`maxwell-restriction`. This algorithm has a much
|
|||
higher rejection efficiency than the standard technique, i.e. rule C45 in the
|
||||
`Monte Carlo Sampler`_.
|
||||
|
||||
ACE Law 11 - Energy-Dependent Watt Spectrum
|
||||
+++++++++++++++++++++++++++++++++++++++++++
|
||||
Energy-Dependent Watt Spectrum
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The probability distribution for a Watt fission spectrum can be written in the
|
||||
form
|
||||
The probability distribution for a [Watt]_ fission spectrum can be written in
|
||||
the form
|
||||
|
||||
.. math::
|
||||
:label: watt-spectrum
|
||||
|
|
@ -725,29 +746,37 @@ where :math:`\xi` is a random number sampled on the interval :math:`[0,1)`. The
|
|||
outgoing energy is only accepted according to a specified restriction energy
|
||||
:math:`U` as defined in equation :eq:`maxwell-restriction`.
|
||||
|
||||
This algorithm can be found in Forrest Brown's lectures_ on Monte Carlo methods
|
||||
and is an unpublished sampling scheme based on the original Watt spectrum
|
||||
derivation [Watt]_.
|
||||
A derivation of the algorithm described here can be found in a paper by Romano_.
|
||||
|
||||
ACE Law 44 - Kalbach-Mann Correlated Scattering
|
||||
+++++++++++++++++++++++++++++++++++++++++++++++
|
||||
Product Angle-Energy Distributions
|
||||
----------------------------------
|
||||
|
||||
This law is very similar to ACE Law 4 except now the outgoing angle of the
|
||||
neutron is correlated to the outgoing energy and is not sampled from a separate
|
||||
distribution. For each incident neutron energy :math:`E_i` tabulated, there is
|
||||
an array of precompound factors :math:`R_{i,j}` and angular distribution slopes
|
||||
:math:`A_{i,j}` corresponding to each outgoing energy bin :math:`j` in addition
|
||||
to the outgoing energies and distribution functions as in ACE Law 4.
|
||||
If the secondary distribution for a product was given in file 6 in ENDF, the
|
||||
angle and energy are correlated with one another and cannot be sampled
|
||||
separately. Several representations exist in ENDF/ACE for correlated
|
||||
angle-energy distributions.
|
||||
|
||||
Kalbach-Mann Correlated Scattering
|
||||
++++++++++++++++++++++++++++++++++
|
||||
|
||||
This law is very similar to the uncorrelated continuous tabular energy
|
||||
distribution except now the outgoing angle of the neutron is correlated to the
|
||||
outgoing energy and is not sampled from a separate distribution. For each
|
||||
incident neutron energy :math:`E_i` tabulated, there is an array of precompound
|
||||
factors :math:`R_{i,j}` and angular distribution slopes :math:`A_{i,j}`
|
||||
corresponding to each outgoing energy bin :math:`j` in addition to the outgoing
|
||||
energies and distribution functions as in :ref:`continuous-tabular`.
|
||||
|
||||
The calculation of the outgoing energy of the neutron proceeds exactly the same
|
||||
as in the algorithm described in :ref:`ace-law-4`. In that algorithm, we found
|
||||
an interpolation factor :math:`f`, statistically sampled an incoming energy bin
|
||||
:math:`\ell`, and sampled an outgoing energy bin :math:`j` based on the
|
||||
tabulated cumulative distribution function. Once the outgoing energy has been
|
||||
determined with equation :eq:`ace-law-4-energy`, we then need to calculate the
|
||||
outgoing angle based on the tabulated Kalbach-Mann parameters. These parameters
|
||||
themselves are subject to either histogram or linear-linear interpolation on the
|
||||
outgoing energy grid. For histogram interpolation, the parameters are
|
||||
as in the algorithm described in :ref:`continuous-tabular`. In that algorithm,
|
||||
we found an interpolation factor :math:`f`, statistically sampled an incoming
|
||||
energy bin :math:`\ell`, and sampled an outgoing energy bin :math:`j` based on
|
||||
the tabulated cumulative distribution function. Once the outgoing energy has
|
||||
been determined with equation :eq:`continuous-eout`, we then need to calculate
|
||||
the outgoing angle based on the tabulated Kalbach-Mann parameters. These
|
||||
parameters themselves are subject to either histogram or linear-linear
|
||||
interpolation on the outgoing energy grid. For histogram interpolation, the
|
||||
parameters are
|
||||
|
||||
.. math::
|
||||
:label: KM-parameters-histogram
|
||||
|
|
@ -793,52 +822,55 @@ outgoing angle is
|
|||
|
||||
\mu = \frac{1}{A} \ln \left ( \xi_4 e^A + (1 - \xi_4) e^{-A} \right ).
|
||||
|
||||
.. _ace-law-61:
|
||||
.. _correlated-energy-angle:
|
||||
|
||||
ACE Law 61 - Correlated Energy and Angle Distribution
|
||||
+++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
Correlated Energy and Angle Distribution
|
||||
++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
This law is very similar to ACE Law 44 in the sense that the outgoing angle of
|
||||
the neutron is correlated to the outgoing energy and is not sampled from a
|
||||
separate distribution. In this case though, rather than being determined from an
|
||||
analytical distribution function, the cosine of the scattering angle is
|
||||
determined from a tabulated distribution. For each incident energy :math:`i` and
|
||||
outgoing energy :math:`j`, there is a tabulated angular distribution.
|
||||
This distribution is very similar to a Kalbach-Mann distribution in the sense
|
||||
that the outgoing angle of the neutron is correlated to the outgoing energy and
|
||||
is not sampled from a separate distribution. In this case though, rather than
|
||||
being determined from an analytical distribution function, the cosine of the
|
||||
scattering angle is determined from a tabulated distribution. For each incident
|
||||
energy :math:`i` and outgoing energy :math:`j`, there is a tabulated angular
|
||||
distribution.
|
||||
|
||||
The calculation of the outgoing energy of the neutron proceeds exactly the same
|
||||
as in the algorithm described in :ref:`ace-law-4`. In that algorithm, we found
|
||||
an interpolation factor :math:`f`, statistically sampled an incoming energy bin
|
||||
:math:`\ell`, and sampled an outgoing energy bin :math:`j` based on the
|
||||
tabulated cumulative distribution function. Once the outgoing energy has been
|
||||
determined with equation :eq:`ace-law-4-energy`, we then need to decide which
|
||||
angular distribution to use. If histogram interpolation was used on the outgoing
|
||||
energy bins, then we use the angular distribution corresponding to incoming
|
||||
energy bin :math:`\ell` and outgoing energy bin :math:`j`. If linear-linear
|
||||
interpolation was used on the outgoing energy bins, then we use the whichever
|
||||
angular distribution was closer to the sampled value of the cumulative
|
||||
distribution function for the outgoing energy. The actual algorithm used to
|
||||
sample the chosen tabular angular distribution has been previously described in
|
||||
:ref:`angle-tabular`.
|
||||
as in the algorithm described in :ref:`continuous-tabular`. In that algorithm,
|
||||
we found an interpolation factor :math:`f`, statistically sampled an incoming
|
||||
energy bin :math:`\ell`, and sampled an outgoing energy bin :math:`j` based on
|
||||
the tabulated cumulative distribution function. Once the outgoing energy has
|
||||
been determined with equation :eq:`continuous-eout`, we then need to decide
|
||||
which angular distribution to use. If histogram interpolation was used on the
|
||||
outgoing energy bins, then we use the angular distribution corresponding to
|
||||
incoming energy bin :math:`\ell` and outgoing energy bin :math:`j`. If
|
||||
linear-linear interpolation was used on the outgoing energy bins, then we use
|
||||
the whichever angular distribution was closer to the sampled value of the
|
||||
cumulative distribution function for the outgoing energy. The actual algorithm
|
||||
used to sample the chosen tabular angular distribution has been previously
|
||||
described in :ref:`angle-tabular`.
|
||||
|
||||
ACE Law 66 - N-Body Phase Space Distribution
|
||||
++++++++++++++++++++++++++++++++++++++++++++
|
||||
N-Body Phase Space Distribution
|
||||
+++++++++++++++++++++++++++++++
|
||||
|
||||
Reactions in which there are more than two products of similar masses are
|
||||
sometimes best treated by using what's known as an N-body phase
|
||||
distribution. This distribution has the following probability density function
|
||||
for outgoing energy of the :math:`i`-th particle in the center-of-mass system:
|
||||
for outgoing energy and angle of the :math:`i`-th particle in the center-of-mass
|
||||
system:
|
||||
|
||||
.. math::
|
||||
:label: n-body-pdf
|
||||
|
||||
p_i(E') dE' = C_n \sqrt{E'} (E_i^{max} - E')^{(3n/2) - 4} dE'
|
||||
p_i(\mu, E') dE' d\mu = C_n \sqrt{E'} (E_i^{max} - E')^{(3n/2) - 4} dE' d\mu
|
||||
|
||||
where :math:`n` is the number of outgoing particles, :math:`C_n` is a
|
||||
normalization constant, :math:`E_i^{max}` is the maximum center-of-mass energy
|
||||
for particle :math:`i`, and :math:`E'` is the outgoing energy. The algorithm for
|
||||
sampling the outgoing energy is based on algorithms R28, C45, and C64 in the
|
||||
`Monte Carlo Sampler`_. First we calculate the maximum energy in the
|
||||
center-of-mass using the following equation:
|
||||
for particle :math:`i`, and :math:`E'` is the outgoing energy. We see in
|
||||
equation :eq:`n-body-pdf` that the angle is simply isotropic in the
|
||||
center-of-mass system. The algorithm for sampling the outgoing energy is based
|
||||
on algorithms R28, C45, and C64 in the `Monte Carlo Sampler`_. First we
|
||||
calculate the maximum energy in the center-of-mass using the following equation:
|
||||
|
||||
.. math::
|
||||
:label: n-body-emax
|
||||
|
|
@ -881,7 +913,7 @@ distribution. First, the documentation (and code) for MCNP5-1.60 has a mistake
|
|||
in the algorithm for :math:`n = 4`. That being said, there are no existing
|
||||
nuclear data evaluations which use an N-body phase space distribution with
|
||||
:math:`n = 4`, so the error would not affect any calculations. In the
|
||||
ENDF/B-VII.0 nuclear data evaluation, only one reaction uses an N-body phase
|
||||
ENDF/B-VII.1 nuclear data evaluation, only one reaction uses an N-body phase
|
||||
space distribution at all, the :math:`(n,2n)` reaction with H-2.
|
||||
|
||||
.. _transform-coordinates:
|
||||
|
|
@ -890,6 +922,9 @@ space distribution at all, the :math:`(n,2n)` reaction with H-2.
|
|||
Transforming a Particle's Coordinates
|
||||
-------------------------------------
|
||||
|
||||
Since all the multi-group data exists in the laboratory frame of reference, this
|
||||
section does not apply to the multi-group mode.
|
||||
|
||||
Once the cosine of the scattering angle :math:`\mu` has been sampled either from
|
||||
a angle distribution or a correlated angle-energy distribution, we are still
|
||||
left with the task of transforming the particle's coordinates. If the outgoing
|
||||
|
|
@ -941,6 +976,9 @@ the post-collision direction is calculated as
|
|||
Effect of Thermal Motion on Cross Sections
|
||||
------------------------------------------
|
||||
|
||||
Since all the multi-group data should be generated with thermal scattering
|
||||
treatments already, this section does not apply to the multi-group mode.
|
||||
|
||||
When a neutron scatters off of a nucleus, it may often be assumed that the
|
||||
target nucleus is at rest. However, the target nucleus will have motion
|
||||
associated with its thermal vibration, even at absolute zero (This is due to the
|
||||
|
|
@ -1272,6 +1310,8 @@ described fully in `Walsh et al.`_
|
|||
|sab| Tables
|
||||
------------
|
||||
|
||||
Note that |sab| tables are only applicable to continuous-energy transport.
|
||||
|
||||
For neutrons with thermal energies, generally less than 4 eV, the kinematics of
|
||||
scattering can be affected by chemical binding and crystalline effects of the
|
||||
target molecule. If these effects are not accounted for in a simulation, the
|
||||
|
|
@ -1439,16 +1479,16 @@ accordingly.
|
|||
Continuous Outgoing Energies
|
||||
++++++++++++++++++++++++++++
|
||||
|
||||
If the thermal data was processed with :math:`iwt=2` in NJOY, then the
|
||||
outgoing energy spectra is represented by a continuous outgoing energy spectra
|
||||
in tabular form with linear-linear interpolation. The sampling of the outgoing
|
||||
energy portion of this format is very similar to :ref:`ACE Law 61<ace-law-61>`,
|
||||
but the sampling of the correlated angle is performed as it was in the other
|
||||
two representations discussed in this sub-section. In the Law 61 algorithm,
|
||||
we found an interpolation factor :math:`f`, statistically sampled an incoming
|
||||
If the thermal data was processed with :math:`iwt=2` in NJOY, then the outgoing
|
||||
energy spectra is represented by a continuous outgoing energy spectra in tabular
|
||||
form with linear-linear interpolation. The sampling of the outgoing energy
|
||||
portion of this format is very similar to :ref:`correlated-energy-angle`, but
|
||||
the sampling of the correlated angle is performed as it was in the other two
|
||||
representations discussed in this sub-section. In the Law 61 algorithm, we
|
||||
found an interpolation factor :math:`f`, statistically sampled an incoming
|
||||
energy bin :math:`\ell`, and sampled an outgoing energy bin :math:`j` based on
|
||||
the tabulated cumulative distribution function. Once the outgoing energy has
|
||||
been determined with equation :eq:`ace-law-4-energy`, we then need to decide
|
||||
been determined with equation :eq:`continuous-eout`, we then need to decide
|
||||
which angular distribution data to use. Like the linear-linear interpolation
|
||||
case in Law 61, the angular distribution closest to the sampled value of the
|
||||
cumulative distribution function for the outgoing energy is utilized. The
|
||||
|
|
@ -1461,6 +1501,9 @@ actual algorithm utilized to sample the outgoing angle is shown in equation
|
|||
Unresolved Resonance Region Probability Tables
|
||||
----------------------------------------------
|
||||
|
||||
Note that unresolved resonance treatments are only applicable to
|
||||
continuous-energy transport.
|
||||
|
||||
In the unresolved resonance energy range, resonances may be so closely spaced
|
||||
that it is not possible for experimental measurements to resolve all
|
||||
resonances. To properly account for self-shielding in this energy range, OpenMC
|
||||
|
|
@ -1632,6 +1675,8 @@ another.
|
|||
|
||||
.. _MC21: http://www.osti.gov/bridge/servlets/purl/903083-HT5p1o/903083.pdf
|
||||
|
||||
.. _Romano: http://dx.doi.org/10.1016/j.cpc.2014.11.001
|
||||
|
||||
.. _Sutton and Brown: http://www.osti.gov/bridge/product.biblio.jsp?osti_id=307911
|
||||
|
||||
.. _lectures: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-05-4983.pdf
|
||||
|
|
|
|||
|
|
@ -4,6 +4,10 @@
|
|||
Tallies
|
||||
=======
|
||||
|
||||
Note that the methods discussed in this section are written specifically for
|
||||
continuous-energy mode but equivalent apply to the multi-group mode if the
|
||||
particle's energy is replaced with the particle's group
|
||||
|
||||
------------------
|
||||
Filters and Scores
|
||||
------------------
|
||||
|
|
@ -32,8 +36,9 @@ OpenMC: flux, total reaction rate, scattering reaction rate, neutron production
|
|||
from scattering, higher scattering moments, :math:`(n,xn)` reaction rates,
|
||||
absorption reaction rate, fission reaction rate, neutron production rate from
|
||||
fission, and surface currents. The following variables can be used as filters:
|
||||
universe, material, cell, birth cell, surface, mesh, pre-collision energy, and
|
||||
post-collision energy.
|
||||
universe, material, cell, birth cell, surface, mesh, pre-collision energy,
|
||||
post-collision energy, polar angle, azimuthal angle, and the cosine of the
|
||||
change-in-angle due to a scattering event.
|
||||
|
||||
With filters for pre- and post-collision energy and scoring functions for
|
||||
scattering and fission production, it is possible to use OpenMC to generate
|
||||
|
|
@ -55,9 +60,9 @@ be scored to for each value of the filter variable. If a particle is in cell
|
|||
:math:`n`, the mapping would identify what tally/bin combinations specify cell
|
||||
:math:`n` for the cell filter variable. In this manner, it is not necessary to
|
||||
check the phase space variables against each tally. Note that this technique
|
||||
only applies to discrete filter variables and cannot be applied to energy
|
||||
bins. For energy filters, it is necessary to perform a binary search on the
|
||||
specified energy grid.
|
||||
only applies to discrete filter variables and cannot be applied to energy,
|
||||
angle, or change-in-angle bins. For these filters, it is necessary to perform
|
||||
a binary search on the specified energy grid.
|
||||
|
||||
-----------------------------------------
|
||||
Volume-Integrated Flux and Reaction Rates
|
||||
|
|
@ -196,8 +201,9 @@ One important fact to take into consideration is that the use of a track-length
|
|||
estimator precludes us from using any filter that requires knowledge of the
|
||||
particle's state following a collision because by definition, it will not have
|
||||
had a collision at every event. Thus, for tallies with outgoing-energy filters
|
||||
(which require the post-collision energy) or for tallies of scattering moments
|
||||
(which require the scattering cosine), we must use an analog estimator.
|
||||
(which require the post-collision energy), scattering change-in-angle filters,
|
||||
or for tallies of scattering moments (which require the scattering cosine of
|
||||
the change-in-angle), we must use an analog estimator.
|
||||
|
||||
.. TODO: Add description of surface current tallies
|
||||
|
||||
|
|
@ -430,7 +436,7 @@ analytically. For one degree of freedom, the t-distribution becomes a standard
|
|||
.. math::
|
||||
:label: cauchy-cdf
|
||||
|
||||
c(x) = \frac{1}{\pi} \arctan x + \frac{1}{2}.
|
||||
c(x) = \frac{1}{\pi} \arctan x + \frac{1}{2}.
|
||||
|
||||
Thus, inverting the cumulative distribution function, we find the :math:`x`
|
||||
percentile of the standard Cauchy distribution to be
|
||||
|
|
|
|||
|
|
@ -53,6 +53,16 @@ Benchmarking
|
|||
Coupling and Multi-physics
|
||||
--------------------------
|
||||
|
||||
- Matthew Ellis, Benoit Forget, Kord Smith, and Derek Gaston, "Continuous
|
||||
Temperature Representation in Coupled OpenMC/MOOSE Simulations," *Proc. PHYSOR
|
||||
2016*, Sun Valley, Idaho, May 1-5, 2016.
|
||||
|
||||
- Antonios G. Mylonakis, Melpomeni Varvayanni, and Nicolas Catsaros,
|
||||
"Investigating a Matrix-free, Newton-based, Neutron-Monte
|
||||
Carlo/Thermal-Hydraulic Coupling Scheme", *Proc. Int. Conf. Nuclear Energy for
|
||||
New Europe*, Portoroz, Slovenia, Sep .14-17
|
||||
(2015). `<https://www.researchgate.net/publication/282001032>`_
|
||||
|
||||
- Matt Ellis, Benoit Forget, Kord Smith, and Derek Gaston, "Preliminary coupling
|
||||
of the Monte Carlo code OpenMC and the Multiphysics Object-Oriented Simulation
|
||||
Environment (MOOSE) for analyzing Doppler feedback in Monte Carlo
|
||||
|
|
@ -80,8 +90,17 @@ Geometry
|
|||
Miscellaneous
|
||||
-------------
|
||||
|
||||
- Yunzhao Li, Qingming He, Liangzhi Cao, Hongchun Wu, and Tiejun Zu, "Resonance
|
||||
Elastic Scattering and Interference Effects Treatments in Subgroup Method,"
|
||||
*Nucl. Eng. Tech.*, **48**, 339-350
|
||||
(2016). `<http://dx.doi.org/10.1016/j.net.2015.12.015>`_
|
||||
|
||||
- William Boyd, Sterling Harper, and Paul K. Romano, "Equipping OpenMC for the
|
||||
big data era," Accepted, *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016.
|
||||
big data era," *Proc. PHYSOR*, Sun Valley, Idaho, May 1-5, 2016.
|
||||
|
||||
- Michal Kostal, Vojtech Rypar, Jan Milcak, Vlastimil Juricek, Evzen Losa,
|
||||
Benoit Forget, and Sterling Harper, *Ann. Nucl. Energy*, **87**, 601-611
|
||||
(2016). `<http://dx.doi.org/10.1016/j.anucene.2015.10.010>`_
|
||||
|
||||
- Qicang Shen, William Boyd, Benoit Forget, and Kord Smith, "Tally precision
|
||||
triggers for the OpenMC Monte Carlo code," *Trans. Am. Nucl. Soc.*, **112**,
|
||||
|
|
@ -95,6 +114,11 @@ Miscellaneous
|
|||
Multi-group Cross Section Generation
|
||||
------------------------------------
|
||||
|
||||
- Zhaoyuan Liu, Kord Smith, and Benoit Forget, "A Cumulative Migration Method
|
||||
for Computing Rigorous Transport Cross Sections and Diffusion Coefficients for
|
||||
LWR Lattices with Monte Carlo," *Proc. PHYSOR*, Sun Valley, Idaho, May
|
||||
1-5, 2016.
|
||||
|
||||
- Adam G. Nelson and William R. Martin, "Improved Monte Carlo tallying of
|
||||
multi-group scattering moments using the NDPP code," *Trans. Am. Nucl. Soc.*,
|
||||
**113**, 645-648 (2015)
|
||||
|
|
@ -108,18 +132,43 @@ Multi-group Cross Section Generation
|
|||
Computational Methods Applied to Nuclear Science and Engineering*, Sun Valley,
|
||||
Idaho, May 5--9 (2013).
|
||||
|
||||
------------
|
||||
Nuclear Data
|
||||
------------
|
||||
|
||||
------------------
|
||||
Doppler Broadening
|
||||
------------------
|
||||
|
||||
- Colin Josey, Pablo Ducru, Benoit Forget, and Kord Smith, "Windowed multipole
|
||||
for cross section Doppler broadening," *J. Comput. Phys.*, In Press
|
||||
for cross section Doppler broadening," *J. Comput. Phys.*, **307**, 715-727
|
||||
(2016). `<http://dx.doi.org/10.1016/jcp.2015.08.013>`_
|
||||
|
||||
- Jonathan A. Walsh, Benoit Forget, Kord S. Smith, and Forrest B. Brown,
|
||||
"On-the-fly Doppler Broadening of Unresolved Resonance Region Cross Sections
|
||||
via Probability Band Interpolation," *Proc. PHYSOR*, Sun Valley, Idaho, May
|
||||
1-5, 2016.
|
||||
|
||||
- Colin Josey, Benoit Forget, and Kord Smith, "Windowed multipole sensitivity to
|
||||
target accuracy of the optimization procedure," *J. Nucl. Sci. Technol.*,
|
||||
**52**, 987-992 (2015). `<http://dx.doi.org/10.1080/00223131.2015.1035353>`_
|
||||
|
||||
- Paul K. Romano and Timothy H. Trumbull, "Comparison of algorithms for Doppler
|
||||
broadening pointwise tabulated cross sections," *Ann. Nucl. Energy*, **75**,
|
||||
358--364 (2015). `<http://dx.doi.org/10.1016/j.anucene.2014.08.046>`_
|
||||
|
||||
- Tuomas Viitanen, Jaakko Leppanen, and Benoit Forget, "Target motion sampling
|
||||
temperature treatment technique with track-length esimators in OpenMC --
|
||||
Preliminary results," *Proc. PHYSOR*, Kyoto, Japan, Sep. 28--Oct. 3 (2014).
|
||||
|
||||
- Benoit Forget, Sheng Xu, and Kord Smith, "Direct Doppler broadening in Monte
|
||||
Carlo simulations using the multipole representation," *Ann. Nucl. Energy*,
|
||||
**64**, 78--85 (2014). `<http://dx.doi.org/10.1016/j.anucene.2013.09.043>`_
|
||||
|
||||
------------
|
||||
Nuclear Data
|
||||
------------
|
||||
|
||||
- Paul K. Romano and Sterling M. Harper, "Nuclear data processing capabilities
|
||||
in OpenMC", *Proc. Nuclear Data*, Sep. 11-16, 2016.
|
||||
|
||||
- Jonathan A. Walsh, Paul K. Romano, Benoit Forget, and Kord S. Smith,
|
||||
"Optimizations of the energy grid search algorithm in continuous-energy Monte
|
||||
Carlo particle transport codes", *Comput. Phys. Commun.*, **196**, 134-142
|
||||
|
|
@ -139,29 +188,17 @@ Nuclear Data
|
|||
performance analysis for varying cross section parameter regimes,"
|
||||
*Proc. Joint Int. Conf. M&C+SNA+MC*, Nashville, Tennessee, Apr. 19--23 (2015).
|
||||
|
||||
- Paul K. Romano and Timothy H. Trumbull, "Comparison of algorithms for Doppler
|
||||
broadening pointwise tabulated cross sections," *Ann. Nucl. Energy*, **75**,
|
||||
358--364 (2015). `<http://dx.doi.org/10.1016/j.anucene.2014.08.046>`_
|
||||
|
||||
- Tuomas Viitanen, Jaakko Leppanen, and Benoit Forget, "Target motion sampling
|
||||
temperature treatment technique with track-length esimators in OpenMC --
|
||||
Preliminary results," *Proc. PHYSOR*, Kyoto, Japan, Sep. 28--Oct. 3 (2014).
|
||||
|
||||
- Jonathan A. Walsh, Benoit Forget, and Kord S. Smith, "Accelerated sampling
|
||||
of the free gas resonance elastic scattering kernel," *Ann. Nucl. Energy*,
|
||||
**69**, 116--124 (2014). `<http://dx.doi.org/10.1016/j.anucene.2014.01.017>`_
|
||||
|
||||
- Benoit Forget, Sheng Xu, and Kord Smith, "Direct Doppler broadening in Monte
|
||||
Carlo simulations using the multipole representation," *Ann. Nucl. Energy*,
|
||||
**64**, 78--85 (2014). `<http://dx.doi.org/10.1016/j.anucene.2013.09.043>`_
|
||||
|
||||
-----------
|
||||
Parallelism
|
||||
-----------
|
||||
|
||||
- Paul K. Romano, John R. Tramm, and Andrew R. Siegel, "Efficacy of hardware
|
||||
threading for Monte Carlo particle transport calculations on multi- and
|
||||
many-core systems," Accepted, *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016.
|
||||
many-core systems," *PHYSOR 2016*, Sun Valley, Idaho, May 1-5, 2016.
|
||||
|
||||
- David Ozog, Allen D. Malony, and Andrew R. Siegel, "A performance analysis of
|
||||
SIMD algorithms for Monte Carlo simulations of nuclear reactor cores,"
|
||||
|
|
@ -228,3 +265,11 @@ Parallelism
|
|||
- Paul K. Romano and Benoit Forget, "Parallel Fission Bank Algorithms in Monte
|
||||
Carlo Criticality Calculations," *Nucl. Sci. Eng.*, **170**, 125--135
|
||||
(2012). `<http://hdl.handle.net/1721.1/73569>`_
|
||||
|
||||
---------
|
||||
Depletion
|
||||
---------
|
||||
|
||||
- Kai Huang, Hongchun Wu, Yunzhao Li, and Liangzhi Cao, "Generalized depletion
|
||||
chain simplification based of significance analysis," *Proc. PHYSOR*, Sun
|
||||
Valley, Idaho, May 1-5, 2016.
|
||||
|
|
|
|||
BIN
docs/source/pythonapi/examples/images/mdgxs.png
Normal file
BIN
docs/source/pythonapi/examples/images/mdgxs.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
1559
docs/source/pythonapi/examples/mdgxs-part-i.ipynb
Normal file
1559
docs/source/pythonapi/examples/mdgxs-part-i.ipynb
Normal file
File diff suppressed because one or more lines are too long
13
docs/source/pythonapi/examples/mdgxs-part-i.rst
Normal file
13
docs/source/pythonapi/examples/mdgxs-part-i.rst
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
.. _notebook_mdgxs_part_i:
|
||||
|
||||
==========================
|
||||
MDGXS Part I: Introduction
|
||||
==========================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. notebook:: mdgxs-part-i.ipynb
|
||||
|
||||
.. only:: latex
|
||||
|
||||
IPython notebooks must be viewed in the online HTML documentation.
|
||||
1328
docs/source/pythonapi/examples/mdgxs-part-ii.ipynb
Normal file
1328
docs/source/pythonapi/examples/mdgxs-part-ii.ipynb
Normal file
File diff suppressed because one or more lines are too long
13
docs/source/pythonapi/examples/mdgxs-part-ii.rst
Normal file
13
docs/source/pythonapi/examples/mdgxs-part-ii.rst
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
.. _notebook_mdgxs_part_ii:
|
||||
|
||||
================================
|
||||
MDGXS Part II: Advanced Features
|
||||
================================
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. notebook:: mdgxs-part-ii.ipynb
|
||||
|
||||
.. only:: latex
|
||||
|
||||
IPython notebooks must be viewed in the online HTML documentation.
|
||||
|
|
@ -165,11 +165,11 @@
|
|||
"outputs": [],
|
||||
"source": [
|
||||
"# Instantiate some Nuclides\n",
|
||||
"h1 = openmc.Nuclide('H-1')\n",
|
||||
"o16 = openmc.Nuclide('O-16')\n",
|
||||
"u235 = openmc.Nuclide('U-235')\n",
|
||||
"u238 = openmc.Nuclide('U-238')\n",
|
||||
"zr90 = openmc.Nuclide('Zr-90')"
|
||||
"h1 = openmc.Nuclide('H1')\n",
|
||||
"o16 = openmc.Nuclide('O16')\n",
|
||||
"u235 = openmc.Nuclide('U235')\n",
|
||||
"u238 = openmc.Nuclide('U238')\n",
|
||||
"zr90 = openmc.Nuclide('Zr90')"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
@ -214,7 +214,6 @@
|
|||
"source": [
|
||||
"# Instantiate a Materials collection and export to XML\n",
|
||||
"materials_file = openmc.Materials([inf_medium])\n",
|
||||
"materials_file.default_xs = '71c'\n",
|
||||
"materials_file.export_to_xml()"
|
||||
]
|
||||
},
|
||||
|
|
@ -383,6 +382,9 @@
|
|||
"* `ScatterMatrixXS`\n",
|
||||
"* `NuScatterMatrixXS`\n",
|
||||
"* `Chi`\n",
|
||||
"* `ChiPrompt`\n",
|
||||
"* `InverseVelocity`\n",
|
||||
"* `PromptNuFissionXS`\n",
|
||||
"\n",
|
||||
"These classes provide us with an interface to generate the tally inputs as well as perform post-processing of OpenMC's tally data to compute the respective multi-group cross sections. In this case, let's create the multi-group total, absorption and scattering cross sections with our 2-group structure."
|
||||
]
|
||||
|
|
@ -419,24 +421,22 @@
|
|||
"data": {
|
||||
"text/plain": [
|
||||
"OrderedDict([('flux', Tally\n",
|
||||
"\tID =\t10000\n",
|
||||
"\tName =\t\n",
|
||||
"\tFilters =\t\n",
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
"\tNuclides =\ttotal \n",
|
||||
"\tScores =\t['flux']\n",
|
||||
"\tEstimator =\ttracklength\n",
|
||||
"), ('absorption', Tally\n",
|
||||
"\tID =\t10001\n",
|
||||
"\tName =\t\n",
|
||||
"\tFilters =\t\n",
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
"\tNuclides =\ttotal \n",
|
||||
"\tScores =\t['absorption']\n",
|
||||
"\tEstimator =\ttracklength\n",
|
||||
")])"
|
||||
" \tID =\t10000\n",
|
||||
" \tName =\t\n",
|
||||
" \tFilters =\t\n",
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
" \tNuclides =\ttotal \n",
|
||||
" \tScores =\t['flux']\n",
|
||||
" \tEstimator =\ttracklength), ('absorption', Tally\n",
|
||||
" \tID =\t10001\n",
|
||||
" \tName =\t\n",
|
||||
" \tFilters =\t\n",
|
||||
" \t\tcell\t[1]\n",
|
||||
" \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n",
|
||||
" \tNuclides =\ttotal \n",
|
||||
" \tScores =\t['absorption']\n",
|
||||
" \tEstimator =\ttracklength)])"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
|
|
@ -498,41 +498,54 @@
|
|||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
" .d88888b. 888b d888 .d8888b.\n",
|
||||
" d88P\" \"Y88b 8888b d8888 d88P Y88b\n",
|
||||
" 888 888 88888b.d88888 888 888\n",
|
||||
" 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n",
|
||||
" 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n",
|
||||
" 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n",
|
||||
" Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n",
|
||||
" \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n",
|
||||
"__________________888______________________________________________________\n",
|
||||
" 888\n",
|
||||
" 888\n",
|
||||
" %%%%%%%%%%%%%%%\n",
|
||||
" %%%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" %%%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" %%%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" ############### %%%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" ################## %%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" ################### %%%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" #################### %%%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" ##################### %%%%%%%%%%%%%%%%%%%%%\n",
|
||||
" ###################### %%%%%%%%%%%%%%%%%%%%\n",
|
||||
" ####################### %%%%%%%%%%%%%%%%%%\n",
|
||||
" ####################### %%%%%%%%%%%%%%%%%\n",
|
||||
" ###################### %%%%%%%%%%%%%%%%%\n",
|
||||
" #################### %%%%%%%%%%%%%%%%%\n",
|
||||
" ################# %%%%%%%%%%%%%%%%%\n",
|
||||
" ############### %%%%%%%%%%%%%%%%\n",
|
||||
" ############ %%%%%%%%%%%%%%%\n",
|
||||
" ######## %%%%%%%%%%%%%%\n",
|
||||
" %%%%%%%%%%%\n",
|
||||
"\n",
|
||||
" Copyright: 2011-2016 Massachusetts Institute of Technology\n",
|
||||
" License: http://openmc.readthedocs.io/en/latest/license.html\n",
|
||||
" Version: 0.7.1\n",
|
||||
" Git SHA1: 19feb55e6d5e8350398627f39fb55ee8e2e63011\n",
|
||||
" Date/Time: 2016-05-13 10:19:16\n",
|
||||
" MPI Processes: 1\n",
|
||||
" | The OpenMC Monte Carlo Code\n",
|
||||
" Copyright | 2011-2016 Massachusetts Institute of Technology\n",
|
||||
" License | http://openmc.readthedocs.io/en/latest/license.html\n",
|
||||
" Version | 0.8.0\n",
|
||||
" Git SHA1 | fbebf7bf709fe2fe1813af95bff9b29c0d59312c\n",
|
||||
" Date/Time | 2016-08-31 10:40:13\n",
|
||||
" OpenMP Threads | 4\n",
|
||||
"\n",
|
||||
" ===========================================================================\n",
|
||||
" ========================> INITIALIZATION <=========================\n",
|
||||
" ===========================================================================\n",
|
||||
"\n",
|
||||
" Reading settings XML file...\n",
|
||||
" Reading cross sections XML file...\n",
|
||||
" Reading geometry XML file...\n",
|
||||
" Reading cross sections XML file...\n",
|
||||
" Reading materials XML file...\n",
|
||||
" Reading H1 from /home/romano/openmc/data/nndc_hdf5/H1.h5\n",
|
||||
" Reading O16 from /home/romano/openmc/data/nndc_hdf5/O16.h5\n",
|
||||
" Reading U235 from /home/romano/openmc/data/nndc_hdf5/U235.h5\n",
|
||||
" Reading U238 from /home/romano/openmc/data/nndc_hdf5/U238.h5\n",
|
||||
" Reading Zr90 from /home/romano/openmc/data/nndc_hdf5/Zr90.h5\n",
|
||||
" Maximum neutron transport energy: 20.0000 MeV for H1\n",
|
||||
" Reading tallies XML file...\n",
|
||||
" Building neighboring cells lists for each surface...\n",
|
||||
" Loading ACE cross section table: 1001.71c\n",
|
||||
" Loading ACE cross section table: 8016.71c\n",
|
||||
" Loading ACE cross section table: 92235.71c\n",
|
||||
" Loading ACE cross section table: 92238.71c\n",
|
||||
" Loading ACE cross section table: 40090.71c\n",
|
||||
" Maximum neutron transport energy: 20.0000 MeV for 1001.71c\n",
|
||||
" Initializing source particles...\n",
|
||||
"\n",
|
||||
" ===========================================================================\n",
|
||||
|
|
@ -600,20 +613,20 @@
|
|||
"\n",
|
||||
" =======================> TIMING STATISTICS <=======================\n",
|
||||
"\n",
|
||||
" Total time for initialization = 4.2300E-01 seconds\n",
|
||||
" Reading cross sections = 9.3000E-02 seconds\n",
|
||||
" Total time in simulation = 1.6549E+01 seconds\n",
|
||||
" Time in transport only = 1.6535E+01 seconds\n",
|
||||
" Time in inactive batches = 2.3650E+00 seconds\n",
|
||||
" Time in active batches = 1.4184E+01 seconds\n",
|
||||
" Time synchronizing fission bank = 5.0000E-03 seconds\n",
|
||||
" Total time for initialization = 3.9900E-01 seconds\n",
|
||||
" Reading cross sections = 2.6500E-01 seconds\n",
|
||||
" Total time in simulation = 1.1488E+01 seconds\n",
|
||||
" Time in transport only = 1.1152E+01 seconds\n",
|
||||
" Time in inactive batches = 1.2180E+00 seconds\n",
|
||||
" Time in active batches = 1.0270E+01 seconds\n",
|
||||
" Time synchronizing fission bank = 4.0000E-03 seconds\n",
|
||||
" Sampling source sites = 3.0000E-03 seconds\n",
|
||||
" SEND/RECV source sites = 0.0000E+00 seconds\n",
|
||||
" SEND/RECV source sites = 1.0000E-03 seconds\n",
|
||||
" Time accumulating tallies = 0.0000E+00 seconds\n",
|
||||
" Total time for finalization = 0.0000E+00 seconds\n",
|
||||
" Total time elapsed = 1.6981E+01 seconds\n",
|
||||
" Calculation Rate (inactive) = 10570.8 neutrons/second\n",
|
||||
" Calculation Rate (active) = 7050.20 neutrons/second\n",
|
||||
" Total time for finalization = 1.0000E-03 seconds\n",
|
||||
" Total time elapsed = 1.1901E+01 seconds\n",
|
||||
" Calculation Rate (inactive) = 20525.5 neutrons/second\n",
|
||||
" Calculation Rate (active) = 9737.10 neutrons/second\n",
|
||||
"\n",
|
||||
" ============================> RESULTS <============================\n",
|
||||
"\n",
|
||||
|
|
@ -894,7 +907,7 @@
|
|||
" <td>6.250000e-07</td>\n",
|
||||
" <td>total</td>\n",
|
||||
" <td>(((total / flux) - (absorption / flux)) - (sca...</td>\n",
|
||||
" <td>-3.774758e-15</td>\n",
|
||||
" <td>-2.886580e-15</td>\n",
|
||||
" <td>0.011292</td>\n",
|
||||
" </tr>\n",
|
||||
" <tr>\n",
|
||||
|
|
@ -904,7 +917,7 @@
|
|||
" <td>2.000000e+01</td>\n",
|
||||
" <td>total</td>\n",
|
||||
" <td>(((total / flux) - (absorption / flux)) - (sca...</td>\n",
|
||||
" <td>1.443290e-15</td>\n",
|
||||
" <td>-5.551115e-16</td>\n",
|
||||
" <td>0.002570</td>\n",
|
||||
" </tr>\n",
|
||||
" </tbody>\n",
|
||||
|
|
@ -917,8 +930,8 @@
|
|||
"1 1 6.25e-07 2.00e+01 total \n",
|
||||
"\n",
|
||||
" score mean std. dev. \n",
|
||||
"0 (((total / flux) - (absorption / flux)) - (sca... -3.77e-15 1.13e-02 \n",
|
||||
"1 (((total / flux) - (absorption / flux)) - (sca... 1.44e-15 2.57e-03 "
|
||||
"0 (((total / flux) - (absorption / flux)) - (sca... -2.89e-15 1.13e-02 \n",
|
||||
"1 (((total / flux) - (absorption / flux)) - (sca... -5.55e-16 2.57e-03 "
|
||||
]
|
||||
},
|
||||
"execution_count": 22,
|
||||
|
|
@ -1167,21 +1180,21 @@
|
|||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 2",
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python2"
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 2
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython2",
|
||||
"version": "2.7.6"
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.5.2"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
898
docs/source/pythonapi/examples/nuclear-data.ipynb
Normal file
898
docs/source/pythonapi/examples/nuclear-data.ipynb
Normal file
File diff suppressed because one or more lines are too long
13
docs/source/pythonapi/examples/nuclear-data.rst
Normal file
13
docs/source/pythonapi/examples/nuclear-data.rst
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
.. _notebook_nuclear_data:
|
||||
|
||||
============
|
||||
Nuclear Data
|
||||
============
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. notebook:: nuclear-data.ipynb
|
||||
|
||||
.. only:: latex
|
||||
|
||||
IPython notebooks must be viewed in the online HTML documentation.
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
|
|
@ -27,6 +27,9 @@ Example Jupyter Notebooks
|
|||
examples/mgxs-part-ii
|
||||
examples/mgxs-part-iii
|
||||
examples/mgxs-part-iv
|
||||
examples/mdgxs-part-i
|
||||
examples/mdgxs-part-ii
|
||||
examples/nuclear-data
|
||||
|
||||
------------------------------------
|
||||
:mod:`openmc` -- Basic Functionality
|
||||
|
|
@ -35,9 +38,6 @@ Example Jupyter Notebooks
|
|||
Handling nuclear data
|
||||
---------------------
|
||||
|
||||
Classes
|
||||
+++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
|
|
@ -46,14 +46,6 @@ Classes
|
|||
openmc.XSdata
|
||||
openmc.MGXSLibrary
|
||||
|
||||
Functions
|
||||
+++++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
|
||||
openmc.ace.ascii_to_binary
|
||||
|
||||
Simulation Settings
|
||||
-------------------
|
||||
|
|
@ -224,6 +216,8 @@ Univariate Probability Distributions
|
|||
openmc.stats.Maxwell
|
||||
openmc.stats.Watt
|
||||
openmc.stats.Tabular
|
||||
openmc.stats.Legendre
|
||||
openmc.stats.Mixture
|
||||
|
||||
Angular Distributions
|
||||
---------------------
|
||||
|
|
@ -271,21 +265,41 @@ Multi-group Cross Sections
|
|||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myclass.rst
|
||||
:template: myclassinherit.rst
|
||||
|
||||
openmc.mgxs.MGXS
|
||||
openmc.mgxs.AbsorptionXS
|
||||
openmc.mgxs.CaptureXS
|
||||
openmc.mgxs.Chi
|
||||
openmc.mgxs.ChiPrompt
|
||||
openmc.mgxs.FissionXS
|
||||
openmc.mgxs.InverseVelocity
|
||||
openmc.mgxs.KappaFissionXS
|
||||
openmc.mgxs.MultiplicityMatrixXS
|
||||
openmc.mgxs.NuFissionXS
|
||||
openmc.mgxs.NuFissionMatrixXS
|
||||
openmc.mgxs.NuScatterXS
|
||||
openmc.mgxs.NuScatterMatrixXS
|
||||
openmc.mgxs.PromptNuFissionXS
|
||||
openmc.mgxs.ScatterXS
|
||||
openmc.mgxs.ScatterMatrixXS
|
||||
openmc.mgxs.TotalXS
|
||||
openmc.mgxs.TransportXS
|
||||
|
||||
Multi-delayed-group Cross Sections
|
||||
----------------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myclassinherit.rst
|
||||
|
||||
openmc.mgxs.MDGXS
|
||||
openmc.mgxs.ChiDelayed
|
||||
openmc.mgxs.DelayedNuFissionXS
|
||||
openmc.mgxs.Beta
|
||||
openmc.mgxs.DecayRate
|
||||
|
||||
Multi-group Cross Section Libraries
|
||||
-----------------------------------
|
||||
|
||||
|
|
@ -296,6 +310,113 @@ Multi-group Cross Section Libraries
|
|||
|
||||
openmc.mgxs.Library
|
||||
|
||||
-------------------------------------
|
||||
:mod:`openmc.model` -- Model Building
|
||||
-------------------------------------
|
||||
|
||||
TRISO Fuel Modeling
|
||||
-------------------
|
||||
|
||||
Classes
|
||||
+++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myclass.rst
|
||||
|
||||
openmc.model.TRISO
|
||||
|
||||
Functions
|
||||
+++++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
|
||||
openmc.model.create_triso_lattice
|
||||
openmc.model.pack_trisos
|
||||
|
||||
--------------------------------------------
|
||||
:mod:`openmc.data` -- Nuclear Data Interface
|
||||
--------------------------------------------
|
||||
|
||||
Physical Data
|
||||
-------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myfunction.rst
|
||||
|
||||
openmc.data.atomic_mass
|
||||
|
||||
Core Classes
|
||||
------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myclass.rst
|
||||
|
||||
openmc.data.IncidentNeutron
|
||||
openmc.data.Reaction
|
||||
openmc.data.Product
|
||||
openmc.data.Tabulated1D
|
||||
openmc.data.ThermalScattering
|
||||
openmc.data.CoherentElastic
|
||||
openmc.data.FissionEnergyRelease
|
||||
openmc.data.DataLibrary
|
||||
|
||||
Angle-Energy Distributions
|
||||
--------------------------
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myclass.rst
|
||||
|
||||
openmc.data.AngleEnergy
|
||||
openmc.data.KalbachMann
|
||||
openmc.data.CorrelatedAngleEnergy
|
||||
openmc.data.UncorrelatedAngleEnergy
|
||||
openmc.data.NBodyPhaseSpace
|
||||
openmc.data.AngleDistribution
|
||||
openmc.data.EnergyDistribution
|
||||
openmc.data.ArbitraryTabulated
|
||||
openmc.data.GeneralEvaporation
|
||||
openmc.data.MaxwellEnergy
|
||||
openmc.data.Evaporation
|
||||
openmc.data.WattEnergy
|
||||
openmc.data.MadlandNix
|
||||
openmc.data.DiscretePhoton
|
||||
openmc.data.LevelInelastic
|
||||
openmc.data.ContinuousTabular
|
||||
|
||||
ACE Format
|
||||
----------
|
||||
|
||||
Classes
|
||||
+++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
:template: myclass.rst
|
||||
|
||||
openmc.data.ace.Library
|
||||
openmc.data.ace.Table
|
||||
|
||||
Functions
|
||||
+++++++++
|
||||
|
||||
.. autosummary::
|
||||
:toctree: generated
|
||||
:nosignatures:
|
||||
|
||||
openmc.data.ace.ascii_to_binary
|
||||
openmc.data.write_compact_458_library
|
||||
|
||||
.. _Jupyter: https://jupyter.org/
|
||||
.. _NumPy: http://www.numpy.org/
|
||||
.. _Codecademy: https://www.codecademy.com/tracks/python
|
||||
|
|
|
|||
|
|
@ -1,78 +1,83 @@
|
|||
.. _releasenotes:
|
||||
|
||||
==============================
|
||||
Release Notes for OpenMC 0.7.1
|
||||
Release Notes for OpenMC 0.8.0
|
||||
==============================
|
||||
|
||||
This release of OpenMC provides some substantial improvements over version
|
||||
0.7.0. Non-simple cell regions can now be defined through the ``|`` (union) and
|
||||
``~`` (complement) operators. Similar changes in the Python API also allow
|
||||
complex cell regions to be defined. A true secondary particle bank now exists;
|
||||
this is crucial for photon transport (to be added in the next minor release). A
|
||||
rich API for multi-group cross section generation has been added via the
|
||||
``openmc.mgxs`` Python module.
|
||||
This release of OpenMC includes a few new major features including the
|
||||
capability to perform neutron transport with multi-group cross section data as
|
||||
well as experimental support for the windowed multipole method being developed
|
||||
at MIT. Source sampling options have also been expanded significantly, with the
|
||||
option to supply arbitrary tabular and discrete distributions for energy, angle,
|
||||
and spatial coordinates.
|
||||
|
||||
Various improvements to tallies have also been made. It is now possible to
|
||||
explicitly specify that a collision estimator be used in a tally. A new
|
||||
``delayedgroup`` filter and ``delayed-nu-fission`` score allow a user to obtain
|
||||
delayed fission neutron production rates filtered by delayed group. Finally, the
|
||||
new ``inverse-velocity`` score may be useful for calculating kinetics
|
||||
parameters.
|
||||
The Python API has been significantly restructured in this release compared to
|
||||
version 0.7.1. Any scripts written based on the version 0.7.1 API will likely
|
||||
need to be rewritten. Some of the most visible changes include the following:
|
||||
|
||||
.. caution:: In previous versions, depending on how OpenMC was compiled binary
|
||||
output was either given in HDF5 or a flat binary format. With this
|
||||
version, all binary output is now HDF5 which means you **must**
|
||||
have HDF5 in order to install OpenMC. Please consult the user's
|
||||
guide for instructions on how to compile with HDF5.
|
||||
- ``SettingsFile`` is now ``Settings``, ``MaterialsFile`` is now ``Materials``,
|
||||
and ``TalliesFile`` is now ``Tallies``.
|
||||
- The ``GeometryFile`` class no longer exists and is replaced by the
|
||||
``Geometry`` class which now has an ``export_to_xml()`` method.
|
||||
- Source distributions are defined using the ``Source`` class and assigned to
|
||||
the ``Settings.source`` property.
|
||||
- The ``Executor`` class no longer exists and is replaced by ``openmc.run()``
|
||||
and ``openmc.plot_geometry()`` functions.
|
||||
|
||||
The Python API documentation has also been significantly expanded.
|
||||
|
||||
-------------------
|
||||
System Requirements
|
||||
-------------------
|
||||
|
||||
There are no special requirements for running the OpenMC code. As of this
|
||||
release, OpenMC has been tested on a variety of Linux distributions, Mac OS X,
|
||||
and Microsoft Windows 7. Memory requirements will vary depending on the size of
|
||||
the problem at hand (mostly on the number of nuclides in the problem).
|
||||
release, OpenMC has been tested on a variety of Linux distributions and Mac
|
||||
OS X. Numerous users have reported working builds on Microsoft Windows, but your
|
||||
mileage may vary. Memory requirements will vary depending on the size of the
|
||||
problem at hand (mostly on the number of nuclides and tallies in the problem).
|
||||
|
||||
------------
|
||||
New Features
|
||||
------------
|
||||
|
||||
- Support for complex cell regions (union and complement operators)
|
||||
- Generic quadric surface type
|
||||
- Improved handling of secondary particles
|
||||
- Binary output is now solely HDF5
|
||||
- ``openmc.mgxs`` Python module enabling multi-group cross section generation
|
||||
- Collision estimator for tallies
|
||||
- Delayed fission neutron production tallies with ability to filter by delayed
|
||||
group
|
||||
- Inverse velocity tally score
|
||||
- Performance improvements for binary search
|
||||
- Performance improvements for reaction rate tallies
|
||||
- Multi-group mode
|
||||
- Vast improvements to the Python API
|
||||
- Experimental windowed multipole capability
|
||||
- Periodic boundary conditions
|
||||
- Expanded source sampling options
|
||||
- Distributed materials
|
||||
- Subcritical multiplication support
|
||||
- Improved method for reproducible URR table sampling
|
||||
- Refactor of continuous-energy reaction data
|
||||
- Improved documentation and new Jupyter notebooks
|
||||
|
||||
---------
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
- 299322_: Bug with material filter when void material present
|
||||
- d74840_: Fix triggers on tallies with multiple filters
|
||||
- c29a81_: Correctly handle maximum transport energy
|
||||
- 3edc23_: Fixes in the nu-scatter score
|
||||
- 629e3b_: Assume unspecified surface coefficients are zero in Python API
|
||||
- 5dbe8b_: Fix energy filters for openmc-plot-mesh-tally
|
||||
- ff66f4_: Fixes in the openmc-plot-mesh-tally script
|
||||
- 441fd4_: Fix bug in kappa-fission score
|
||||
- 7e5974_: Allow fixed source simulations from Python API
|
||||
- 70daa7_: Make sure MT=3 cross section is not used
|
||||
- 40b05f_: Ensure source bank is resampled for fixed source runs
|
||||
- 9586ed_: Fix two hexagonal lattice bugs
|
||||
- a855e8_: Make sure graphite models don't error out on max events
|
||||
- 7294a1_: Fix incorrect check on cmfd.xml
|
||||
- 12f246_: Ensure number of realizations is written to statepoint
|
||||
- 0227f4_: Fix bug when sampling multiple energy distributions
|
||||
- 51deaa_: Prevent segfault when user specifies '18' on tally scores
|
||||
- fed74b_: Prevent duplicate tally scores
|
||||
- 8467ae_: Better threshold for allowable lost particles
|
||||
- 493c6f_: Fix type of return argument for h5pget_driver_f
|
||||
|
||||
.. _299322: https://github.com/mit-crpg/openmc/commit/299322
|
||||
.. _d74840: https://github.com/mit-crpg/openmc/commit/d74840
|
||||
.. _c29a81: https://github.com/mit-crpg/openmc/commit/c29a81
|
||||
.. _3edc23: https://github.com/mit-crpg/openmc/commit/3edc23
|
||||
.. _629e3b: https://github.com/mit-crpg/openmc/commit/629e3b
|
||||
.. _5dbe8b: https://github.com/mit-crpg/openmc/commit/5dbe8b
|
||||
.. _ff66f4: https://github.com/mit-crpg/openmc/commit/ff66f4
|
||||
.. _441fd4: https://github.com/mit-crpg/openmc/commit/441fd4
|
||||
.. _7e5974: https://github.com/mit-crpg/openmc/commit/7e5974
|
||||
.. _70daa7: https://github.com/mit-crpg/openmc/commit/70daa7
|
||||
.. _40b05f: https://github.com/mit-crpg/openmc/commit/40b05f
|
||||
.. _9586ed: https://github.com/mit-crpg/openmc/commit/9586ed
|
||||
.. _a855e8: https://github.com/mit-crpg/openmc/commit/a855e8
|
||||
.. _7294a1: https://github.com/mit-crpg/openmc/commit/7294a1
|
||||
.. _12f246: https://github.com/mit-crpg/openmc/commit/12f246
|
||||
.. _0227f4: https://github.com/mit-crpg/openmc/commit/0227f4
|
||||
.. _51deaa: https://github.com/mit-crpg/openmc/commit/51deaa
|
||||
.. _fed74b: https://github.com/mit-crpg/openmc/commit/fed74b
|
||||
.. _8467ae: https://github.com/mit-crpg/openmc/commit/8467ae
|
||||
.. _493c6f: https://github.com/mit-crpg/openmc/commit/493c6f
|
||||
|
||||
------------
|
||||
Contributors
|
||||
|
|
@ -81,11 +86,11 @@ Contributors
|
|||
This release contains new contributions from the following people:
|
||||
|
||||
- `Will Boyd <wbinventor@gmail.com>`_
|
||||
- `Sterling Harper <sterlingmharper@mit.edu>`_
|
||||
- `Bryan Herman <hermab53@gmail.com>`_
|
||||
- `Derek Gaston <friedmud@gmail.com>`_
|
||||
- `Sterling Harper <sterlingmharper@gmail.com>`_
|
||||
- `Colin Josey <cjosey@mit.edu>`_
|
||||
- `Jingang Liang <liangjg2008@gmail.com>`_
|
||||
- `Adam Nelson <nelsonag@umich.edu>`_
|
||||
- `Paul Romano <paul.k.romano@gmail.com>`_
|
||||
- `Kelly Rowland <kellylynnerowland@gmail.com>`_
|
||||
- `Sam Shaner <samuelshaner@gmail.com>`_
|
||||
- `Jon Walsh <walshjon@mit.edu>`_
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ Now let's look at the pros and cons of Monte Carlo methods:
|
|||
|
||||
- **Pro**: Running simulations in parallel is conceptually very simple.
|
||||
|
||||
- **Con**: Because they related on repeated random sampling, they are
|
||||
- **Con**: Because they rely on repeated random sampling, they are
|
||||
computationally very expensive.
|
||||
|
||||
- **Con**: A simulation doesn't automatically give you the global solution
|
||||
|
|
|
|||
|
|
@ -281,6 +281,8 @@ based on the recommended value in LA-UR-14-24530_.
|
|||
|
||||
.. note:: This element is not used in the multi-group :ref:`energy_mode`.
|
||||
|
||||
.. _multipole_library:
|
||||
|
||||
``<multipole_library>`` Element
|
||||
-------------------------------
|
||||
|
||||
|
|
@ -290,8 +292,8 @@ OpenMC can use it for on-the-fly Doppler-broadening of resolved resonance range
|
|||
cross sections. If this element is absent from the settings.xml file, the
|
||||
:envvar:`OPENMC_MULTIPOLE_LIBRARY` environment variable will be used.
|
||||
|
||||
.. note:: The <use_windowed_multipole> element must also be set to "true"
|
||||
for windowed multipole functionality.
|
||||
.. note:: The :ref:`temperature_method` must also be set to "multipole" for
|
||||
windowed multipole functionality.
|
||||
|
||||
``<max_order>`` Element
|
||||
---------------------------
|
||||
|
|
@ -395,19 +397,16 @@ attributes or sub-elements:
|
|||
|
||||
:scatterer:
|
||||
An element with attributes/sub-elements called ``nuclide``, ``method``,
|
||||
``xs_label``, ``xs_label_0K``, ``E_min``, and ``E_max``. The ``nuclide``
|
||||
attribute is the name, as given by the ``name`` attribute within the
|
||||
``nuclide`` sub-element of the ``material`` element in ``materials.xml``,
|
||||
of the nuclide to which a resonance scattering treatment is to be applied.
|
||||
``E_min``, and ``E_max``. The ``nuclide`` attribute is the name, as given
|
||||
by the ``name`` attribute within the ``nuclide`` sub-element of the
|
||||
``material`` element in ``materials.xml``, of the nuclide to which a
|
||||
resonance scattering treatment is to be applied.
|
||||
The ``method`` attribute gives the type of resonance scattering treatment
|
||||
that is to be applied to the ``nuclide``. Acceptable inputs - none of
|
||||
which are case-sensitive - for the ``method`` attribute are ``ARES``,
|
||||
``CXS``, ``WCM``, and ``DBRC``. Descriptions of each of these methods
|
||||
are documented here_. The ``xs_label`` attribute gives the label for the
|
||||
cross section data of the ``nuclide`` at a given temperature. The
|
||||
``xs_label_0K`` gives the label for the 0 K cross section data for the
|
||||
``nuclide``. The ``E_min`` attribute gives the minimum energy above
|
||||
which the ``method`` is applied. The ``E_max`` attribute gives the
|
||||
are documented here_. The ``E_min`` attribute gives the minimum energy
|
||||
above which the ``method`` is applied. The ``E_max`` attribute gives the
|
||||
maximum energy below which the ``method`` is applied. One example would
|
||||
be as follows:
|
||||
|
||||
|
|
@ -419,16 +418,12 @@ attributes or sub-elements:
|
|||
<scatterer>
|
||||
<nuclide>U-238</nuclide>
|
||||
<method>ARES</method>
|
||||
<xs_label>92238.72c</xs_label>
|
||||
<xs_label_0K>92238.00c</xs_label_0K>
|
||||
<E_min>5.0e-6</E_min>
|
||||
<E_max>40.0e-6</E_max>
|
||||
</scatterer>
|
||||
<scatterer>
|
||||
<nuclide>Pu-239</nuclide>
|
||||
<method>dbrc</method>
|
||||
<xs_label>94239.72c</xs_label>
|
||||
<xs_label_0K>94239.00c</xs_label_0K>
|
||||
<E_min>0.01e-6</E_min>
|
||||
<E_max>210.0e-6</E_max>
|
||||
</scatterer>
|
||||
|
|
@ -688,7 +683,7 @@ attributes/sub-elements:
|
|||
|
||||
*Default*: false
|
||||
|
||||
:source_write:
|
||||
: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
|
||||
size of state points if large numbers of particles per batch are used.
|
||||
|
|
@ -714,6 +709,48 @@ survival biasing, otherwise known as implicit capture or absorption.
|
|||
|
||||
*Default*: false
|
||||
|
||||
.. _temperature_default:
|
||||
|
||||
``<temperature_default>`` Element
|
||||
---------------------------------
|
||||
|
||||
The ``<temperature_default>`` element specifies a default temperature in Kelvin
|
||||
that is to be applied to cells in the absence of an explicit cell temperature or
|
||||
a material default temperature.
|
||||
|
||||
*Default*: 293.6 K
|
||||
|
||||
.. _temperature_method:
|
||||
|
||||
``<temperature_method>`` Element
|
||||
--------------------------------
|
||||
|
||||
The ``<temperature_method>`` element has an accepted value of "nearest",
|
||||
"interpolation", or "multipole". A value of "nearest" indicates that for each
|
||||
cell, the nearest temperature at which cross sections are given is to be
|
||||
applied, within a given tolerance (see :ref:`temperature_tolerance`). A value of
|
||||
"interpolation" indicates that cross sections are to be linear-linear
|
||||
interpolated between temperatures at which nuclear data are present (see
|
||||
:ref:`temperature_treatment`). A value of "multipole" indicates that the
|
||||
windowed multipole method should be used to evaluate temperature-dependent cross
|
||||
sections in the resolved resonance range (a :ref:`windowed multipole library
|
||||
<multipole_library>` must also be available).
|
||||
|
||||
*Default*: "nearest"
|
||||
|
||||
.. _temperature_tolerance:
|
||||
|
||||
``<temperature_tolerance>`` Element
|
||||
-----------------------------------
|
||||
|
||||
The ``<temperature_tolerance>`` element specifies a tolerance in Kelvin that is
|
||||
to be applied when the "nearest" temperature method is used. For example, if a
|
||||
cell temperature is 340 K and the tolerance is 15 K, then the closest
|
||||
temperature in the range of 325 K to 355 K will be used to evaluate cross
|
||||
sections.
|
||||
|
||||
*Default*: 10 K
|
||||
|
||||
``<threads>`` Element
|
||||
---------------------
|
||||
|
||||
|
|
@ -836,6 +873,35 @@ displayed. This element takes the following attributes:
|
|||
|
||||
*Default*: 5
|
||||
|
||||
``<volume_calc>`` Element
|
||||
-------------------------
|
||||
|
||||
The ``<volume_calc>`` element indicates that a stochastic volume calculation
|
||||
should be run at the beginning of the simulation. This element has the following
|
||||
sub-elements/attributes:
|
||||
|
||||
:cells:
|
||||
The unique IDs of cells for which the volume should be estimated.
|
||||
|
||||
*Default*: None
|
||||
|
||||
:samples:
|
||||
The number of samples used to estimate volumes.
|
||||
|
||||
*Default*: None
|
||||
|
||||
:lower_left:
|
||||
The lower-left Cartesian coordinates of a bounding box that is used to
|
||||
sample points within.
|
||||
|
||||
*Default*: None
|
||||
|
||||
:upper_right:
|
||||
The upper-right Cartesian coordinates of a bounding box that is used to
|
||||
sample points within.
|
||||
|
||||
*Default*: None
|
||||
|
||||
--------------------------------------
|
||||
Geometry Specification -- geometry.xml
|
||||
--------------------------------------
|
||||
|
|
@ -921,11 +987,19 @@ Each ``<surface>`` element can have the following attributes or sub-elements:
|
|||
*Default*: None
|
||||
|
||||
:boundary:
|
||||
The boundary condition for the surface. This can be "transmission",
|
||||
"vacuum", or "reflective".
|
||||
The boundary condition for the surface. This can be "transmission",
|
||||
"vacuum", "reflective", or "periodic". Periodic boundary conditions can
|
||||
only be applied to x-, y-, and z-planes. Only axis-aligned periodicity is
|
||||
supported, i.e., x-planes can only be paired with x-planes. Specify which
|
||||
planes are periodic and the code will automatically identify which planes
|
||||
are paired together.
|
||||
|
||||
*Default*: "transmission"
|
||||
|
||||
:periodic_surface_id:
|
||||
If a periodic boundary condition is applied, this attribute identifies the
|
||||
``id`` of the corresponding periodic sufrace.
|
||||
|
||||
The following quadratic surfaces can be modeled:
|
||||
|
||||
:x-plane:
|
||||
|
|
@ -1053,7 +1127,9 @@ Each ``<cell>`` element can have the following attributes or sub-elements:
|
|||
specified for the "distributed temperature" feature. This will give each
|
||||
unique instance of the cell its own temperature.
|
||||
|
||||
*Default*: The temperature of the coldest nuclide in the cell's material(s)
|
||||
*Default*: If a material default temperature is supplied, it is used. In the
|
||||
absence of a material default temperature, the :ref:`global default
|
||||
temperature <temperature_default>` is used.
|
||||
|
||||
:rotation:
|
||||
If the cell is filled with a universe, this element specifies the angles in
|
||||
|
|
@ -1258,6 +1334,14 @@ Each ``material`` element can have the following attributes or sub-elements:
|
|||
|
||||
*Default*: ""
|
||||
|
||||
:temperature:
|
||||
An element with no attributes which is used to set the default temperature
|
||||
of the material in Kelvin.
|
||||
|
||||
*Default*: If a material default temperature is not given and a cell
|
||||
temperature is not specified, the :ref:`global default temperature
|
||||
<temperature_default>` is used.
|
||||
|
||||
:density:
|
||||
An element with attributes/sub-elements called ``value`` and ``units``. The
|
||||
``value`` attribute is the numeric value of the density while the ``units``
|
||||
|
|
@ -1278,17 +1362,16 @@ Each ``material`` element can have the following attributes or sub-elements:
|
|||
``nuclide``, ``element``, or ``sab`` quantity.
|
||||
|
||||
:nuclide:
|
||||
An element with attributes/sub-elements called ``name``, ``xs``, and ``ao``
|
||||
An element with attributes/sub-elements called ``name``, and ``ao``
|
||||
or ``wo``. The ``name`` attribute is the name of the cross-section for a
|
||||
desired nuclide while the ``xs`` attribute is the cross-section
|
||||
identifier. Finally, the ``ao`` and ``wo`` attributes specify the atom or
|
||||
desired nuclide. Finally, the ``ao`` and ``wo`` attributes specify the atom or
|
||||
weight percent of that nuclide within the material, respectively. One
|
||||
example would be as follows:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<nuclide name="H-1" xs="70c" ao="2.0" />
|
||||
<nuclide name="O-16" xs="70c" ao="1.0" />
|
||||
<nuclide name="H1" ao="2.0" />
|
||||
<nuclide name="O16" ao="1.0" />
|
||||
|
||||
.. note:: If one nuclide is specified in atom percent, all others must also
|
||||
be given in atom percent. The same applies for weight percentages.
|
||||
|
|
@ -1312,11 +1395,10 @@ Each ``material`` element can have the following attributes or sub-elements:
|
|||
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 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:
|
||||
attributes/sub-elements called ``name``, and ``ao``. The ``name``
|
||||
attribute is the atomic symbol of the element. Finally, the ``ao``
|
||||
attribute specifies the atom percent of the element within the material,
|
||||
respectively. One example would be as follows:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
|
|
@ -1346,10 +1428,9 @@ Each ``material`` element can have the following attributes or sub-elements:
|
|||
multi-group :ref:`energy_mode`.
|
||||
|
||||
:sab:
|
||||
Associates an S(a,b) table with the material. This element has
|
||||
attributes/sub-elements called ``name`` and ``xs``. The ``name`` attribute
|
||||
is the name of the S(a,b) table that should be associated with the material,
|
||||
and ``xs`` is the cross-section identifier for the table.
|
||||
Associates an S(a,b) table with the material. This element has one
|
||||
attribute/sub-element called ``name``. The ``name`` attribute
|
||||
is the name of the S(a,b) table that should be associated with the material.
|
||||
|
||||
*Default*: None
|
||||
|
||||
|
|
@ -1360,14 +1441,13 @@ Each ``material`` element can have the following attributes or sub-elements:
|
|||
recognizes that some multi-group libraries may be providing material
|
||||
specific macroscopic cross sections instead of always providing nuclide
|
||||
specific data like in the continuous-energy case. To that end, the
|
||||
macroscopic element has attributes/sub-elements called ``name``, and ``xs``.
|
||||
macroscopic element has one attribute/sub-element called ``name``.
|
||||
The ``name`` attribute is the name of the cross-section for a
|
||||
desired nuclide while the ``xs`` attribute is the cross-section
|
||||
identifier. One example would be as follows:
|
||||
desired nuclide. One example would be as follows:
|
||||
|
||||
.. code-block:: xml
|
||||
|
||||
<macroscopic name="UO2" xs="71c" />
|
||||
<macroscopic name="UO2" />
|
||||
|
||||
.. note:: This element is only used in the multi-group :ref:`energy_mode`.
|
||||
|
||||
|
|
@ -1376,18 +1456,6 @@ Each ``material`` element can have the following attributes or sub-elements:
|
|||
.. _IUPAC Isotopic Compositions of the Elements 2009:
|
||||
http://pac.iupac.org/publications/pac/pdf/2011/pdf/8302x0397.pdf
|
||||
|
||||
``<default_xs>`` Element
|
||||
------------------------
|
||||
|
||||
In some circumstances, the cross-section identifier may be the same for many or
|
||||
all nuclides in a given problem. In this case, rather than specifying the
|
||||
``xs=...`` attribute on every nuclide, a ``<default_xs>`` element can be used to
|
||||
set the default cross-section identifier for any nuclide without an identifier
|
||||
explicitly listed. This element has no attributes and accepts a 3-letter string
|
||||
that indicates the default cross-section identifier, e.g. "70c".
|
||||
|
||||
*Default*: None
|
||||
|
||||
------------------------------------
|
||||
Tallies Specification -- tallies.xml
|
||||
------------------------------------
|
||||
|
|
@ -1623,7 +1691,8 @@ The ``<tally>`` element accepts the following sub-elements:
|
|||
|Score | Description |
|
||||
+======================+===================================================+
|
||||
|absorption |Total absorption rate. This accounts for all |
|
||||
| |reactions which do not produce secondary neutrons. |
|
||||
| |reactions which do not produce secondary neutrons |
|
||||
| |as well as fission. |
|
||||
+----------------------+---------------------------------------------------+
|
||||
|elastic |Elastic scattering reaction rate. |
|
||||
+----------------------+---------------------------------------------------+
|
||||
|
|
@ -1755,6 +1824,10 @@ The ``<tally>`` element accepts the following sub-elements:
|
|||
| |fission. This score type is not used in the |
|
||||
| |multi-group :ref:`energy_mode`. |
|
||||
+----------------------+---------------------------------------------------+
|
||||
|prompt-nu-fission |Total production of prompt neutrons due to |
|
||||
| |fission. This score type is not used in the |
|
||||
| |multi-group :ref:`energy_mode`. |
|
||||
+----------------------+---------------------------------------------------+
|
||||
|nu-fission |Total production of neutrons due to fission. |
|
||||
+----------------------+---------------------------------------------------+
|
||||
|nu-scatter, |These scores are similar in functionality to their |
|
||||
|
|
@ -1796,6 +1869,32 @@ The ``<tally>`` element accepts the following sub-elements:
|
|||
| |:math:`\gamma`-rays are assumed to deposit their |
|
||||
| |energy locally. Units are MeV per source particle. |
|
||||
+----------------------+---------------------------------------------------+
|
||||
|fission-q-prompt |The prompt fission energy production rate. This |
|
||||
| |energy comes in the form of fission fragment |
|
||||
| |nuclei, prompt neutrons, and prompt |
|
||||
| |:math:`\gamma`-rays. This value depends on the |
|
||||
| |incident energy and it requires that the nuclear |
|
||||
| |data library contains the optional fission energy |
|
||||
| |release data. Energy is assumed to be deposited |
|
||||
| |locally. Units are MeV per source particle. |
|
||||
+----------------------+---------------------------------------------------+
|
||||
|fission-q-recoverable |The recoverable fission energy production rate. |
|
||||
| |This energy comes in the form of fission fragment |
|
||||
| |nuclei, prompt and delayed neutrons, prompt and |
|
||||
| |delayed :math:`\gamma`-rays, and delayed |
|
||||
| |:math:`\beta`-rays. This tally differs from the |
|
||||
| |kappa-fission tally in that it is dependent on |
|
||||
| |incident neutron energy and it requires that the |
|
||||
| |nuclear data library contains the optional fission |
|
||||
| |energy release data. Energy is assumed to be |
|
||||
| |deposited locally. Units are MeV per source |
|
||||
| |paticle. |
|
||||
+----------------------+---------------------------------------------------+
|
||||
|decay-rate |The delayed-nu-fission-weighted decay rate where |
|
||||
| |the decay rate is in units of inverse seconds. |
|
||||
| |This score type is not used in the |
|
||||
| |multi-group :ref:`energy_mode`. |
|
||||
+----------------------+---------------------------------------------------+
|
||||
|
||||
.. note::
|
||||
The ``analog`` estimator is actually identical to the ``collision``
|
||||
|
|
@ -2077,8 +2176,8 @@ attributes or sub-elements. These are not used in "voxel" plots:
|
|||
*Default*: None
|
||||
|
||||
:meshlines:
|
||||
The ``meshlines`` sub-element allows for plotting the boundaries of
|
||||
a tally mesh on top of a plot. Only one ``meshlines`` element is allowed per
|
||||
The ``meshlines`` sub-element allows for plotting the boundaries of a
|
||||
regular mesh on top of a plot. Only one ``meshlines`` element is allowed per
|
||||
``plot`` element, and it must contain as attributes or sub-elements a mesh
|
||||
type and a linewidth. Optionally, a color may be specified for the overlay:
|
||||
|
||||
|
|
|
|||
|
|
@ -204,20 +204,22 @@ should be used:
|
|||
Compiling with MPI
|
||||
++++++++++++++++++
|
||||
|
||||
To compile with MPI, set the :envvar:`FC` environment variable to the path to
|
||||
the MPI Fortran wrapper. For example, in a bash shell:
|
||||
To compile with MPI, set the :envvar:`FC` and :envvar:`CC` environment variables
|
||||
to the path to the MPI Fortran and C wrappers, respectively. For example, in a
|
||||
bash shell:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
export FC=mpif90
|
||||
export CC=mpicc
|
||||
cmake /path/to/openmc
|
||||
|
||||
Note that in many shells, an environment variable can be set for a single
|
||||
command, i.e.
|
||||
Note that in many shells, environment variables can be set for a single command,
|
||||
i.e.
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
FC=mpif90 cmake /path/to/openmc
|
||||
FC=mpif90 CC=mpicc cmake /path/to/openmc
|
||||
|
||||
Selecting HDF5 Installation
|
||||
+++++++++++++++++++++++++++
|
||||
|
|
@ -343,7 +345,7 @@ compiler, it is necessary to specify that all objects be compiled with the
|
|||
.. code-block:: sh
|
||||
|
||||
mkdir build && cd build
|
||||
FC=ifort FFLAGS=-mmic cmake -Dopenmp=on ..
|
||||
FC=ifort CC=icc FFLAGS=-mmic cmake -Dopenmp=on ..
|
||||
make
|
||||
|
||||
Note that unless an HDF5 build for the Intel Xeon Phi is already on your target
|
||||
|
|
@ -381,14 +383,16 @@ Cross Section Configuration
|
|||
---------------------------
|
||||
|
||||
In order to run a simulation with OpenMC, you will need cross section data for
|
||||
each nuclide or material in your problem. OpenMC can be run in
|
||||
continuous-energy or multi-group mode.
|
||||
each nuclide or material in your problem. OpenMC can be run in continuous-energy
|
||||
or multi-group mode.
|
||||
|
||||
In continuous-energy mode OpenMC uses ACE format cross sections; in this case
|
||||
you can use nuclear data that was processed with NJOY_, such as that
|
||||
distributed with MCNP_ or Serpent_. Several sources provide free processed
|
||||
ACE data as described below. The TALYS-based evaluated nuclear data library,
|
||||
TENDL_, is also openly available in ACE format.
|
||||
In continuous-energy mode, OpenMC uses a native HDF5 format to store all nuclear
|
||||
data. If you have ACE format data that was produced with NJOY_, such as that
|
||||
distributed with MCNP_ or Serpent_, it can be converted to the HDF5 format using
|
||||
the :ref:`openmc-ace-to-hdf5 <other_cross_sections>` script distributed with
|
||||
OpenMC. Several sources provide openly available ACE data as described
|
||||
below. The TALYS-based evaluated nuclear data library, TENDL_, is also available
|
||||
in ACE format.
|
||||
|
||||
In multi-group mode, OpenMC utilizes an XML-based library format which can be
|
||||
used to describe nuclide- or material-specific quantities.
|
||||
|
|
@ -398,8 +402,8 @@ Using ENDF/B-VII.1 Cross Sections from NNDC
|
|||
|
||||
The NNDC_ provides ACE data from the ENDF/B-VII.1 neutron and thermal scattering
|
||||
sublibraries at four temperatures processed using NJOY_. To use this data with
|
||||
OpenMC, a script is provided with OpenMC that will automatically download,
|
||||
extract, and set up a confiuration file:
|
||||
OpenMC, a script is provided with OpenMC that will automatically download and
|
||||
extract the ACE data, fix any deficiencies, and create an HDF5 library:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
|
|
@ -408,56 +412,99 @@ extract, and set up a confiuration file:
|
|||
|
||||
At this point, you should set the :envvar:`OPENMC_CROSS_SECTIONS` environment
|
||||
variable to the absolute path of the file
|
||||
``openmc/data/nndc/cross_sections.xml``. This cross section set is used by the
|
||||
test suite.
|
||||
``openmc/data/nndc_hdf5/cross_sections.xml``. This cross section set is used by
|
||||
the test suite.
|
||||
|
||||
Using JEFF Cross Sections from OECD/NEA
|
||||
---------------------------------------
|
||||
|
||||
The NEA_ provides processed ACE data from the JEFF_ nuclear library upon
|
||||
request. A DVD of the data can be requested here_. To use this data with OpenMC,
|
||||
the following steps must be taken:
|
||||
The NEA_ provides processed ACE data from the JEFF_ library. To use this data
|
||||
with OpenMC, a script is provided with OpenMC that will automatically download
|
||||
and extract the ACE data, fix any deficiencies, and create an HDF5 library.
|
||||
|
||||
1. Copy and unzip the data on the DVD to a directory on your computer.
|
||||
2. In the root directory, a file named ``xsdir``, or some variant thereof,
|
||||
should be present. This file contains a listing of all the cross sections and
|
||||
is used by MCNP. This file should be converted to a ``cross_sections.xml``
|
||||
file for use with OpenMC. A utility is provided in the OpenMC distribution
|
||||
for this purpose:
|
||||
.. code-block:: sh
|
||||
|
||||
.. code-block:: sh
|
||||
cd openmc/data
|
||||
python get_jeff_data.py
|
||||
|
||||
openmc/scripts/openmc-xsdir-to-xml xsdir31 cross_sections.xml
|
||||
|
||||
3. In the converted ``cross_sections.xml`` file, change the contents of the
|
||||
<directory> element to the absolute path of the directory containing the
|
||||
actual ACE files.
|
||||
4. Additionally, you may need to change any occurrences of upper-case "ACE"
|
||||
within the ``cross_sections.xml`` file to lower-case.
|
||||
5. Either set the :ref:`cross_sections` in a settings.xml file or the
|
||||
:envvar:`OPENMC_CROSS_SECTIONS` environment variable to the absolute path of
|
||||
the ``cross_sections.xml`` file.
|
||||
At this point, you should set the :envvar:`OPENMC_CROSS_SECTIONS` environment
|
||||
variable to the absolute path of the file
|
||||
``openmc/data/jeff-3.2-hdf5/cross_sections.xml``.
|
||||
|
||||
Using Cross Sections from MCNP
|
||||
------------------------------
|
||||
|
||||
To use cross sections distributed with MCNP, change the <directory> element in
|
||||
the ``cross_sections.xml`` file in the root directory of the OpenMC distribution
|
||||
to the location of the MCNP cross sections. Then, either set the
|
||||
:ref:`cross_sections` in a settings.xml file or the
|
||||
:envvar:`OPENMC_CROSS_SECTIONS` environment variable to the absolute path of
|
||||
the ``cross_sections.xml`` file.
|
||||
OpenMC is provided with a script that will automatically convert ENDF/B-VII.0
|
||||
and ENDF/B-VII.1 ACE data that is provided with MCNP5 or MCNP6. To convert the
|
||||
ENDF/B-VII.0 ACE files (``endf70[a-k]`` and ``endf70sab``) into the native HDF5
|
||||
format, run the following:
|
||||
|
||||
Using Cross Sections from Serpent
|
||||
---------------------------------
|
||||
.. code-block:: sh
|
||||
|
||||
cd openmc/data
|
||||
python convert_mcnp_endf70.py /path/to/mcnpdata/
|
||||
|
||||
where ``/path/to/mcnpdata`` is the directory containing the ``endf70[a-k]``
|
||||
files.
|
||||
|
||||
To convert the ENDF/B-VII.1 ACE files (the endf71x and ENDF71SaB libraries), use
|
||||
the following script:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
cd openmc/data
|
||||
python convert_mcnp_endf71.py /path/to/mcnpdata
|
||||
|
||||
where ``/path/to/mcnpdata`` is the directory containing the ``endf71x`` and
|
||||
``ENDF71SaB`` directories.
|
||||
|
||||
.. _other_cross_sections:
|
||||
|
||||
Using Other Cross Sections
|
||||
--------------------------
|
||||
|
||||
If you have a library of ACE format cross sections other than those listed above
|
||||
that you need to convert to OpenMC's HDF5 format, the ``openmc-ace-to-hdf5``
|
||||
script can be used. There are four different ways you can specify ACE libraries
|
||||
that are to be converted:
|
||||
|
||||
1. List each ACE library as a positional argument. This is very useful in
|
||||
conjunction with the usual shell utilities (ls, find, etc.).
|
||||
2. Use the --xml option to specify a pre-v0.9 cross_sections.xml file.
|
||||
3. Use the --xsdir option to specify a MCNP xsdir file.
|
||||
4. Use the --xsdata option to specify a Serpent xsdata file.
|
||||
|
||||
The script does not use any extra information from cross_sections.xml/ xsdir/
|
||||
xsdata files to determine whether the nuclide is metastable. Instead, the
|
||||
--metastable argument can be used to specify whether the ZAID naming convention
|
||||
follows the NNDC data convention (1000*Z + A + 300 + 100*m), or the MCNP data
|
||||
convention (essentially the same as NNDC, except that the first metastable state
|
||||
of Am242 is 95242 and the ground state is 95642).
|
||||
|
||||
The ``openmc-ace-to-hdf5`` script has the following command-line flags:
|
||||
|
||||
-h, --help show this help message and exit
|
||||
|
||||
-d DESTINATION, --destination DESTINATION
|
||||
Directory to create new library in (default: .)
|
||||
|
||||
-m META, --metastable META
|
||||
How to interpret ZAIDs for metastable nuclides. META
|
||||
can be either 'nndc' or 'mcnp'. (default: nndc)
|
||||
|
||||
--xml XML Old-style cross_sections.xml that lists ACE libraries
|
||||
(default: None)
|
||||
|
||||
--xsdir XSDIR MCNP xsdir file that lists ACE libraries (default:
|
||||
None)
|
||||
|
||||
--xsdata XSDATA Serpent xsdata file that lists ACE libraries (default:
|
||||
None)
|
||||
|
||||
--fission_energy_release FISSION_ENERGY_RELEASE
|
||||
HDF5 file containing fission energy release data
|
||||
(default: None)
|
||||
|
||||
To use cross sections distributed with Serpent, change the <directory> element
|
||||
in the ``cross_sections_serpent.xml`` file in the root directory of the OpenMC
|
||||
distribution to the location of the Serpent cross sections. Then, either set the
|
||||
:ref:`cross_sections` in a settings.xml file or the
|
||||
:envvar:`OPENMC_CROSS_SECTIONS` environment variable to the absolute path of
|
||||
the ``cross_sections_serpent.xml``
|
||||
file.
|
||||
|
||||
Using Multi-Group Cross Sections
|
||||
--------------------------------
|
||||
|
|
@ -469,14 +516,13 @@ However, if the user has obtained or generated their own library, the user
|
|||
should set the :envvar:`OPENMC_MG_CROSS_SECTIONS` environment variable
|
||||
to the absolute path of the file library expected to used most frequently.
|
||||
|
||||
.. _NJOY: http://t2.lanl.gov/nis/codes.shtml
|
||||
.. _NJOY: http://t2.lanl.gov/nis/codes/NJOY12/
|
||||
.. _NNDC: http://www.nndc.bnl.gov/endf/b7.1/acefiles.html
|
||||
.. _NEA: http://www.oecd-nea.org
|
||||
.. _JEFF: http://www.oecd-nea.org/dbdata/jeff/
|
||||
.. _here: http://www.oecd-nea.org/dbdata/pubs/jeff312-cd.html
|
||||
.. _JEFF: https://www.oecd-nea.org/dbforms/data/eva/evatapes/jeff_32/
|
||||
.. _MCNP: http://mcnp.lanl.gov
|
||||
.. _Serpent: http://montecarlo.vtt.fi
|
||||
.. _TENDL: ftp://ftp.nrg.eu/pub/www/talys/tendl2012/tendl2012.html
|
||||
.. _TENDL: https://tendl.web.psi.ch/tendl_2015/tendl2015.html
|
||||
|
||||
--------------
|
||||
Running OpenMC
|
||||
|
|
|
|||
|
|
@ -16,16 +16,16 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
moderator = openmc.Material(material_id=41, name='moderator')
|
||||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O')
|
||||
|
||||
fuel = openmc.Material(material_id=40, name='fuel')
|
||||
fuel.set_density('g/cc', 4.5)
|
||||
|
|
@ -33,7 +33,6 @@ fuel.add_nuclide(u235, 1.)
|
|||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([moderator, fuel])
|
||||
materials_file.default_xs = '71c'
|
||||
materials_file.export_to_xml()
|
||||
|
||||
|
||||
|
|
@ -74,8 +73,7 @@ universe1.add_cells([cell2, cell3])
|
|||
root.add_cells([cell1, cell4])
|
||||
|
||||
# Instantiate a Geometry, register the root Universe, and export to XML
|
||||
geometry = openmc.Geometry()
|
||||
geometry.root_universe = root
|
||||
geometry = openmc.Geometry(root)
|
||||
geometry.export_to_xml()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -16,10 +16,10 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
u238 = openmc.Nuclide('U-238')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
u238 = openmc.Nuclide('U238')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
fuel1 = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
@ -34,11 +34,10 @@ moderator = openmc.Material(material_id=3, name='moderator')
|
|||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O')
|
||||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([fuel1, fuel2, moderator])
|
||||
materials_file.default_xs = '71c'
|
||||
materials_file.export_to_xml()
|
||||
|
||||
|
||||
|
|
@ -97,8 +96,7 @@ root = openmc.Universe(universe_id=0, name='root universe')
|
|||
root.add_cells([inner_box, middle_box, outer_box])
|
||||
|
||||
# Instantiate a Geometry, register the root Universe, and export to XML
|
||||
geometry = openmc.Geometry()
|
||||
geometry.root_universe = root
|
||||
geometry = openmc.Geometry(root)
|
||||
geometry.export_to_xml()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,10 +15,10 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
fe56 = openmc.Nuclide('Fe-56')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
fe56 = openmc.Nuclide('Fe56')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
fuel = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
@ -29,7 +29,7 @@ moderator = openmc.Material(material_id=2, name='moderator')
|
|||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O')
|
||||
|
||||
iron = openmc.Material(material_id=3, name='iron')
|
||||
iron.set_density('g/cc', 7.9)
|
||||
|
|
@ -37,7 +37,6 @@ iron.add_nuclide(fe56, 1.)
|
|||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([moderator, fuel, iron])
|
||||
materials_file.default_xs = '71c'
|
||||
materials_file.export_to_xml()
|
||||
|
||||
|
||||
|
|
@ -105,8 +104,7 @@ lattice.outer = univ2
|
|||
cell1.fill = lattice
|
||||
|
||||
# Instantiate a Geometry, register the root Universe, and export to XML
|
||||
geometry = openmc.Geometry()
|
||||
geometry.root_universe = root
|
||||
geometry = openmc.Geometry(root)
|
||||
geometry.export_to_xml()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
fuel = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
@ -28,11 +28,10 @@ moderator = openmc.Material(material_id=2, name='moderator')
|
|||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O')
|
||||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials((moderator, fuel))
|
||||
materials_file.default_xs = '71c'
|
||||
materials_file.export_to_xml()
|
||||
|
||||
|
||||
|
|
@ -98,14 +97,12 @@ univ4.add_cell(cell2)
|
|||
|
||||
# Instantiate nested Lattices
|
||||
lattice1 = openmc.RectLattice(lattice_id=4, name='4x4 assembly')
|
||||
lattice1.dimension = [2, 2]
|
||||
lattice1.lower_left = [-1., -1.]
|
||||
lattice1.pitch = [1., 1.]
|
||||
lattice1.universes = [[univ1, univ2],
|
||||
[univ2, univ3]]
|
||||
|
||||
lattice2 = openmc.RectLattice(lattice_id=6, name='4x4 core')
|
||||
lattice2.dimension = [2, 2]
|
||||
lattice2.lower_left = [-2., -2.]
|
||||
lattice2.pitch = [2., 2.]
|
||||
lattice2.universes = [[univ4, univ4],
|
||||
|
|
@ -116,8 +113,7 @@ cell1.fill = lattice2
|
|||
cell2.fill = lattice1
|
||||
|
||||
# Instantiate a Geometry, register the root Universe, and export to XML
|
||||
geometry = openmc.Geometry()
|
||||
geometry.root_universe = root
|
||||
geometry = openmc.Geometry(root)
|
||||
geometry.export_to_xml()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,9 +15,9 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
fuel = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
@ -28,11 +28,10 @@ moderator = openmc.Material(material_id=2, name='moderator')
|
|||
moderator.set_density('g/cc', 1.0)
|
||||
moderator.add_nuclide(h1, 2.)
|
||||
moderator.add_nuclide(o16, 1.)
|
||||
moderator.add_s_alpha_beta('HH2O', '71t')
|
||||
moderator.add_s_alpha_beta('c_H_in_H2O')
|
||||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([moderator, fuel])
|
||||
materials_file.default_xs = '71c'
|
||||
materials_file.export_to_xml()
|
||||
|
||||
|
||||
|
|
@ -94,7 +93,6 @@ root.add_cell(cell1)
|
|||
|
||||
# Instantiate a Lattice
|
||||
lattice = openmc.RectLattice(lattice_id=5)
|
||||
lattice.dimension = [4, 4]
|
||||
lattice.lower_left = [-2., -2.]
|
||||
lattice.pitch = [1., 1.]
|
||||
lattice.universes = [[univ1, univ2, univ1, univ2],
|
||||
|
|
@ -106,8 +104,7 @@ lattice.universes = [[univ1, univ2, univ1, univ2],
|
|||
cell1.fill = lattice
|
||||
|
||||
# Instantiate a Geometry, register the root Universe, and export to XML
|
||||
geometry = openmc.Geometry()
|
||||
geometry.root_universe = root
|
||||
geometry = openmc.Geometry(root)
|
||||
geometry.export_to_xml()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -15,39 +15,39 @@ particles = 1000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Nuclides
|
||||
h1 = openmc.Nuclide('H-1')
|
||||
h2 = openmc.Nuclide('H-2')
|
||||
he4 = openmc.Nuclide('He-4')
|
||||
b10 = openmc.Nuclide('B-10')
|
||||
b11 = openmc.Nuclide('B-11')
|
||||
o16 = openmc.Nuclide('O-16')
|
||||
o17 = openmc.Nuclide('O-17')
|
||||
cr50 = openmc.Nuclide('Cr-50')
|
||||
cr52 = openmc.Nuclide('Cr-52')
|
||||
cr53 = openmc.Nuclide('Cr-53')
|
||||
cr54 = openmc.Nuclide('Cr-54')
|
||||
fe54 = openmc.Nuclide('Fe-54')
|
||||
fe56 = openmc.Nuclide('Fe-56')
|
||||
fe57 = openmc.Nuclide('Fe-57')
|
||||
fe58 = openmc.Nuclide('Fe-58')
|
||||
zr90 = openmc.Nuclide('Zr-90')
|
||||
zr91 = openmc.Nuclide('Zr-91')
|
||||
zr92 = openmc.Nuclide('Zr-92')
|
||||
zr94 = openmc.Nuclide('Zr-94')
|
||||
zr96 = openmc.Nuclide('Zr-96')
|
||||
sn112 = openmc.Nuclide('Sn-112')
|
||||
sn114 = openmc.Nuclide('Sn-114')
|
||||
sn115 = openmc.Nuclide('Sn-115')
|
||||
sn116 = openmc.Nuclide('Sn-116')
|
||||
sn117 = openmc.Nuclide('Sn-117')
|
||||
sn118 = openmc.Nuclide('Sn-118')
|
||||
sn119 = openmc.Nuclide('Sn-119')
|
||||
sn120 = openmc.Nuclide('Sn-120')
|
||||
sn122 = openmc.Nuclide('Sn-122')
|
||||
sn124 = openmc.Nuclide('Sn-124')
|
||||
u234 = openmc.Nuclide('U-234')
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
u238 = openmc.Nuclide('U-238')
|
||||
h1 = openmc.Nuclide('H1')
|
||||
h2 = openmc.Nuclide('H2')
|
||||
he4 = openmc.Nuclide('He4')
|
||||
b10 = openmc.Nuclide('B10')
|
||||
b11 = openmc.Nuclide('B11')
|
||||
o16 = openmc.Nuclide('O16')
|
||||
o17 = openmc.Nuclide('O17')
|
||||
cr50 = openmc.Nuclide('Cr50')
|
||||
cr52 = openmc.Nuclide('Cr52')
|
||||
cr53 = openmc.Nuclide('Cr53')
|
||||
cr54 = openmc.Nuclide('Cr54')
|
||||
fe54 = openmc.Nuclide('Fe54')
|
||||
fe56 = openmc.Nuclide('Fe56')
|
||||
fe57 = openmc.Nuclide('Fe57')
|
||||
fe58 = openmc.Nuclide('Fe58')
|
||||
zr90 = openmc.Nuclide('Zr90')
|
||||
zr91 = openmc.Nuclide('Zr91')
|
||||
zr92 = openmc.Nuclide('Zr92')
|
||||
zr94 = openmc.Nuclide('Zr94')
|
||||
zr96 = openmc.Nuclide('Zr96')
|
||||
sn112 = openmc.Nuclide('Sn112')
|
||||
sn114 = openmc.Nuclide('Sn114')
|
||||
sn115 = openmc.Nuclide('Sn115')
|
||||
sn116 = openmc.Nuclide('Sn116')
|
||||
sn117 = openmc.Nuclide('Sn117')
|
||||
sn118 = openmc.Nuclide('Sn118')
|
||||
sn119 = openmc.Nuclide('Sn119')
|
||||
sn120 = openmc.Nuclide('Sn120')
|
||||
sn122 = openmc.Nuclide('Sn122')
|
||||
sn124 = openmc.Nuclide('Sn124')
|
||||
u234 = openmc.Nuclide('U234')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
u238 = openmc.Nuclide('U238')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Nuclides
|
||||
uo2 = openmc.Material(material_id=1, name='UO2 fuel at 2.4% wt enrichment')
|
||||
|
|
@ -98,11 +98,10 @@ borated_water.add_nuclide(h1, 4.9457e-2)
|
|||
borated_water.add_nuclide(h2, 7.4196e-6)
|
||||
borated_water.add_nuclide(o16, 2.4672e-2)
|
||||
borated_water.add_nuclide(o17, 6.0099e-5)
|
||||
borated_water.add_s_alpha_beta('HH2O', '71t')
|
||||
borated_water.add_s_alpha_beta('c_H_in_H2O')
|
||||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([uo2, helium, zircaloy, borated_water])
|
||||
materials_file.default_xs = '71c'
|
||||
materials_file.export_to_xml()
|
||||
|
||||
|
||||
|
|
@ -149,8 +148,7 @@ root = openmc.Universe(universe_id=0, name='root universe')
|
|||
root.add_cells([fuel, gap, clad, water])
|
||||
|
||||
# Instantiate a Geometry, register the root Universe, and export to XML
|
||||
geometry = openmc.Geometry()
|
||||
geometry.root_universe = root
|
||||
geometry = openmc.Geometry(root)
|
||||
geometry.export_to_xml()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ groups = openmc.mgxs.EnergyGroups(group_edges=[1E-11, 0.0635E-6, 10.0E-6,
|
|||
1.0E-4, 1.0E-3, 0.5, 1.0, 20.0])
|
||||
|
||||
# Instantiate the 7-group (C5G7) cross section data
|
||||
uo2_xsdata = openmc.XSdata('UO2.300K', groups)
|
||||
uo2_xsdata = openmc.XSdata('UO2', groups)
|
||||
uo2_xsdata.order = 0
|
||||
uo2_xsdata.total = [0.1779492, 0.3298048, 0.4803882, 0.5543674,
|
||||
0.3118013, 0.3951678, 0.5644058]
|
||||
|
|
@ -41,7 +41,7 @@ uo2_xsdata.nu_fission = [2.005998E-02, 2.027303E-03, 1.570599E-02,
|
|||
uo2_xsdata.chi = [5.8791E-01, 4.1176E-01, 3.3906E-04, 1.1761E-07,
|
||||
0.0000E+00, 0.0000E+00, 0.0000E+00]
|
||||
|
||||
h2o_xsdata = openmc.XSdata('LWTR.300K', groups)
|
||||
h2o_xsdata = openmc.XSdata('LWTR', groups)
|
||||
h2o_xsdata.order = 0
|
||||
h2o_xsdata.total = [0.15920605, 0.412969593, 0.59030986, 0.58435,
|
||||
0.718, 1.2544497, 2.650379]
|
||||
|
|
@ -66,8 +66,8 @@ mg_cross_sections_file.export_to_xml()
|
|||
###############################################################################
|
||||
|
||||
# Instantiate some Macroscopic Data
|
||||
uo2_data = openmc.Macroscopic('UO2', '300K')
|
||||
h2o_data = openmc.Macroscopic('LWTR', '300K')
|
||||
uo2_data = openmc.Macroscopic('UO2')
|
||||
h2o_data = openmc.Macroscopic('LWTR')
|
||||
|
||||
# Instantiate some Materials and register the appropriate Macroscopic objects
|
||||
uo2 = openmc.Material(material_id=1, name='UO2 fuel')
|
||||
|
|
@ -80,7 +80,6 @@ water.add_macroscopic(h2o_data)
|
|||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([uo2, water])
|
||||
materials_file.default_xs = '300K'
|
||||
materials_file.export_to_xml()
|
||||
|
||||
|
||||
|
|
@ -119,8 +118,7 @@ root = openmc.Universe(universe_id=0, name='root universe')
|
|||
root.add_cells([fuel, moderator])
|
||||
|
||||
# Instantiate a Geometry, register the root Universe, and export to XML
|
||||
geometry = openmc.Geometry()
|
||||
geometry.root_universe = root
|
||||
geometry = openmc.Geometry(root)
|
||||
geometry.export_to_xml()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ particles = 10000
|
|||
###############################################################################
|
||||
|
||||
# Instantiate a Nuclides
|
||||
u235 = openmc.Nuclide('U-235')
|
||||
u235 = openmc.Nuclide('U235')
|
||||
|
||||
# Instantiate a Material and register the Nuclide
|
||||
fuel = openmc.Material(material_id=1, name='fuel')
|
||||
|
|
@ -25,7 +25,6 @@ fuel.add_nuclide(u235, 1.)
|
|||
|
||||
# Instantiate a Materials collection and export to XML
|
||||
materials_file = openmc.Materials([fuel])
|
||||
materials_file.default_xs = '71c'
|
||||
materials_file.export_to_xml()
|
||||
|
||||
|
||||
|
|
@ -64,8 +63,7 @@ root = openmc.Universe(universe_id=0, name='root universe')
|
|||
root.add_cell(cell)
|
||||
|
||||
# Instantiate a Geometry, register the root Universe, and export to XML
|
||||
geometry = openmc.Geometry()
|
||||
geometry.root_universe = root
|
||||
geometry = openmc.Geometry(root)
|
||||
geometry.export_to_xml()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,18 +1,16 @@
|
|||
<?xml version="1.0"?>
|
||||
<materials>
|
||||
|
||||
<default_xs>71c</default_xs>
|
||||
|
||||
<material id="40">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="41">
|
||||
<density value="1.0" units="g/cc" />
|
||||
<nuclide name="H-1" ao="2.0" />
|
||||
<nuclide name="O-16" ao="1.0" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="H1" ao="2.0" />
|
||||
<nuclide name="O16" ao="1.0" />
|
||||
<sab name="c_H_in_H2O"/>
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -1,23 +1,21 @@
|
|||
<?xml version="1.0"?>
|
||||
<materials>
|
||||
|
||||
<default_xs>71c</default_xs>
|
||||
|
||||
<material id="1">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="2">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-238" ao="1.0" />
|
||||
<nuclide name="U238" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="3">
|
||||
<density value="1.0" units="g/cc" />
|
||||
<nuclide name="O-16" ao="1.0" />
|
||||
<nuclide name="H-1" ao="2.0" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="O16" ao="1.0" />
|
||||
<nuclide name="H1" ao="2.0" />
|
||||
<sab name="c_H_in_H2O" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,17 @@
|
|||
<?xml version="1.0"?>
|
||||
<materials>
|
||||
|
||||
<default_xs>71c</default_xs>
|
||||
|
||||
<!-- Definition of materials -->
|
||||
<material id="1">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="2">
|
||||
<density value="1.0" units="g/cc" />
|
||||
<nuclide name="H-1" ao="2.0" />
|
||||
<nuclide name="O-16" ao="1.0" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="H1" ao="2.0" />
|
||||
<nuclide name="O16" ao="1.0" />
|
||||
<sab name="c_H_in_H2O" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,17 @@
|
|||
<?xml version="1.0"?>
|
||||
<materials>
|
||||
|
||||
<default_xs>71c</default_xs>
|
||||
|
||||
<!-- Definition of materials -->
|
||||
<material id="1">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
<material id="2">
|
||||
<density value="1.0" units="g/cc" />
|
||||
<nuclide name="H-1" ao="2.0" />
|
||||
<nuclide name="O-16" ao="1.0" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="H1" ao="2.0" />
|
||||
<nuclide name="O16" ao="1.0" />
|
||||
<sab name="c_H_in_H2O" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
<?xml version="1.0"?>
|
||||
<materials>
|
||||
|
||||
<!-- By default, use 300K cross sections -->
|
||||
<default_xs>71c</default_xs>
|
||||
|
||||
<!--
|
||||
Since O-18 is not present in ENDF/B-VII, it was necessary to combine the
|
||||
atom densities for O-17 and O-18 in any materials containing Oxygen.
|
||||
|
|
@ -12,59 +9,59 @@
|
|||
<!-- UO2 fuel at 2.4 wt% enrichment -->
|
||||
<material id="1">
|
||||
<density value="10.29769" units="g/cm3" />
|
||||
<nuclide name="U-234" ao="4.4843e-06" />
|
||||
<nuclide name="U-235" ao="5.5815e-04" />
|
||||
<nuclide name="U-238" ao="2.2408e-02" />
|
||||
<nuclide name="O-16" ao="4.5829e-02" />
|
||||
<nuclide name="O-17" ao="1.1164e-04" />
|
||||
<nuclide name="U234" ao="4.4843e-06" />
|
||||
<nuclide name="U235" ao="5.5815e-04" />
|
||||
<nuclide name="U238" ao="2.2408e-02" />
|
||||
<nuclide name="O16" ao="4.5829e-02" />
|
||||
<nuclide name="O17" ao="1.1164e-04" />
|
||||
</material>
|
||||
|
||||
<!-- Helium for gap -->
|
||||
<material id="2">
|
||||
<density value="0.001598" units="g/cm3" />
|
||||
<nuclide name="He-4" ao="2.4044e-04" />
|
||||
<nuclide name="He4" ao="2.4044e-04" />
|
||||
</material>
|
||||
|
||||
<!-- Zircaloy 4 -->
|
||||
<material id="3">
|
||||
<density value="6.55" units="g/cm3" />
|
||||
<nuclide name="O-16" ao="3.0743e-04" />
|
||||
<nuclide name="O-17" ao="7.4887e-07" />
|
||||
<nuclide name="Cr-50" ao="3.2962e-06" />
|
||||
<nuclide name="Cr-52" ao="6.3564e-05" />
|
||||
<nuclide name="Cr-53" ao="7.2076e-06" />
|
||||
<nuclide name="Cr-54" ao="1.7941e-06" />
|
||||
<nuclide name="Fe-54" ao="8.6699e-06" />
|
||||
<nuclide name="Fe-56" ao="1.3610e-04" />
|
||||
<nuclide name="Fe-57" ao="3.1431e-06" />
|
||||
<nuclide name="Fe-58" ao="4.1829e-07" />
|
||||
<nuclide name="Zr-90" ao="2.1827e-02" />
|
||||
<nuclide name="Zr-91" ao="4.7600e-03" />
|
||||
<nuclide name="Zr-92" ao="7.2758e-03" />
|
||||
<nuclide name="Zr-94" ao="7.3734e-03" />
|
||||
<nuclide name="Zr-96" ao="1.1879e-03" />
|
||||
<nuclide name="Sn-112" ao="4.6735e-06" />
|
||||
<nuclide name="Sn-114" ao="3.1799e-06" />
|
||||
<nuclide name="Sn-115" ao="1.6381e-06" />
|
||||
<nuclide name="Sn-116" ao="7.0055e-05" />
|
||||
<nuclide name="Sn-117" ao="3.7003e-05" />
|
||||
<nuclide name="Sn-118" ao="1.1669e-04" />
|
||||
<nuclide name="Sn-119" ao="4.1387e-05" />
|
||||
<nuclide name="Sn-120" ao="1.5697e-04" />
|
||||
<nuclide name="Sn-122" ao="2.2308e-05" />
|
||||
<nuclide name="Sn-124" ao="2.7897e-05" />
|
||||
<nuclide name="O16" ao="3.0743e-04" />
|
||||
<nuclide name="O17" ao="7.4887e-07" />
|
||||
<nuclide name="Cr50" ao="3.2962e-06" />
|
||||
<nuclide name="Cr52" ao="6.3564e-05" />
|
||||
<nuclide name="Cr53" ao="7.2076e-06" />
|
||||
<nuclide name="Cr54" ao="1.7941e-06" />
|
||||
<nuclide name="Fe54" ao="8.6699e-06" />
|
||||
<nuclide name="Fe56" ao="1.3610e-04" />
|
||||
<nuclide name="Fe57" ao="3.1431e-06" />
|
||||
<nuclide name="Fe58" ao="4.1829e-07" />
|
||||
<nuclide name="Zr90" ao="2.1827e-02" />
|
||||
<nuclide name="Zr91" ao="4.7600e-03" />
|
||||
<nuclide name="Zr92" ao="7.2758e-03" />
|
||||
<nuclide name="Zr94" ao="7.3734e-03" />
|
||||
<nuclide name="Zr96" ao="1.1879e-03" />
|
||||
<nuclide name="Sn112" ao="4.6735e-06" />
|
||||
<nuclide name="Sn114" ao="3.1799e-06" />
|
||||
<nuclide name="Sn115" ao="1.6381e-06" />
|
||||
<nuclide name="Sn116" ao="7.0055e-05" />
|
||||
<nuclide name="Sn117" ao="3.7003e-05" />
|
||||
<nuclide name="Sn118" ao="1.1669e-04" />
|
||||
<nuclide name="Sn119" ao="4.1387e-05" />
|
||||
<nuclide name="Sn120" ao="1.5697e-04" />
|
||||
<nuclide name="Sn122" ao="2.2308e-05" />
|
||||
<nuclide name="Sn124" ao="2.7897e-05" />
|
||||
</material>
|
||||
|
||||
|
||||
<!-- Borated water at 975 ppm -->
|
||||
<material id="4">
|
||||
<density value="0.740582" units="g/cm3" />
|
||||
<nuclide name="B-10" ao="8.0042e-06" />
|
||||
<nuclide name="B-11" ao="3.2218e-05" />
|
||||
<nuclide name="H-1" ao="4.9457e-02" />
|
||||
<nuclide name="H-2" ao="7.4196e-06" />
|
||||
<nuclide name="O-16" ao="2.4672e-02" />
|
||||
<nuclide name="O-17" ao="6.0099e-05" />
|
||||
<sab name="HH2O" xs="71t" />
|
||||
<nuclide name="B10" ao="8.0042e-06" />
|
||||
<nuclide name="B11" ao="3.2218e-05" />
|
||||
<nuclide name="H1" ao="4.9457e-02" />
|
||||
<nuclide name="H2" ao="7.4196e-06" />
|
||||
<nuclide name="O16" ao="2.4672e-02" />
|
||||
<nuclide name="O17" ao="6.0099e-05" />
|
||||
<sab name="c_H_in_H2O" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<materials>
|
||||
<!-- Set default xs set to use 300K data -->
|
||||
<default_xs>300K</default_xs>
|
||||
|
||||
<!-- UO2 -->
|
||||
<material id="1">
|
||||
<density units="macro" value="1.0" />
|
||||
|
|
|
|||
|
|
@ -11,8 +11,8 @@
|
|||
-->
|
||||
<xsdata>
|
||||
<!-- Meta data for this data -->
|
||||
<name>UO2.300K</name>
|
||||
<alias>UO2.300K</alias>
|
||||
<name>UO2</name>
|
||||
<alias>UO2</alias>
|
||||
<kT> 2.53E-8 </kT> <!-- in MeV -->
|
||||
<order>0</order>
|
||||
<fissionable>true</fissionable>
|
||||
|
|
@ -40,9 +40,9 @@
|
|||
<!-- units of MeV/cm -->
|
||||
<!-- If no kappa fission tallies, this is not needed; it will not be loaded
|
||||
if there is no kappa fission scores anyways -->
|
||||
<k_fission>
|
||||
<kappa_fission>
|
||||
1.0 1.0 1.0 1.0 1.0 1.0 1.0
|
||||
</k_fission>
|
||||
</kappa_fission>
|
||||
|
||||
<!-- for consistency must include nu-scatter -->
|
||||
<!-- will be a matrix of (order+1) x g_in x g_out -->
|
||||
|
|
@ -67,8 +67,8 @@
|
|||
|
||||
<xsdata>
|
||||
<!-- Meta data for this data -->
|
||||
<name>MOX1.300K</name>
|
||||
<alias>MOX1.300K</alias>
|
||||
<name>MOX1</name>
|
||||
<alias>MOX1</alias>
|
||||
<kT> 2.53E-8 </kT> <!-- in MeV -->
|
||||
<order>0</order>
|
||||
<fissionable>true</fissionable>
|
||||
|
|
@ -100,9 +100,9 @@
|
|||
</fission>
|
||||
|
||||
<!-- units of MeV/cm -->
|
||||
<k_fission>
|
||||
<kappa_fission>
|
||||
1.0 1.0 1.0 1.0 1.0 1.0 1.0
|
||||
</k_fission>
|
||||
</kappa_fission>
|
||||
|
||||
<!-- for consistency must include nu-scatter -->
|
||||
<!-- will be a matrix of (order+1) x g_in x g_out -->
|
||||
|
|
@ -124,8 +124,8 @@
|
|||
|
||||
<xsdata>
|
||||
<!-- Meta data for this data -->
|
||||
<name>MOX2.300K</name>
|
||||
<alias>MOX2.300K</alias>
|
||||
<name>MOX2</name>
|
||||
<alias>MOX2</alias>
|
||||
<kT> 2.53E-8 </kT> <!-- in MeV -->
|
||||
<order>0</order>
|
||||
<fissionable>true</fissionable>
|
||||
|
|
@ -156,9 +156,9 @@
|
|||
</fission>
|
||||
|
||||
<!-- units of MeV/cm -->
|
||||
<k_fission>
|
||||
<kappa_fission>
|
||||
1.0 1.0 1.0 1.0 1.0 1.0 1.0
|
||||
</k_fission>
|
||||
</kappa_fission>
|
||||
|
||||
<!-- for consistency must include nu-scatter -->
|
||||
<!-- will be a matrix of (order+1) x g_in x g_out -->
|
||||
|
|
@ -180,8 +180,8 @@
|
|||
|
||||
<xsdata>
|
||||
<!-- Meta data for this data -->
|
||||
<name>MOX3.300K</name>
|
||||
<alias>MOX3.300K</alias>
|
||||
<name>MOX3</name>
|
||||
<alias>MOX3</alias>
|
||||
<kT> 2.53E-8 </kT> <!-- in MeV -->
|
||||
<order>0</order>
|
||||
<fissionable>true</fissionable>
|
||||
|
|
@ -212,9 +212,9 @@
|
|||
</fission>
|
||||
|
||||
<!-- units of MeV/cm -->
|
||||
<k_fission>
|
||||
<kappa_fission>
|
||||
1.0 1.0 1.0 1.0 1.0 1.0 1.0
|
||||
</k_fission>
|
||||
</kappa_fission>
|
||||
|
||||
<!-- for consistency must include nu-scatter -->
|
||||
<!-- will be a matrix of (order+1) x g_in x g_out -->
|
||||
|
|
@ -236,8 +236,8 @@
|
|||
|
||||
<xsdata>
|
||||
<!-- Meta data for this data -->
|
||||
<name>FC.300K</name>
|
||||
<alias>FC.300K</alias>
|
||||
<name>FC</name>
|
||||
<alias>FC</alias>
|
||||
<kT> 2.53E-8 </kT> <!-- in MeV -->
|
||||
<order>0</order>
|
||||
<fissionable>true</fissionable>
|
||||
|
|
@ -262,9 +262,9 @@
|
|||
</fission>
|
||||
|
||||
<!-- units of MeV/cm -->
|
||||
<k_fission>
|
||||
<kappa_fission>
|
||||
1.0 1.0 1.0 1.0 1.0 1.0 1.0
|
||||
</k_fission>
|
||||
</kappa_fission>
|
||||
|
||||
<!-- for consistency must include nu-scatter -->
|
||||
<!-- will be a matrix of (order+1) x g_in x g_out -->
|
||||
|
|
@ -286,8 +286,8 @@
|
|||
|
||||
<xsdata>
|
||||
<!-- Meta data for this data -->
|
||||
<name>GT.300K</name>
|
||||
<alias>GT.300K</alias>
|
||||
<name>GT</name>
|
||||
<alias>GT</alias>
|
||||
<kT> 2.53E-8 </kT> <!-- in MeV -->
|
||||
<order>0</order>
|
||||
<fissionable>false</fissionable>
|
||||
|
|
@ -318,8 +318,8 @@
|
|||
|
||||
<xsdata>
|
||||
<!-- Meta data for this data -->
|
||||
<name>LWTR.300K</name>
|
||||
<alias>LWTR.300K</alias>
|
||||
<name>LWTR</name>
|
||||
<alias>LWTR</alias>
|
||||
<kT> 2.53E-8 </kT> <!-- in MeV -->
|
||||
<order>0</order>
|
||||
<fissionable>false</fissionable>
|
||||
|
|
@ -351,8 +351,8 @@
|
|||
|
||||
<xsdata>
|
||||
<!-- Meta data for this data -->
|
||||
<name>CR.300K</name>
|
||||
<alias>CR.300K</alias>
|
||||
<name>CR</name>
|
||||
<alias>CR</alias>
|
||||
<kT> 2.53E-8 </kT> <!-- in MeV -->
|
||||
<order>0</order>
|
||||
<fissionable>false</fissionable>
|
||||
|
|
|
|||
|
|
@ -1,11 +1,9 @@
|
|||
<?xml version="1.0"?>
|
||||
<materials>
|
||||
|
||||
<default_xs>71c</default_xs>
|
||||
|
||||
<material id="1">
|
||||
<density value="4.5" units="g/cc" />
|
||||
<nuclide name="U-235" ao="1.0" />
|
||||
<nuclide name="U235" ao="1.0" />
|
||||
</material>
|
||||
|
||||
</materials>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
openmc \- Executes the OpenMC Monte Carlo code
|
||||
.SH DESCRIPTION
|
||||
This command is used to execute the OpenMC Monte Carlo code. It is assumed that
|
||||
a set of XML input files has already been created and that ACE format cross
|
||||
a set of XML input files has already been created and that HDF5 format cross
|
||||
sections are available.
|
||||
.SH SYNOPSIS
|
||||
\fBopenmc\fR [\fIoptions\fR] [\fIpath\fR]
|
||||
|
|
@ -40,13 +40,23 @@ The behavior of
|
|||
.B openmc
|
||||
is affected by the following environment variables.
|
||||
.TP
|
||||
.B CROSS_SECTIONS
|
||||
.B OPENMC_CROSS_SECTIONS
|
||||
Indicates the default path to the cross_sections.xml summary file that is used
|
||||
to locate ACE format cross section libraries if the user has not specified the
|
||||
to locate HDF5 format cross section libraries if the user has not specified the
|
||||
<cross_sections> tag in
|
||||
.I settings.xml\fP.
|
||||
.TP
|
||||
.B OPENMC_MG_CROSS_SECTIONS
|
||||
Indicates the default path to the mgxs.xml file that contains multi-group cross
|
||||
section libraries if the user has not specified the <cross_sections> tag in
|
||||
.I settings.xml\fP.
|
||||
.TP
|
||||
.B OPENMC_MULTIPOLE_LIBRARY
|
||||
Indicates the default path to a directory containing windowed multipole data if
|
||||
the user has not specified the <multipole_library> tag in
|
||||
.I settings.xml\fP.
|
||||
.SH LICENSE
|
||||
Copyright \(co 2011-2015 Massachusetts Institute of Technology.
|
||||
Copyright \(co 2011-2016 Massachusetts Institute of Technology.
|
||||
.PP
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
|
|
|
|||
|
|
@ -6,22 +6,24 @@ from openmc.nuclide import *
|
|||
from openmc.macroscopic import *
|
||||
from openmc.material import *
|
||||
from openmc.plots import *
|
||||
from openmc.region import *
|
||||
from openmc.volume import *
|
||||
from openmc.source import *
|
||||
from openmc.settings import *
|
||||
from openmc.surface import *
|
||||
from openmc.universe import *
|
||||
from openmc.mgxs_library import *
|
||||
from openmc.mesh import *
|
||||
from openmc.filter import *
|
||||
from openmc.trigger import *
|
||||
from openmc.tally_derivative import *
|
||||
from openmc.tallies import *
|
||||
from openmc.mgxs_library import *
|
||||
from openmc.cmfd import *
|
||||
from openmc.executor import *
|
||||
from openmc.statepoint import *
|
||||
from openmc.summary import *
|
||||
from openmc.region import *
|
||||
from openmc.source import *
|
||||
from openmc.particle_restart import *
|
||||
from openmc.mixin import *
|
||||
|
||||
try:
|
||||
from openmc.opencg_compatible import *
|
||||
|
|
|
|||
|
|
@ -1,65 +0,0 @@
|
|||
from __future__ import division
|
||||
from struct import pack
|
||||
|
||||
|
||||
def ascii_to_binary(ascii_file, binary_file):
|
||||
"""Convert an ACE file in ASCII format (type 1) to binary format (type 2).
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ascii_file : str
|
||||
Filename of ASCII ACE file
|
||||
binary_file : str
|
||||
Filename of binary ACE file to be written
|
||||
|
||||
"""
|
||||
|
||||
# Open ASCII file
|
||||
ascii = open(ascii_file, 'r')
|
||||
|
||||
# Set default record length
|
||||
record_length = 4096
|
||||
|
||||
# Read data from ASCII file
|
||||
lines = ascii.readlines()
|
||||
ascii.close()
|
||||
|
||||
# Open binary file
|
||||
binary = open(binary_file, 'wb')
|
||||
|
||||
idx = 0
|
||||
while idx < len(lines):
|
||||
# Read/write header block
|
||||
hz = lines[idx][:10].encode('UTF-8')
|
||||
aw0 = float(lines[idx][10:22])
|
||||
tz = float(lines[idx][22:34])
|
||||
hd = lines[idx][35:45].encode('UTF-8')
|
||||
hk = lines[idx + 1][:70].encode('UTF-8')
|
||||
hm = lines[idx + 1][70:80].encode('UTF-8')
|
||||
binary.write(pack('=10sdd10s70s10s', hz, aw0, tz, hd, hk, hm))
|
||||
|
||||
# Read/write IZ/AW pairs
|
||||
data = ' '.join(lines[idx + 2:idx + 6]).split()
|
||||
iz = list(map(int, data[::2]))
|
||||
aw = list(map(float, data[1::2]))
|
||||
izaw = [item for sublist in zip(iz, aw) for item in sublist]
|
||||
binary.write(pack('=' + 16*'id', *izaw))
|
||||
|
||||
# Read/write NXS and JXS arrays. Null bytes are added at the end so
|
||||
# that XSS will start at the second record
|
||||
nxs = list(map(int, ' '.join(lines[idx + 6:idx + 8]).split()))
|
||||
jxs = list(map(int, ' '.join(lines[idx + 8:idx + 12]).split()))
|
||||
binary.write(pack('=16i32i{0}x'.format(record_length - 500), *(nxs + jxs)))
|
||||
|
||||
# Read/write XSS array. Null bytes are added to form a complete record
|
||||
# at the end of the file
|
||||
n_lines = (nxs[0] + 3)//4
|
||||
xss = list(map(float, ' '.join(lines[idx + 12:idx + 12 + n_lines]).split()))
|
||||
extra_bytes = record_length - ((len(xss)*8 - 1) % record_length + 1)
|
||||
binary.write(pack('={0}d{1}x'.format(nxs[0], extra_bytes), *xss))
|
||||
|
||||
# Advance to next table in file
|
||||
idx += 12 + n_lines
|
||||
|
||||
# Close binary file
|
||||
binary.close()
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
import sys
|
||||
import copy
|
||||
from numbers import Integral
|
||||
from collections import Iterable
|
||||
|
||||
import numpy as np
|
||||
|
|
@ -67,24 +66,6 @@ class CrossScore(object):
|
|||
def __ne__(self, other):
|
||||
return not self == other
|
||||
|
||||
def __deepcopy__(self, memo):
|
||||
existing = memo.get(id(self))
|
||||
|
||||
# If this is the first time we have tried to copy this object, create a copy
|
||||
if existing is None:
|
||||
clone = type(self).__new__(type(self))
|
||||
clone._left_score = self.left_score
|
||||
clone._right_score = self.right_score
|
||||
clone._binary_op = self.binary_op
|
||||
|
||||
memo[id(self)] = clone
|
||||
|
||||
return clone
|
||||
|
||||
# If this object has been copied before, return the first copy made
|
||||
else:
|
||||
return existing
|
||||
|
||||
def __repr__(self):
|
||||
string = '({0} {1} {2})'.format(self.left_score,
|
||||
self.binary_op, self.right_score)
|
||||
|
|
@ -169,28 +150,9 @@ class CrossNuclide(object):
|
|||
def __ne__(self, other):
|
||||
return not self == other
|
||||
|
||||
def __deepcopy__(self, memo):
|
||||
existing = memo.get(id(self))
|
||||
|
||||
# If this is the first time we have tried to copy this object, create a copy
|
||||
if existing is None:
|
||||
clone = type(self).__new__(type(self))
|
||||
clone._left_nuclide = self.left_nuclide
|
||||
clone._right_nuclide = self.right_nuclide
|
||||
clone._binary_op = self.binary_op
|
||||
|
||||
memo[id(self)] = clone
|
||||
|
||||
return clone
|
||||
|
||||
# If this object has been copied before, return the first copy made
|
||||
else:
|
||||
return existing
|
||||
|
||||
def __repr__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@property
|
||||
def left_nuclide(self):
|
||||
return self._left_nuclide
|
||||
|
|
@ -325,27 +287,6 @@ class CrossFilter(object):
|
|||
string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', filter_bins)
|
||||
return string
|
||||
|
||||
def __deepcopy__(self, memo):
|
||||
existing = memo.get(id(self))
|
||||
|
||||
# If this is the first time we have tried to copy this object, create a copy
|
||||
if existing is None:
|
||||
clone = type(self).__new__(type(self))
|
||||
clone._left_filter = self.left_filter
|
||||
clone._right_filter = self.right_filter
|
||||
clone._binary_op = self.binary_op
|
||||
clone._type = self.type
|
||||
clone._bins = self._bins
|
||||
clone._stride = self.stride
|
||||
|
||||
memo[id(self)] = clone
|
||||
|
||||
return clone
|
||||
|
||||
# If this object has been copied before, return the first copy made
|
||||
else:
|
||||
return existing
|
||||
|
||||
@property
|
||||
def left_filter(self):
|
||||
return self._left_filter
|
||||
|
|
@ -379,7 +320,7 @@ class CrossFilter(object):
|
|||
|
||||
@type.setter
|
||||
def type(self, filter_type):
|
||||
if filter_type not in _FILTER_TYPES.values():
|
||||
if filter_type not in _FILTER_TYPES:
|
||||
msg = 'Unable to set CrossFilter type to "{0}" since it ' \
|
||||
'is not one of the supported types'.format(filter_type)
|
||||
raise ValueError(msg)
|
||||
|
|
@ -532,23 +473,6 @@ class AggregateScore(object):
|
|||
def __ne__(self, other):
|
||||
return not self == other
|
||||
|
||||
def __deepcopy__(self, memo):
|
||||
existing = memo.get(id(self))
|
||||
|
||||
# If this is the first time we have tried to copy this object, create a copy
|
||||
if existing is None:
|
||||
clone = type(self).__new__(type(self))
|
||||
clone._scores = self.scores
|
||||
clone._aggregate_op = self.aggregate_op
|
||||
|
||||
memo[id(self)] = clone
|
||||
|
||||
return clone
|
||||
|
||||
# If this object has been copied before, return the first copy made
|
||||
else:
|
||||
return existing
|
||||
|
||||
def __repr__(self):
|
||||
string = ', '.join(map(str, self.scores))
|
||||
string = '{0}({1})'.format(self.aggregate_op, string)
|
||||
|
|
@ -622,23 +546,6 @@ class AggregateNuclide(object):
|
|||
def __ne__(self, other):
|
||||
return not self == other
|
||||
|
||||
def __deepcopy__(self, memo):
|
||||
existing = memo.get(id(self))
|
||||
|
||||
# If this is the first time we have tried to copy this object, create a copy
|
||||
if existing is None:
|
||||
clone = type(self).__new__(type(self))
|
||||
clone._nuclides = self.nuclides
|
||||
clone._aggregate_op = self._aggregate_op
|
||||
|
||||
memo[id(self)] = clone
|
||||
|
||||
return clone
|
||||
|
||||
# If this object has been copied before, return the first copy made
|
||||
else:
|
||||
return existing
|
||||
|
||||
def __repr__(self):
|
||||
|
||||
# Append each nuclide in the aggregate to the string
|
||||
|
|
@ -668,7 +575,7 @@ class AggregateNuclide(object):
|
|||
@nuclides.setter
|
||||
def nuclides(self, nuclides):
|
||||
cv.check_iterable_type('nuclides', nuclides,
|
||||
(basestring, Nuclide, CrossNuclide))
|
||||
(basestring, Nuclide, CrossNuclide))
|
||||
self._nuclides = nuclides
|
||||
|
||||
@aggregate_op.setter
|
||||
|
|
@ -757,26 +664,6 @@ class AggregateFilter(object):
|
|||
string += '{0: <16}{1}{2}\n'.format('\tBins', '=\t', self.bins)
|
||||
return string
|
||||
|
||||
def __deepcopy__(self, memo):
|
||||
existing = memo.get(id(self))
|
||||
|
||||
# If this is the first time we have tried to copy this object, create a copy
|
||||
if existing is None:
|
||||
clone = type(self).__new__(type(self))
|
||||
clone._type = self.type
|
||||
clone._aggregate_filter = self.aggregate_filter
|
||||
clone._aggregate_op = self.aggregate_op
|
||||
clone._bins = self._bins
|
||||
clone._stride = self.stride
|
||||
|
||||
memo[id(self)] = clone
|
||||
|
||||
return clone
|
||||
|
||||
# If this object has been copied before, return the first copy made
|
||||
else:
|
||||
return existing
|
||||
|
||||
@property
|
||||
def aggregate_filter(self):
|
||||
return self._aggregate_filter
|
||||
|
|
@ -803,7 +690,7 @@ class AggregateFilter(object):
|
|||
|
||||
@type.setter
|
||||
def type(self, filter_type):
|
||||
if filter_type not in _FILTER_TYPES.values():
|
||||
if filter_type not in _FILTER_TYPES:
|
||||
msg = 'Unable to set AggregateFilter type to "{0}" since it ' \
|
||||
'is not one of the supported types'.format(filter_type)
|
||||
raise ValueError(msg)
|
||||
|
|
|
|||
264
openmc/cell.py
264
openmc/cell.py
|
|
@ -1,9 +1,12 @@
|
|||
from collections import OrderedDict, Iterable
|
||||
from math import cos, sin, pi
|
||||
from numbers import Real, Integral
|
||||
from xml.etree import ElementTree as ET
|
||||
import sys
|
||||
import warnings
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.surface import Halfspace
|
||||
|
|
@ -18,6 +21,7 @@ AUTO_CELL_ID = 10000
|
|||
|
||||
|
||||
def reset_auto_cell_id():
|
||||
"""Reset counter for auto-generated cell IDs."""
|
||||
global AUTO_CELL_ID
|
||||
AUTO_CELL_ID = 10000
|
||||
|
||||
|
|
@ -33,7 +37,7 @@ class Cell(object):
|
|||
automatically be assigned.
|
||||
name : str, optional
|
||||
Name of the cell. If not specified, the name is the empty string.
|
||||
fill : openmc.Material or openmc.Universe or openmc.Lattice or 'void' or iterable of openmc.Material, optional
|
||||
fill : openmc.Material or openmc.Universe or openmc.Lattice or None or iterable of openmc.Material, optional
|
||||
Indicates what the region of space is filled with
|
||||
region : openmc.Region, optional
|
||||
Region of space that is assigned to the cell.
|
||||
|
|
@ -44,13 +48,18 @@ class Cell(object):
|
|||
Unique identifier for the cell
|
||||
name : str
|
||||
Name of the cell
|
||||
fill : openmc.Material or openmc.Universe or openmc.Lattice or 'void' or iterable of openmc.Material
|
||||
Indicates what the region of space is filled with
|
||||
region : openmc.Region
|
||||
fill : openmc.Material or openmc.Universe or openmc.Lattice or None or iterable of openmc.Material
|
||||
Indicates what the region of space is filled with. If None, the cell is
|
||||
treated as a void. An iterable of materials is used to fill repeated
|
||||
instances of a cell with different materials.
|
||||
fill_type : {'material', 'universe', 'lattice', 'distribmat', 'void'}
|
||||
Indicates what the cell is filled with.
|
||||
region : openmc.Region or None
|
||||
Region of space that is assigned to the cell.
|
||||
rotation : Iterable of float
|
||||
If the cell is filled with a universe, this array specifies the angles
|
||||
in degrees about the x, y, and z axes that the filled universe should be
|
||||
rotated. The rotation applied is an intrinsic rotation with specified
|
||||
Tait-Bryan angles. That is to say, if the angles are :math:`(\phi,
|
||||
\theta, \psi)`, then the rotation matrix applied is :math:`R_z(\psi)
|
||||
R_y(\theta) R_x(\phi)` or
|
||||
|
|
@ -63,6 +72,9 @@ class Cell(object):
|
|||
\sin\phi \sin\theta \sin\psi & -\sin\phi \cos\psi + \cos\phi
|
||||
\sin\theta \sin\psi \\ -\sin\theta & \sin\phi \cos\theta & \cos\phi
|
||||
\cos\theta \end{array} \right ]
|
||||
rotation_matrix : numpy.ndarray
|
||||
The rotation matrix defined by the angles specified in the
|
||||
:attr:`Cell.rotation` property.
|
||||
temperature : float or iterable of float
|
||||
Temperature of the cell in Kelvin. Multiple temperatures can be given
|
||||
to give each distributed cell instance a unique temperature.
|
||||
|
|
@ -73,6 +85,13 @@ class Cell(object):
|
|||
Array of offsets used for distributed cell searches
|
||||
distribcell_index : int
|
||||
Index of this cell in distribcell arrays
|
||||
distribcell_paths : list of str
|
||||
The paths traversed through the CSG tree to reach each distribcell
|
||||
instance
|
||||
volume_information : dict
|
||||
Estimate of the volume and total number of atoms of each nuclide from a
|
||||
stochastic volume calculation. This information is set with the
|
||||
:meth:`Cell.add_volume_information` method.
|
||||
|
||||
"""
|
||||
|
||||
|
|
@ -80,19 +99,22 @@ class Cell(object):
|
|||
# Initialize Cell class attributes
|
||||
self.id = cell_id
|
||||
self.name = name
|
||||
self._fill = None
|
||||
self._type = None
|
||||
self._region = None
|
||||
self._temperature = None
|
||||
self.fill = fill
|
||||
self.region = region
|
||||
self._rotation = None
|
||||
self._rotation_matrix = None
|
||||
self._temperature = None
|
||||
self._translation = None
|
||||
self._offsets = None
|
||||
self._distribcell_index = None
|
||||
self._distribcell_paths = None
|
||||
self._volume_information = None
|
||||
|
||||
if fill is not None:
|
||||
self.fill = fill
|
||||
if region is not None:
|
||||
self.region = region
|
||||
def __contains__(self, point):
|
||||
if self.region is None:
|
||||
return True
|
||||
else:
|
||||
return point in self.region
|
||||
|
||||
def __eq__(self, other):
|
||||
if not isinstance(other, Cell):
|
||||
|
|
@ -122,36 +144,27 @@ class Cell(object):
|
|||
|
||||
def __repr__(self):
|
||||
string = 'Cell\n'
|
||||
string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id)
|
||||
string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name)
|
||||
string += '{: <16}=\t{}\n'.format('\tID', self.id)
|
||||
string += '{: <16}=\t{}\n'.format('\tName', self.name)
|
||||
|
||||
if isinstance(self._fill, openmc.Material):
|
||||
string += '{0: <16}{1}{2}\n'.format('\tMaterial', '=\t',
|
||||
self._fill._id)
|
||||
elif isinstance(self._fill, Iterable):
|
||||
string += '{0: <16}{1}'.format('\tMaterial', '=\t')
|
||||
string += '['
|
||||
string += ', '.join(['void' if m == 'void' else str(m.id)
|
||||
for m in self.fill])
|
||||
string += ']\n'
|
||||
elif isinstance(self._fill, (openmc.Universe, openmc.Lattice)):
|
||||
string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t',
|
||||
self._fill._id)
|
||||
if self.fill_type == 'material':
|
||||
string += '{: <16}=\tMaterial {}\n'.format('\tFill', self.fill.id)
|
||||
elif self.fill_type == 'void':
|
||||
string += '{: <16}=\tNone\n'.format('\tFill')
|
||||
elif self.fill_type == 'distribmat':
|
||||
string += '{: <16}=\t{}\n'.format('\tFill', list(map(
|
||||
lambda m: m if m is None else m.id, self.fill)))
|
||||
else:
|
||||
string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill)
|
||||
string += '{: <16}=\t{}\n'.format('\tFill', self.fill.id)
|
||||
|
||||
string += '{0: <16}{1}{2}\n'.format('\tRegion', '=\t', self._region)
|
||||
|
||||
string += '{0: <16}{1}{2}\n'.format('\tRotation', '=\t',
|
||||
self._rotation)
|
||||
string += '{: <16}=\t{}\n'.format('\tRegion', self.region)
|
||||
string += '{: <16}=\t{}\n'.format('\tRotation', self.rotation)
|
||||
if self.fill_type == 'material':
|
||||
string += '\t{0: <15}=\t{1}\n'.format('Temperature',
|
||||
self.temperature)
|
||||
string += '{0: <16}{1}{2}\n'.format('\tTranslation', '=\t',
|
||||
self._translation)
|
||||
string += '{0: <16}{1}{2}\n'.format('\tOffset', '=\t', self._offsets)
|
||||
string += '{0: <16}{1}{2}\n'.format('\tDistribcell index', '=\t',
|
||||
self._distribcell_index)
|
||||
string += '{: <16}=\t{}\n'.format('\tTranslation', self.translation)
|
||||
string += '{: <16}=\t{}\n'.format('\tOffset', self.offsets)
|
||||
string += '{: <16}=\t{}\n'.format('\tDistribcell index', self.distribcell_index)
|
||||
|
||||
return string
|
||||
|
||||
|
|
@ -175,8 +188,10 @@ class Cell(object):
|
|||
return 'universe'
|
||||
elif isinstance(self.fill, openmc.Lattice):
|
||||
return 'lattice'
|
||||
elif isinstance(self.fill, Iterable):
|
||||
return 'distribmat'
|
||||
else:
|
||||
return None
|
||||
return 'void'
|
||||
|
||||
@property
|
||||
def region(self):
|
||||
|
|
@ -186,6 +201,10 @@ class Cell(object):
|
|||
def rotation(self):
|
||||
return self._rotation
|
||||
|
||||
@property
|
||||
def rotation_matrix(self):
|
||||
return self._rotation_matrix
|
||||
|
||||
@property
|
||||
def temperature(self):
|
||||
return self._temperature
|
||||
|
|
@ -202,6 +221,14 @@ class Cell(object):
|
|||
def distribcell_index(self):
|
||||
return self._distribcell_index
|
||||
|
||||
@property
|
||||
def distribcell_paths(self):
|
||||
return self._distribcell_paths
|
||||
|
||||
@property
|
||||
def volume_information(self):
|
||||
return self._volume_information
|
||||
|
||||
@id.setter
|
||||
def id(self, cell_id):
|
||||
if cell_id is None:
|
||||
|
|
@ -223,33 +250,25 @@ class Cell(object):
|
|||
|
||||
@fill.setter
|
||||
def fill(self, fill):
|
||||
if isinstance(fill, basestring):
|
||||
if fill.strip().lower() == 'void':
|
||||
self._type = 'void'
|
||||
else:
|
||||
if fill is not None:
|
||||
if isinstance(fill, basestring):
|
||||
if fill.strip().lower() != 'void':
|
||||
msg = 'Unable to set Cell ID="{0}" to use a non-Material ' \
|
||||
'or Universe fill "{1}"'.format(self._id, fill)
|
||||
raise ValueError(msg)
|
||||
fill = None
|
||||
|
||||
elif isinstance(fill, Iterable):
|
||||
for i, f in enumerate(fill):
|
||||
if f is not None:
|
||||
cv.check_type('cell.fill[i]', f, openmc.Material)
|
||||
|
||||
elif not isinstance(fill, (openmc.Material, openmc.Lattice,
|
||||
openmc.Universe)):
|
||||
msg = 'Unable to set Cell ID="{0}" to use a non-Material or ' \
|
||||
'Universe fill "{1}"'.format(self._id, fill)
|
||||
'Universe fill "{1}"'.format(self._id, fill)
|
||||
raise ValueError(msg)
|
||||
|
||||
elif isinstance(fill, openmc.Material):
|
||||
self._type = 'normal'
|
||||
|
||||
elif isinstance(fill, Iterable):
|
||||
cv.check_type('cell.fill', fill, Iterable,
|
||||
(openmc.Material, basestring))
|
||||
self._type = 'normal'
|
||||
|
||||
elif isinstance(fill, openmc.Universe):
|
||||
self._type = 'fill'
|
||||
|
||||
elif isinstance(fill, openmc.Lattice):
|
||||
self._type = 'lattice'
|
||||
|
||||
else:
|
||||
msg = 'Unable to set Cell ID="{0}" to use a non-Material or ' \
|
||||
'Universe fill "{1}"'.format(self._id, fill)
|
||||
raise ValueError(msg)
|
||||
|
||||
self._fill = fill
|
||||
|
||||
@rotation.setter
|
||||
|
|
@ -260,16 +279,27 @@ class Cell(object):
|
|||
|
||||
cv.check_type('cell rotation', rotation, Iterable, Real)
|
||||
cv.check_length('cell rotation', rotation, 3)
|
||||
self._rotation = rotation
|
||||
self._rotation = np.asarray(rotation)
|
||||
|
||||
# Save rotation matrix
|
||||
phi, theta, psi = self.rotation*(-pi/180.)
|
||||
c3, s3 = cos(phi), sin(phi)
|
||||
c2, s2 = cos(theta), sin(theta)
|
||||
c1, s1 = cos(psi), sin(psi)
|
||||
self._rotation_matrix = np.array([
|
||||
[c1*c2, c1*s2*s3 - c3*s1, s1*s3 + c1*c3*s2],
|
||||
[c2*s1, c1*c3 + s1*s2*s3, c3*s1*s2 - c1*s3],
|
||||
[-s2, c2*s3, c2*c3]])
|
||||
|
||||
@translation.setter
|
||||
def translation(self, translation):
|
||||
cv.check_type('cell translation', translation, Iterable, Real)
|
||||
cv.check_length('cell translation', translation, 3)
|
||||
self._translation = translation
|
||||
self._translation = np.asarray(translation)
|
||||
|
||||
@temperature.setter
|
||||
def temperature(self, temperature):
|
||||
# Make sure temperatures are positive
|
||||
cv.check_type('cell temperature', temperature, (Iterable, Real))
|
||||
if isinstance(temperature, Iterable):
|
||||
cv.check_type('cell temperature', temperature, Iterable, Real)
|
||||
|
|
@ -277,7 +307,15 @@ class Cell(object):
|
|||
cv.check_greater_than('cell temperature', T, 0.0, True)
|
||||
else:
|
||||
cv.check_greater_than('cell temperature', temperature, 0.0, True)
|
||||
self._temperature = temperature
|
||||
|
||||
# If this cell is filled with a universe or lattice, propagate
|
||||
# temperatures to all cells contained. Otherwise, simply assign it.
|
||||
if self.fill_type in ('universe', 'lattice'):
|
||||
for c in self.get_all_cells().values():
|
||||
if c.fill_type == 'material':
|
||||
c._temperature = temperature
|
||||
else:
|
||||
self._temperature = temperature
|
||||
|
||||
@offsets.setter
|
||||
def offsets(self, offsets):
|
||||
|
|
@ -286,7 +324,8 @@ class Cell(object):
|
|||
|
||||
@region.setter
|
||||
def region(self, region):
|
||||
cv.check_type('cell region', region, Region)
|
||||
if region is not None:
|
||||
cv.check_type('cell region', region, Region)
|
||||
self._region = region
|
||||
|
||||
@distribcell_index.setter
|
||||
|
|
@ -294,6 +333,12 @@ class Cell(object):
|
|||
cv.check_type('distribcell index', ind, Integral)
|
||||
self._distribcell_index = ind
|
||||
|
||||
@distribcell_paths.setter
|
||||
def distribcell_paths(self, distribcell_paths):
|
||||
cv.check_iterable_type('distribcell_paths', distribcell_paths,
|
||||
basestring)
|
||||
self._distribcell_paths = distribcell_paths
|
||||
|
||||
def add_surface(self, surface, halfspace):
|
||||
"""Add a half-space to the list of half-spaces whose intersection defines the
|
||||
cell.
|
||||
|
|
@ -338,14 +383,33 @@ class Cell(object):
|
|||
else:
|
||||
self.region = Intersection(self.region, region)
|
||||
|
||||
def add_volume_information(self, volume_calc):
|
||||
"""Add volume information to a cell.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
volume_calc : openmc.VolumeCalculation
|
||||
Results from a stochastic volume calculation
|
||||
|
||||
"""
|
||||
if volume_calc.domain_type == 'cell':
|
||||
for cell_id in volume_calc.results:
|
||||
if cell_id == self.id:
|
||||
self._volume_information = volume_calc.results[cell_id]
|
||||
break
|
||||
else:
|
||||
raise ValueError('No volume information found for this cell.')
|
||||
else:
|
||||
raise ValueError('No volume information found for this cell.')
|
||||
|
||||
def get_cell_instance(self, path, distribcell_index):
|
||||
|
||||
# If the Cell is filled by a Material
|
||||
if self._type == 'normal' or self._type == 'void':
|
||||
if self.fill_type in ('material', 'distribmat', 'void'):
|
||||
offset = 0
|
||||
|
||||
# If the Cell is filled by a Universe
|
||||
elif self._type == 'fill':
|
||||
elif self.fill_type == 'universe':
|
||||
offset = self.offsets[distribcell_index-1]
|
||||
offset += self.fill.get_cell_instance(path, distribcell_index)
|
||||
|
||||
|
|
@ -355,8 +419,19 @@ class Cell(object):
|
|||
|
||||
return offset
|
||||
|
||||
def get_all_nuclides(self):
|
||||
"""Return all nuclides contained in the cell
|
||||
def get_nuclides(self):
|
||||
"""Returns all nuclides in the cell
|
||||
|
||||
Returns
|
||||
-------
|
||||
nuclides : list of str
|
||||
List of nuclide names
|
||||
|
||||
"""
|
||||
return self.fill.get_nuclides() if self.fill_type != 'void' else []
|
||||
|
||||
def get_nuclide_densities(self):
|
||||
"""Return all nuclides contained in the cell and their densities
|
||||
|
||||
Returns
|
||||
-------
|
||||
|
|
@ -368,8 +443,23 @@ class Cell(object):
|
|||
|
||||
nuclides = OrderedDict()
|
||||
|
||||
if self._type != 'void':
|
||||
nuclides.update(self._fill.get_all_nuclides())
|
||||
if self.fill_type == 'material':
|
||||
nuclides.update(self.fill.get_nuclide_densities())
|
||||
elif self.fill_type == 'void':
|
||||
pass
|
||||
else:
|
||||
if self.volume_information is not None:
|
||||
volume = self.volume_information['volume'][0]
|
||||
for name, atoms in self.volume_information['atoms']:
|
||||
nuclide = openmc.Nuclide(name)
|
||||
density = 1.0e-24 * atoms[0]/volume # density in atoms/b-cm
|
||||
nuclides[name] = (nuclide, density)
|
||||
else:
|
||||
raise RuntimeError(
|
||||
'Volume information is needed to calculate microscopic cross '
|
||||
'sections for cell {}. This can be done by running a '
|
||||
'stochastic volume calculation via the '
|
||||
'openmc.VolumeCalculation object'.format(self.id))
|
||||
|
||||
return nuclides
|
||||
|
||||
|
|
@ -387,8 +477,8 @@ class Cell(object):
|
|||
|
||||
cells = OrderedDict()
|
||||
|
||||
if self._type == 'fill' or self._type == 'lattice':
|
||||
cells.update(self._fill.get_all_cells())
|
||||
if self.fill_type in ('universe', 'lattice'):
|
||||
cells.update(self.fill.get_all_cells())
|
||||
|
||||
return cells
|
||||
|
||||
|
|
@ -409,7 +499,7 @@ class Cell(object):
|
|||
|
||||
# Append all Cells in each Cell in the Universe to the dictionary
|
||||
cells = self.get_all_cells()
|
||||
for cell_id, cell in cells.items():
|
||||
for cell in cells.values():
|
||||
materials.update(cell.get_all_materials())
|
||||
|
||||
return materials
|
||||
|
|
@ -428,11 +518,11 @@ class Cell(object):
|
|||
|
||||
universes = OrderedDict()
|
||||
|
||||
if self._type == 'fill':
|
||||
universes[self._fill._id] = self._fill
|
||||
universes.update(self._fill.get_all_universes())
|
||||
elif self._type == 'lattice':
|
||||
universes.update(self._fill.get_all_universes())
|
||||
if self.fill_type == 'universe':
|
||||
universes[self.fill.id] = self.fill
|
||||
universes.update(self.fill.get_all_universes())
|
||||
elif self.fill_type == 'lattice':
|
||||
universes.update(self.fill.get_all_universes())
|
||||
|
||||
return universes
|
||||
|
||||
|
|
@ -443,24 +533,20 @@ class Cell(object):
|
|||
if len(self._name) > 0:
|
||||
element.set("name", str(self.name))
|
||||
|
||||
if isinstance(self.fill, basestring):
|
||||
if self.fill_type == 'void':
|
||||
element.set("material", "void")
|
||||
|
||||
elif isinstance(self.fill, openmc.Material):
|
||||
elif self.fill_type == 'material':
|
||||
element.set("material", str(self.fill.id))
|
||||
|
||||
elif isinstance(self.fill, Iterable):
|
||||
element.set("material", ' '.join([m if m == 'void' else str(m.id)
|
||||
elif self.fill_type == 'distribmat':
|
||||
element.set("material", ' '.join(['void' if m is None else str(m.id)
|
||||
for m in self.fill]))
|
||||
|
||||
elif isinstance(self.fill, (openmc.Universe, openmc.Lattice)):
|
||||
elif self.fill_type in ('universe', 'lattice'):
|
||||
element.set("fill", str(self.fill.id))
|
||||
self.fill.create_xml_subelement(xml_element)
|
||||
|
||||
else:
|
||||
element.set("fill", str(self.fill))
|
||||
self.fill.create_xml_subelement(xml_element)
|
||||
|
||||
if self.region is not None:
|
||||
# Set the region attribute with the region specification
|
||||
element.set("region", str(self.region))
|
||||
|
|
@ -489,7 +575,7 @@ class Cell(object):
|
|||
if self.temperature is not None:
|
||||
if isinstance(self.temperature, Iterable):
|
||||
element.set("temperature", ' '.join(
|
||||
str(t) for t in self.temperature))
|
||||
str(t) for t in self.temperature))
|
||||
else:
|
||||
element.set("temperature", str(self.temperature))
|
||||
|
||||
|
|
|
|||
|
|
@ -1,36 +1,8 @@
|
|||
import copy
|
||||
from collections import Iterable
|
||||
from numbers import Integral, Real
|
||||
|
||||
import numpy as np
|
||||
|
||||
def _isinstance(value, expected_type):
|
||||
"""A Numpy-aware replacement for isinstance
|
||||
|
||||
This function will be obsolete when Numpy v. >= 1.9 is established.
|
||||
"""
|
||||
|
||||
# Declare numpy numeric types.
|
||||
np_ints = (np.int_, np.intc, np.intp, np.int8, np.int16, np.int32, np.int64,
|
||||
np.uint8, np.uint16, np.uint32, np.uint64)
|
||||
np_floats = (np.float_, np.float16, np.float32, np.float64)
|
||||
|
||||
# Include numpy integers, if necessary.
|
||||
if type(expected_type) is tuple:
|
||||
if Integral in expected_type:
|
||||
expected_type = expected_type + np_ints
|
||||
elif expected_type is Integral:
|
||||
expected_type = (Integral, ) + np_ints
|
||||
|
||||
# Include numpy floats, if necessary.
|
||||
if type(expected_type) is tuple:
|
||||
if Real in expected_type:
|
||||
expected_type = expected_type + np_floats
|
||||
elif expected_type is Real:
|
||||
expected_type = (Real, ) + np_floats
|
||||
|
||||
# Now, make the instance check.
|
||||
return isinstance(value, expected_type)
|
||||
|
||||
def check_type(name, value, expected_type, expected_iter_type=None):
|
||||
"""Ensure that an object is of an expected type. Optionally, if the object is
|
||||
|
|
@ -50,7 +22,7 @@ def check_type(name, value, expected_type, expected_iter_type=None):
|
|||
|
||||
"""
|
||||
|
||||
if not _isinstance(value, expected_type):
|
||||
if not isinstance(value, expected_type):
|
||||
if isinstance(expected_type, Iterable):
|
||||
msg = 'Unable to set "{0}" to "{1}" which is not one of the ' \
|
||||
'following types: "{2}"'.format(name, value, ', '.join(
|
||||
|
|
@ -61,8 +33,16 @@ def check_type(name, value, expected_type, expected_iter_type=None):
|
|||
raise TypeError(msg)
|
||||
|
||||
if expected_iter_type:
|
||||
if isinstance(value, np.ndarray):
|
||||
if not issubclass(value.dtype.type, expected_iter_type):
|
||||
msg = 'Unable to set "{0}" to "{1}" since each item must be ' \
|
||||
'of type "{2}"'.format(name, value,
|
||||
expected_iter_type.__name__)
|
||||
else:
|
||||
return
|
||||
|
||||
for item in value:
|
||||
if not _isinstance(item, expected_iter_type):
|
||||
if not isinstance(item, expected_iter_type):
|
||||
if isinstance(expected_iter_type, Iterable):
|
||||
msg = 'Unable to set "{0}" to "{1}" since each item must be ' \
|
||||
'one of the following types: "{2}"'.format(
|
||||
|
|
@ -118,7 +98,7 @@ def check_iterable_type(name, value, expected_type, min_depth=1, max_depth=1):
|
|||
|
||||
# If this item is of the expected type, then we've reached the bottom
|
||||
# level of this branch.
|
||||
if _isinstance(current_item, expected_type):
|
||||
if isinstance(current_item, expected_type):
|
||||
# Is this deep enough?
|
||||
if len(tree) < min_depth:
|
||||
msg = 'Error setting "{0}": The item at {1} does not meet the '\
|
||||
|
|
@ -181,7 +161,7 @@ def check_length(name, value, length_min, length_max=None):
|
|||
else:
|
||||
msg = 'Unable to set "{0}" to "{1}" since it must have length ' \
|
||||
'between "{2}" and "{3}"'.format(name, value, length_min,
|
||||
length_max)
|
||||
length_max)
|
||||
raise ValueError(msg)
|
||||
|
||||
|
||||
|
|
@ -232,7 +212,7 @@ def check_less_than(name, value, maximum, equality=False):
|
|||
raise ValueError(msg)
|
||||
|
||||
def check_greater_than(name, value, minimum, equality=False):
|
||||
"""Ensure that an object's value is less than a given value.
|
||||
"""Ensure that an object's value is greater than a given value.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
|
|
@ -274,6 +254,7 @@ class CheckedList(list):
|
|||
"""
|
||||
|
||||
def __init__(self, expected_type, name, items=[]):
|
||||
super(CheckedList, self).__init__()
|
||||
self.expected_type = expected_type
|
||||
self.name = name
|
||||
for item in items:
|
||||
|
|
|
|||
|
|
@ -15,9 +15,7 @@ from numbers import Real, Integral
|
|||
from xml.etree import ElementTree as ET
|
||||
import sys
|
||||
|
||||
import numpy as np
|
||||
|
||||
from openmc.clean_xml import *
|
||||
from openmc.clean_xml import clean_xml_indentation
|
||||
from openmc.checkvalue import (check_type, check_length, check_value,
|
||||
check_greater_than, check_less_than)
|
||||
|
||||
|
|
@ -188,7 +186,7 @@ class CMFDMesh(object):
|
|||
|
||||
|
||||
class CMFD(object):
|
||||
"""Parameters that control the use of coarse-mesh finite difference acceleration
|
||||
r"""Parameters that control the use of coarse-mesh finite difference acceleration
|
||||
in OpenMC. This corresponds directly to the cmfd.xml input file.
|
||||
|
||||
Attributes
|
||||
|
|
|
|||
|
|
@ -1 +1,17 @@
|
|||
from .data import *
|
||||
from .neutron import *
|
||||
from .reaction import *
|
||||
from .ace import *
|
||||
from .angle_distribution import *
|
||||
from .function import *
|
||||
from .energy_distribution import *
|
||||
from .product import *
|
||||
from .angle_energy import *
|
||||
from .uncorrelated import *
|
||||
from .correlated import *
|
||||
from .kalbach_mann import *
|
||||
from .nbody import *
|
||||
from .thermal import *
|
||||
from .urr import *
|
||||
from .library import *
|
||||
from .fission_energy import *
|
||||
|
|
|
|||
392
openmc/data/ace.py
Normal file
392
openmc/data/ace.py
Normal file
|
|
@ -0,0 +1,392 @@
|
|||
"""This module is for reading ACE-format cross sections. ACE stands for "A
|
||||
Compact ENDF" format and originated from work on MCNP_. It is used in a number
|
||||
of other Monte Carlo particle transport codes.
|
||||
|
||||
ACE-format cross sections are typically generated from ENDF_ files through a
|
||||
cross section processing program like NJOY_. The ENDF data consists of tabulated
|
||||
thermal data, ENDF/B resonance parameters, distribution parameters in the
|
||||
unresolved resonance region, and tabulated data in the fast region. After the
|
||||
ENDF data has been reconstructed and Doppler-broadened, the ACER module
|
||||
generates ACE-format cross sections.
|
||||
|
||||
.. _MCNP: https://laws.lanl.gov/vhosts/mcnp.lanl.gov/
|
||||
.. _NJOY: http://t2.lanl.gov/codes.shtml
|
||||
.. _ENDF: http://www.nndc.bnl.gov/endf
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import division, unicode_literals
|
||||
from os import SEEK_CUR
|
||||
import struct
|
||||
import sys
|
||||
|
||||
import numpy as np
|
||||
|
||||
from openmc.mixin import EqualityMixin
|
||||
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
|
||||
def ascii_to_binary(ascii_file, binary_file):
|
||||
"""Convert an ACE file in ASCII format (type 1) to binary format (type 2).
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ascii_file : str
|
||||
Filename of ASCII ACE file
|
||||
binary_file : str
|
||||
Filename of binary ACE file to be written
|
||||
|
||||
"""
|
||||
|
||||
# Open ASCII file
|
||||
ascii = open(ascii_file, 'r')
|
||||
|
||||
# Set default record length
|
||||
record_length = 4096
|
||||
|
||||
# Read data from ASCII file
|
||||
lines = ascii.readlines()
|
||||
ascii.close()
|
||||
|
||||
# Open binary file
|
||||
binary = open(binary_file, 'wb')
|
||||
|
||||
idx = 0
|
||||
|
||||
while idx < len(lines):
|
||||
# check if it's a > 2.0.0 version header
|
||||
if lines[idx].split()[0][1] == '.':
|
||||
if lines[idx + 1].split()[3] == '3':
|
||||
idx = idx + 3
|
||||
else:
|
||||
raise NotImplementedError('Only backwards compatible ACE'
|
||||
'headers currently supported')
|
||||
# Read/write header block
|
||||
hz = lines[idx][:10].encode('UTF-8')
|
||||
aw0 = float(lines[idx][10:22])
|
||||
tz = float(lines[idx][22:34])
|
||||
hd = lines[idx][35:45].encode('UTF-8')
|
||||
hk = lines[idx + 1][:70].encode('UTF-8')
|
||||
hm = lines[idx + 1][70:80].encode('UTF-8')
|
||||
binary.write(struct.pack(str('=10sdd10s70s10s'), hz, aw0, tz, hd, hk, hm))
|
||||
|
||||
# Read/write IZ/AW pairs
|
||||
data = ' '.join(lines[idx + 2:idx + 6]).split()
|
||||
iz = list(map(int, data[::2]))
|
||||
aw = list(map(float, data[1::2]))
|
||||
izaw = [item for sublist in zip(iz, aw) for item in sublist]
|
||||
binary.write(struct.pack(str('=' + 16*'id'), *izaw))
|
||||
|
||||
# Read/write NXS and JXS arrays. Null bytes are added at the end so
|
||||
# that XSS will start at the second record
|
||||
nxs = list(map(int, ' '.join(lines[idx + 6:idx + 8]).split()))
|
||||
jxs = list(map(int, ' '.join(lines[idx + 8:idx + 12]).split()))
|
||||
binary.write(struct.pack(str('=16i32i{0}x'.format(record_length - 500)),
|
||||
*(nxs + jxs)))
|
||||
|
||||
# Read/write XSS array. Null bytes are added to form a complete record
|
||||
# at the end of the file
|
||||
n_lines = (nxs[0] + 3)//4
|
||||
xss = list(map(float, ' '.join(lines[
|
||||
idx + 12:idx + 12 + n_lines]).split()))
|
||||
extra_bytes = record_length - ((len(xss)*8 - 1) % record_length + 1)
|
||||
binary.write(struct.pack(str('={0}d{1}x'.format(nxs[0], extra_bytes)),
|
||||
*xss))
|
||||
|
||||
# Advance to next table in file
|
||||
idx += 12 + n_lines
|
||||
|
||||
# Close binary file
|
||||
binary.close()
|
||||
|
||||
|
||||
def get_table(filename, name=None):
|
||||
"""Read a single table from an ACE file
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Path of the ACE library to load table from
|
||||
name : str, optional
|
||||
Name of table to load, e.g. '92235.71c'
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ace.Table
|
||||
ACE table with specified name. If no name is specified, the first table
|
||||
in the file is returned.
|
||||
|
||||
"""
|
||||
|
||||
lib = Library(filename)
|
||||
if name is None:
|
||||
return lib.tables[0]
|
||||
else:
|
||||
for table in lib.tables:
|
||||
if table.name == name:
|
||||
return table
|
||||
else:
|
||||
raise ValueError('Could not find ACE table with name: {}'
|
||||
.format(name))
|
||||
|
||||
|
||||
class Library(EqualityMixin):
|
||||
"""A Library objects represents an ACE-formatted file which may contain
|
||||
multiple tables with data.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Path of the ACE library file to load.
|
||||
table_names : None, str, or iterable, optional
|
||||
Tables from the file to read in. If None, reads in all of the
|
||||
tables. If str, reads in only the single table of a matching name.
|
||||
verbose : bool, optional
|
||||
Determines whether output is printed to the stdout when reading a
|
||||
Library
|
||||
|
||||
Attributes
|
||||
----------
|
||||
tables : list
|
||||
List of :class:`Table` instances
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, filename, table_names=None, verbose=False):
|
||||
if isinstance(table_names, basestring):
|
||||
table_names = [table_names]
|
||||
if table_names is not None:
|
||||
table_names = set(table_names)
|
||||
|
||||
self.tables = []
|
||||
|
||||
# Determine whether file is ASCII or binary
|
||||
try:
|
||||
fh = open(filename, 'rb')
|
||||
# Grab 10 lines of the library
|
||||
sb = b''.join([fh.readline() for i in range(10)])
|
||||
|
||||
# Try to decode it with ascii
|
||||
sb.decode('ascii')
|
||||
|
||||
# No exception so proceed with ASCII - reopen in non-binary
|
||||
fh.close()
|
||||
with open(filename, 'r') as fh:
|
||||
fh.seek(0)
|
||||
self._read_ascii(fh, table_names, verbose)
|
||||
except UnicodeDecodeError:
|
||||
fh.close()
|
||||
with open(filename, 'rb') as fh:
|
||||
self._read_binary(fh, table_names, verbose)
|
||||
|
||||
def _read_binary(self, ace_file, table_names, verbose=False,
|
||||
recl_length=4096, entries=512):
|
||||
"""Read a binary (Type 2) ACE table.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace_file : file
|
||||
Open ACE file
|
||||
table_names : None, str, or iterable
|
||||
Tables from the file to read in. If None, reads in all of the
|
||||
tables. If str, reads in only the single table of a matching name.
|
||||
verbose : str, optional
|
||||
Whether to display what tables are being read. Defaults to False.
|
||||
recl_length : int, optional
|
||||
Fortran record length in binary file. Default value is 4096 bytes.
|
||||
entries : int, optional
|
||||
Number of entries per record. The default is 512 corresponding to a
|
||||
record length of 4096 bytes with double precision data.
|
||||
|
||||
"""
|
||||
|
||||
while True:
|
||||
start_position = ace_file.tell()
|
||||
|
||||
# Check for end-of-file
|
||||
if len(ace_file.read(1)) == 0:
|
||||
return
|
||||
ace_file.seek(start_position)
|
||||
|
||||
# Read name, atomic mass ratio, temperature, date, comment, and
|
||||
# material
|
||||
name, atomic_weight_ratio, temperature, date, comment, mat = \
|
||||
struct.unpack(str('=10sdd10s70s10s'), ace_file.read(116))
|
||||
name = name.decode().strip()
|
||||
|
||||
# Read ZAID/awr combinations
|
||||
data = struct.unpack(str('=' + 16*'id'), ace_file.read(192))
|
||||
pairs = list(zip(data[::2], data[1::2]))
|
||||
|
||||
# Read NXS
|
||||
nxs = list(struct.unpack(str('=16i'), ace_file.read(64)))
|
||||
|
||||
# Determine length of XSS and number of records
|
||||
length = nxs[0]
|
||||
n_records = (length + entries - 1)//entries
|
||||
|
||||
# verify that we are supposed to read this table in
|
||||
if (table_names is not None) and (name not in table_names):
|
||||
ace_file.seek(start_position + recl_length*(n_records + 1))
|
||||
continue
|
||||
|
||||
if verbose:
|
||||
kelvin = round(temperature * 1e6 / 8.617342e-5)
|
||||
print("Loading nuclide {0} at {1} K".format(name, kelvin))
|
||||
|
||||
# Read JXS
|
||||
jxs = list(struct.unpack(str('=32i'), ace_file.read(128)))
|
||||
|
||||
# Read XSS
|
||||
ace_file.seek(start_position + recl_length)
|
||||
xss = list(struct.unpack(str('={0}d'.format(length)),
|
||||
ace_file.read(length*8)))
|
||||
|
||||
# Insert zeros at beginning of NXS, JXS, and XSS arrays so that the
|
||||
# indexing will be the same as Fortran. This makes it easier to
|
||||
# follow the ACE format specification.
|
||||
nxs.insert(0, 0)
|
||||
nxs = np.array(nxs, dtype=int)
|
||||
|
||||
jxs.insert(0, 0)
|
||||
jxs = np.array(jxs, dtype=int)
|
||||
|
||||
xss.insert(0, 0.0)
|
||||
xss = np.array(xss)
|
||||
|
||||
# Create ACE table with data read in
|
||||
table = Table(name, atomic_weight_ratio, temperature, pairs,
|
||||
nxs, jxs, xss)
|
||||
self.tables.append(table)
|
||||
|
||||
# Advance to next record
|
||||
ace_file.seek(start_position + recl_length*(n_records + 1))
|
||||
|
||||
def _read_ascii(self, ace_file, table_names, verbose=False):
|
||||
"""Read an ASCII (Type 1) ACE table.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace_file : file
|
||||
Open ACE file
|
||||
table_names : None, str, or iterable
|
||||
Tables from the file to read in. If None, reads in all of the
|
||||
tables. If str, reads in only the single table of a matching name.
|
||||
verbose : str, optional
|
||||
Whether to display what tables are being read. Defaults to False.
|
||||
|
||||
"""
|
||||
|
||||
tables_seen = set()
|
||||
|
||||
lines = [ace_file.readline() for i in range(13)]
|
||||
|
||||
while len(lines) != 0 and lines[0].strip() != '':
|
||||
# Read name of table, atomic mass ratio, and temperature. If first
|
||||
# line is empty, we are at end of file
|
||||
|
||||
# check if it's a 2.0 style header
|
||||
if lines[0].split()[0][1] == '.':
|
||||
words = lines[0].split()
|
||||
name = words[1]
|
||||
words = lines[1].split()
|
||||
atomic_weight_ratio = float(words[0])
|
||||
temperature = float(words[1])
|
||||
commentlines = int(words[3])
|
||||
for i in range(commentlines):
|
||||
lines.pop(0)
|
||||
lines.append(ace_file.readline())
|
||||
else:
|
||||
words = lines[0].split()
|
||||
name = words[0]
|
||||
atomic_weight_ratio = float(words[1])
|
||||
temperature = float(words[2])
|
||||
|
||||
datastr = ' '.join(lines[2:6]).split()
|
||||
pairs = list(zip(map(int, datastr[::2]),
|
||||
map(float, datastr[1::2])))
|
||||
|
||||
datastr = '0 ' + ' '.join(lines[6:8])
|
||||
nxs = np.fromstring(datastr, sep=' ', dtype=int)
|
||||
|
||||
n_lines = (nxs[1] + 3)//4
|
||||
n_bytes = len(lines[-1]) * (n_lines - 2) + 1
|
||||
|
||||
# Ensure that we have more tables to read in
|
||||
if (table_names is not None) and (table_names < tables_seen):
|
||||
break
|
||||
tables_seen.add(name)
|
||||
|
||||
# verify that we are suppossed to read this table in
|
||||
if (table_names is not None) and (name not in table_names):
|
||||
ace_file.seek(n_bytes, SEEK_CUR)
|
||||
ace_file.readline()
|
||||
lines = [ace_file.readline() for i in range(13)]
|
||||
continue
|
||||
|
||||
# read and fix over-shoot
|
||||
lines += ace_file.readlines(n_bytes)
|
||||
if 12 + n_lines < len(lines):
|
||||
goback = sum([len(line) for line in lines[12+n_lines:]])
|
||||
lines = lines[:12+n_lines]
|
||||
ace_file.seek(-goback, SEEK_CUR)
|
||||
|
||||
if verbose:
|
||||
kelvin = round(temperature * 1e6 / 8.617342e-5)
|
||||
print("Loading nuclide {0} at {1} K".format(name, kelvin))
|
||||
|
||||
# Insert zeros at beginning of NXS, JXS, and XSS arrays so that the
|
||||
# indexing will be the same as Fortran. This makes it easier to
|
||||
# follow the ACE format specification.
|
||||
datastr = '0 ' + ' '.join(lines[8:12])
|
||||
jxs = np.fromstring(datastr, dtype=int, sep=' ')
|
||||
|
||||
datastr = '0.0 ' + ''.join(lines[12:12+n_lines])
|
||||
xss = np.fromstring(datastr, sep=' ')
|
||||
|
||||
table = Table(name, atomic_weight_ratio, temperature, pairs,
|
||||
nxs, jxs, xss)
|
||||
self.tables.append(table)
|
||||
|
||||
# Read all data blocks
|
||||
lines = [ace_file.readline() for i in range(13)]
|
||||
|
||||
|
||||
class Table(EqualityMixin):
|
||||
"""ACE cross section table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
ZAID identifier of the table, e.g. '92235.70c'.
|
||||
atomic_weight_ratio : float
|
||||
Atomic mass ratio of the target nuclide.
|
||||
temperature : float
|
||||
Temperature of the target nuclide in MeV.
|
||||
pairs : list of tuple
|
||||
16 pairs of ZAIDs and atomic weight ratios. Used for thermal scattering
|
||||
tables to indicate what isotopes scattering is applied to.
|
||||
nxs : numpy.ndarray
|
||||
Array that defines various lengths with in the table
|
||||
jxs : numpy.ndarray
|
||||
Array that gives locations in the ``xss`` array for various blocks of
|
||||
data
|
||||
xss : numpy.ndarray
|
||||
Raw data for the ACE table
|
||||
|
||||
"""
|
||||
def __init__(self, name, atomic_weight_ratio, temperature, pairs,
|
||||
nxs, jxs, xss):
|
||||
self.name = name
|
||||
self.atomic_weight_ratio = atomic_weight_ratio
|
||||
self.temperature = temperature
|
||||
self.pairs = pairs
|
||||
self.nxs = nxs
|
||||
self.jxs = jxs
|
||||
self.xss = xss
|
||||
|
||||
def __repr__(self):
|
||||
return "<ACE Table: {}>".format(self.name)
|
||||
201
openmc/data/angle_distribution.py
Normal file
201
openmc/data/angle_distribution.py
Normal file
|
|
@ -0,0 +1,201 @@
|
|||
from collections import Iterable
|
||||
from numbers import Real
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.mixin import EqualityMixin
|
||||
from openmc.stats import Univariate, Tabular, Uniform
|
||||
from .function import INTERPOLATION_SCHEME
|
||||
|
||||
|
||||
class AngleDistribution(EqualityMixin):
|
||||
"""Angle distribution as a function of incoming energy
|
||||
|
||||
Parameters
|
||||
----------
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
mu : Iterable of openmc.stats.Univariate
|
||||
Distribution of scattering cosines corresponding to each incoming energy
|
||||
|
||||
Attributes
|
||||
----------
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
mu : Iterable of openmc.stats.Univariate
|
||||
Distribution of scattering cosines corresponding to each incoming energy
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, energy, mu):
|
||||
super(AngleDistribution, self).__init__()
|
||||
self.energy = energy
|
||||
self.mu = mu
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@property
|
||||
def mu(self):
|
||||
return self._mu
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('angle distribution incoming energy', energy,
|
||||
Iterable, Real)
|
||||
self._energy = energy
|
||||
|
||||
@mu.setter
|
||||
def mu(self, mu):
|
||||
cv.check_type('angle distribution scattering cosines', mu,
|
||||
Iterable, Univariate)
|
||||
self._mu = mu
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write angle distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
|
||||
dset = group.create_dataset('energy', data=self.energy)
|
||||
|
||||
# Make sure all data is tabular
|
||||
mu_tabular = [mu_i if isinstance(mu_i, Tabular) else
|
||||
mu_i.to_tabular() for mu_i in self.mu]
|
||||
|
||||
# Determine total number of (mu,p) pairs and create array
|
||||
n_pairs = sum([len(mu_i.x) for mu_i in mu_tabular])
|
||||
pairs = np.empty((3, n_pairs))
|
||||
|
||||
# Create array for offsets
|
||||
offsets = np.empty(len(mu_tabular), dtype=int)
|
||||
interpolation = np.empty(len(mu_tabular), dtype=int)
|
||||
j = 0
|
||||
|
||||
# Populate offsets and pairs array
|
||||
for i, mu_i in enumerate(mu_tabular):
|
||||
n = len(mu_i.x)
|
||||
offsets[i] = j
|
||||
interpolation[i] = 1 if mu_i.interpolation == 'histogram' else 2
|
||||
pairs[0, j:j+n] = mu_i.x
|
||||
pairs[1, j:j+n] = mu_i.p
|
||||
pairs[2, j:j+n] = mu_i.c
|
||||
j += n
|
||||
|
||||
# Create dataset for distributions
|
||||
dset = group.create_dataset('mu', data=pairs)
|
||||
|
||||
# Write interpolation as attribute
|
||||
dset.attrs['offsets'] = offsets
|
||||
dset.attrs['interpolation'] = interpolation
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate angular distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.AngleDistribution
|
||||
Angular distribution
|
||||
|
||||
"""
|
||||
energy = group['energy'].value
|
||||
data = group['mu']
|
||||
offsets = data.attrs['offsets']
|
||||
interpolation = data.attrs['interpolation']
|
||||
|
||||
mu = []
|
||||
n_energy = len(energy)
|
||||
for i in range(n_energy):
|
||||
# Determine length of outgoing energy distribution and number of
|
||||
# discrete lines
|
||||
j = offsets[i]
|
||||
if i < n_energy - 1:
|
||||
n = offsets[i+1] - j
|
||||
else:
|
||||
n = data.shape[1] - j
|
||||
|
||||
interp = INTERPOLATION_SCHEME[interpolation[i]]
|
||||
mu_i = Tabular(data[0, j:j+n], data[1, j:j+n], interp)
|
||||
mu_i.c = data[2, j:j+n]
|
||||
|
||||
mu.append(mu_i)
|
||||
|
||||
return cls(energy, mu)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, location_dist, location_start):
|
||||
"""Generate an angular distribution from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
location_dist : int
|
||||
Index in the XSS array corresponding to the start of a block,
|
||||
e.g. JXS(9).
|
||||
location_start : int
|
||||
Index in the XSS array corresponding to the start of an angle
|
||||
distribution array
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.AngleDistribution
|
||||
Angular distribution
|
||||
|
||||
"""
|
||||
# Set starting index for angle distribution
|
||||
idx = location_dist + location_start - 1
|
||||
|
||||
# Number of energies at which angular distributions are tabulated
|
||||
n_energies = int(ace.xss[idx])
|
||||
idx += 1
|
||||
|
||||
# Incoming energy grid
|
||||
energy = ace.xss[idx:idx + n_energies]
|
||||
idx += n_energies
|
||||
|
||||
# Read locations for angular distributions
|
||||
lc = ace.xss[idx:idx + n_energies].astype(int)
|
||||
idx += n_energies
|
||||
|
||||
mu = []
|
||||
for i in range(n_energies):
|
||||
if lc[i] > 0:
|
||||
# Equiprobable 32 bin distribution
|
||||
idx = location_dist + abs(lc[i]) - 1
|
||||
cos = ace.xss[idx:idx + 33]
|
||||
pdf = np.zeros(33)
|
||||
pdf[:32] = 1.0/(32.0*np.diff(cos))
|
||||
cdf = np.linspace(0.0, 1.0, 33)
|
||||
|
||||
mu_i = Tabular(cos, pdf, 'histogram', ignore_negative=True)
|
||||
mu_i.c = cdf
|
||||
elif lc[i] < 0:
|
||||
# Tabular angular distribution
|
||||
idx = location_dist + abs(lc[i]) - 1
|
||||
intt = int(ace.xss[idx])
|
||||
n_points = int(ace.xss[idx + 1])
|
||||
data = ace.xss[idx + 2:idx + 2 + 3*n_points]
|
||||
data.shape = (3, n_points)
|
||||
|
||||
mu_i = Tabular(data[0], data[1], INTERPOLATION_SCHEME[intt])
|
||||
mu_i.c = data[2]
|
||||
else:
|
||||
# Isotropic angular distribution
|
||||
mu_i = Uniform(-1., 1.)
|
||||
|
||||
mu.append(mu_i)
|
||||
|
||||
return cls(energy, mu)
|
||||
109
openmc/data/angle_energy.py
Normal file
109
openmc/data/angle_energy.py
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
from abc import ABCMeta, abstractmethod
|
||||
|
||||
import openmc.data
|
||||
from openmc.mixin import EqualityMixin
|
||||
|
||||
|
||||
class AngleEnergy(EqualityMixin):
|
||||
"""Distribution in angle and energy of a secondary particle."""
|
||||
|
||||
__metaclass = ABCMeta
|
||||
|
||||
@abstractmethod
|
||||
def to_hdf5(self, group):
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def from_hdf5(group):
|
||||
"""Generate angle-energy distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.AngleEnergy
|
||||
Angle-energy distribution
|
||||
|
||||
"""
|
||||
dist_type = group.attrs['type'].decode()
|
||||
if dist_type == 'uncorrelated':
|
||||
return openmc.data.UncorrelatedAngleEnergy.from_hdf5(group)
|
||||
elif dist_type == 'correlated':
|
||||
return openmc.data.CorrelatedAngleEnergy.from_hdf5(group)
|
||||
elif dist_type == 'kalbach-mann':
|
||||
return openmc.data.KalbachMann.from_hdf5(group)
|
||||
elif dist_type == 'nbody':
|
||||
return openmc.data.NBodyPhaseSpace.from_hdf5(group)
|
||||
|
||||
@staticmethod
|
||||
def from_ace(ace, location_dist, location_start, rx=None):
|
||||
"""Generate an AngleEnergy object from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
location_dist : int
|
||||
Index in the XSS array corresponding to the start of a block,
|
||||
e.g. JXS(11) for the the DLW block.
|
||||
location_start : int
|
||||
Index in the XSS array corresponding to the start of an energy
|
||||
distribution array
|
||||
rx : Reaction
|
||||
Reaction this energy distribution will be associated with
|
||||
|
||||
Returns
|
||||
-------
|
||||
distribution : openmc.data.AngleEnergy
|
||||
Secondary angle-energy distribution
|
||||
|
||||
"""
|
||||
# Set starting index for energy distribution
|
||||
idx = location_dist + location_start - 1
|
||||
|
||||
law = int(ace.xss[idx + 1])
|
||||
location_data = int(ace.xss[idx + 2])
|
||||
|
||||
# Position index for reading law data
|
||||
idx = location_dist + location_data - 1
|
||||
|
||||
# Parse energy distribution data
|
||||
if law == 2:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.DiscretePhoton.from_ace(ace, idx)
|
||||
elif law in (3, 33):
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.LevelInelastic.from_ace(ace, idx)
|
||||
elif law == 4:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.ContinuousTabular.from_ace(
|
||||
ace, idx, location_dist)
|
||||
elif law == 5:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.GeneralEvaporation.from_ace(ace, idx)
|
||||
elif law == 7:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.MaxwellEnergy.from_ace(ace, idx)
|
||||
elif law == 9:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.Evaporation.from_ace(ace, idx)
|
||||
elif law == 11:
|
||||
distribution = openmc.data.UncorrelatedAngleEnergy()
|
||||
distribution.energy = openmc.data.WattEnergy.from_ace(ace, idx)
|
||||
elif law == 44:
|
||||
distribution = openmc.data.KalbachMann.from_ace(
|
||||
ace, idx, location_dist)
|
||||
elif law == 61:
|
||||
distribution = openmc.data.CorrelatedAngleEnergy.from_ace(
|
||||
ace, idx, location_dist)
|
||||
elif law == 66:
|
||||
distribution = openmc.data.NBodyPhaseSpace.from_ace(
|
||||
ace, idx, rx.q_value)
|
||||
else:
|
||||
raise ValueError("Unsupported ACE secondary energy "
|
||||
"distribution law {}".format(law))
|
||||
|
||||
return distribution
|
||||
407
openmc/data/correlated.py
Normal file
407
openmc/data/correlated.py
Normal file
|
|
@ -0,0 +1,407 @@
|
|||
from collections import Iterable
|
||||
from numbers import Real, Integral
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.stats import Tabular, Univariate, Discrete, Mixture, Uniform
|
||||
from .function import INTERPOLATION_SCHEME
|
||||
from .angle_energy import AngleEnergy
|
||||
|
||||
|
||||
class CorrelatedAngleEnergy(AngleEnergy):
|
||||
"""Correlated angle-energy distribution
|
||||
|
||||
Parameters
|
||||
----------
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints defining interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation codes
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
energy_out : Iterable of openmc.stats.Univariate
|
||||
Distribution of outgoing energies corresponding to each incoming energy
|
||||
mu : Iterable of Iterable of openmc.stats.Univariate
|
||||
Distribution of scattering cosine for each incoming/outgoing energy
|
||||
|
||||
Attributes
|
||||
----------
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints defining interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation codes
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
energy_out : Iterable of openmc.stats.Univariate
|
||||
Distribution of outgoing energies corresponding to each incoming energy
|
||||
mu : Iterable of Iterable of openmc.stats.Univariate
|
||||
Distribution of scattering cosine for each incoming/outgoing energy
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, breakpoints, interpolation, energy, energy_out, mu):
|
||||
super(CorrelatedAngleEnergy, self).__init__()
|
||||
self.breakpoints = breakpoints
|
||||
self.interpolation = interpolation
|
||||
self.energy = energy
|
||||
self.energy_out = energy_out
|
||||
self.mu = mu
|
||||
|
||||
@property
|
||||
def breakpoints(self):
|
||||
return self._breakpoints
|
||||
|
||||
@property
|
||||
def interpolation(self):
|
||||
return self._interpolation
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@property
|
||||
def energy_out(self):
|
||||
return self._energy_out
|
||||
|
||||
@property
|
||||
def mu(self):
|
||||
return self._mu
|
||||
|
||||
@breakpoints.setter
|
||||
def breakpoints(self, breakpoints):
|
||||
cv.check_type('correlated angle-energy breakpoints', breakpoints,
|
||||
Iterable, Integral)
|
||||
self._breakpoints = breakpoints
|
||||
|
||||
@interpolation.setter
|
||||
def interpolation(self, interpolation):
|
||||
cv.check_type('correlated angle-energy interpolation', interpolation,
|
||||
Iterable, Integral)
|
||||
self._interpolation = interpolation
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('correlated angle-energy incoming energy', energy,
|
||||
Iterable, Real)
|
||||
self._energy = energy
|
||||
|
||||
@energy_out.setter
|
||||
def energy_out(self, energy_out):
|
||||
cv.check_type('correlated angle-energy outgoing energy', energy_out,
|
||||
Iterable, Univariate)
|
||||
self._energy_out = energy_out
|
||||
|
||||
@mu.setter
|
||||
def mu(self, mu):
|
||||
cv.check_iterable_type('correlated angle-energy outgoing cosine',
|
||||
mu, Univariate, 2, 2)
|
||||
self._mu = mu
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['type'] = np.string_('correlated')
|
||||
|
||||
dset = group.create_dataset('energy', data=self.energy)
|
||||
dset.attrs['interpolation'] = np.vstack((self.breakpoints,
|
||||
self.interpolation))
|
||||
|
||||
# Determine total number of (E,p) pairs and create array
|
||||
n_tuple = sum(len(d.x) for d in self.energy_out)
|
||||
eout = np.empty((5, n_tuple))
|
||||
|
||||
# Make sure all mu data is tabular
|
||||
mu_tabular = []
|
||||
for i, mu_i in enumerate(self.mu):
|
||||
mu_tabular.append([mu_ij if isinstance(mu_ij, (Tabular, Discrete)) else
|
||||
mu_ij.to_tabular() for mu_ij in mu_i])
|
||||
|
||||
# Determine total number of (mu,p) points and create array
|
||||
n_tuple = sum(sum(len(mu_ij.x) for mu_ij in mu_i)
|
||||
for mu_i in mu_tabular)
|
||||
mu = np.empty((3, n_tuple))
|
||||
|
||||
# Create array for offsets
|
||||
offsets = np.empty(len(self.energy_out), dtype=int)
|
||||
interpolation = np.empty(len(self.energy_out), dtype=int)
|
||||
n_discrete_lines = np.empty(len(self.energy_out), dtype=int)
|
||||
offset_e = 0
|
||||
offset_mu = 0
|
||||
|
||||
# Populate offsets and eout array
|
||||
for i, d in enumerate(self.energy_out):
|
||||
n = len(d)
|
||||
offsets[i] = offset_e
|
||||
|
||||
if isinstance(d, Mixture):
|
||||
discrete, continuous = d.distribution
|
||||
n_discrete_lines[i] = m = len(discrete)
|
||||
interpolation[i] = 1 if continuous.interpolation == 'histogram' else 2
|
||||
eout[0, offset_e:offset_e+m] = discrete.x
|
||||
eout[1, offset_e:offset_e+m] = discrete.p
|
||||
eout[2, offset_e:offset_e+m] = discrete.c
|
||||
eout[0, offset_e+m:offset_e+n] = continuous.x
|
||||
eout[1, offset_e+m:offset_e+n] = continuous.p
|
||||
eout[2, offset_e+m:offset_e+n] = continuous.c
|
||||
else:
|
||||
if isinstance(d, Tabular):
|
||||
n_discrete_lines[i] = 0
|
||||
interpolation[i] = 1 if d.interpolation == 'histogram' else 2
|
||||
elif isinstance(d, Discrete):
|
||||
n_discrete_lines[i] = n
|
||||
interpolation[i] = 1
|
||||
eout[0, offset_e:offset_e+n] = d.x
|
||||
eout[1, offset_e:offset_e+n] = d.p
|
||||
eout[2, offset_e:offset_e+n] = d.c
|
||||
|
||||
for j, mu_ij in enumerate(mu_tabular[i]):
|
||||
if isinstance(mu_ij, Discrete):
|
||||
eout[3, offset_e+j] = 0
|
||||
else:
|
||||
eout[3, offset_e+j] = 1 if mu_ij.interpolation == 'histogram' else 2
|
||||
eout[4, offset_e+j] = offset_mu
|
||||
|
||||
n_mu = len(mu_ij)
|
||||
mu[0, offset_mu:offset_mu+n_mu] = mu_ij.x
|
||||
mu[1, offset_mu:offset_mu+n_mu] = mu_ij.p
|
||||
mu[2, offset_mu:offset_mu+n_mu] = mu_ij.c
|
||||
|
||||
offset_mu += n_mu
|
||||
|
||||
offset_e += n
|
||||
|
||||
# Create dataset for outgoing energy distributions
|
||||
dset = group.create_dataset('energy_out', data=eout)
|
||||
|
||||
# Write interpolation on outgoing energy as attribute
|
||||
dset.attrs['offsets'] = offsets
|
||||
dset.attrs['interpolation'] = interpolation
|
||||
dset.attrs['n_discrete_lines'] = n_discrete_lines
|
||||
|
||||
# Create dataset for outgoing angle distributions
|
||||
group.create_dataset('mu', data=mu)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate correlated angle-energy distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.CorrelatedAngleEnergy
|
||||
Correlated angle-energy distribution
|
||||
|
||||
"""
|
||||
interp_data = group['energy'].attrs['interpolation']
|
||||
energy_breakpoints = interp_data[0, :]
|
||||
energy_interpolation = interp_data[1, :]
|
||||
energy = group['energy'].value
|
||||
|
||||
offsets = group['energy_out'].attrs['offsets']
|
||||
interpolation = group['energy_out'].attrs['interpolation']
|
||||
n_discrete_lines = group['energy_out'].attrs['n_discrete_lines']
|
||||
dset_eout = group['energy_out'].value
|
||||
energy_out = []
|
||||
|
||||
dset_mu = group['mu'].value
|
||||
mu = []
|
||||
|
||||
n_energy = len(energy)
|
||||
for i in range(n_energy):
|
||||
# Determine length of outgoing energy distribution and number of
|
||||
# discrete lines
|
||||
offset_e = offsets[i]
|
||||
if i < n_energy - 1:
|
||||
n = offsets[i+1] - offset_e
|
||||
else:
|
||||
n = dset_eout.shape[1] - offset_e
|
||||
m = n_discrete_lines[i]
|
||||
|
||||
# Create discrete distribution if lines are present
|
||||
if m > 0:
|
||||
x = dset_eout[0, offset_e:offset_e+m]
|
||||
p = dset_eout[1, offset_e:offset_e+m]
|
||||
eout_discrete = Discrete(x, p)
|
||||
eout_discrete.c = dset_eout[2, offset_e:offset_e+m]
|
||||
p_discrete = eout_discrete.c[-1]
|
||||
|
||||
# Create continuous distribution
|
||||
if m < n:
|
||||
interp = INTERPOLATION_SCHEME[interpolation[i]]
|
||||
|
||||
x = dset_eout[0, offset_e+m:offset_e+n]
|
||||
p = dset_eout[1, offset_e+m:offset_e+n]
|
||||
eout_continuous = Tabular(x, p, interp, ignore_negative=True)
|
||||
eout_continuous.c = dset_eout[2, offset_e+m:offset_e+n]
|
||||
|
||||
# If both continuous and discrete are present, create a mixture
|
||||
# distribution
|
||||
if m == 0:
|
||||
eout_i = eout_continuous
|
||||
elif m == n:
|
||||
eout_i = eout_discrete
|
||||
else:
|
||||
eout_i = Mixture([p_discrete, 1. - p_discrete],
|
||||
[eout_discrete, eout_continuous])
|
||||
|
||||
# Read angular distributions
|
||||
mu_i = []
|
||||
for j in range(n):
|
||||
# Determine interpolation scheme
|
||||
interp_code = int(dset_eout[3, offsets[i] + j])
|
||||
|
||||
# Determine offset and length
|
||||
offset_mu = int(dset_eout[4, offsets[i] + j])
|
||||
if offsets[i] + j < dset_eout.shape[1] - 1:
|
||||
n_mu = int(dset_eout[4, offsets[i] + j + 1]) - offset_mu
|
||||
else:
|
||||
n_mu = dset_mu.shape[1] - offset_mu
|
||||
|
||||
# Get data
|
||||
x = dset_mu[0, offset_mu:offset_mu+n_mu]
|
||||
p = dset_mu[1, offset_mu:offset_mu+n_mu]
|
||||
c = dset_mu[2, offset_mu:offset_mu+n_mu]
|
||||
|
||||
if interp_code == 0:
|
||||
mu_ij = Discrete(x, p)
|
||||
else:
|
||||
mu_ij = Tabular(x, p, INTERPOLATION_SCHEME[interp_code],
|
||||
ignore_negative=True)
|
||||
mu_ij.c = c
|
||||
mu_i.append(mu_ij)
|
||||
|
||||
offset_mu += n_mu
|
||||
|
||||
energy_out.append(eout_i)
|
||||
mu.append(mu_i)
|
||||
|
||||
return cls(energy_breakpoints, energy_interpolation,
|
||||
energy, energy_out, mu)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, idx, ldis):
|
||||
"""Generate correlated angle-energy distribution from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
idx : int
|
||||
Index in XSS array of the start of the energy distribution data
|
||||
(LDIS + LOCC - 1)
|
||||
ldis : int
|
||||
Index in XSS array of the start of the energy distribution block
|
||||
(e.g. JXS[11])
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.CorrelatedAngleEnergy
|
||||
Correlated angle-energy distribution
|
||||
|
||||
"""
|
||||
# Read number of interpolation regions and incoming energies
|
||||
n_regions = int(ace.xss[idx])
|
||||
n_energy_in = int(ace.xss[idx + 1 + 2*n_regions])
|
||||
|
||||
# Get interpolation information
|
||||
idx += 1
|
||||
if n_regions > 0:
|
||||
breakpoints = ace.xss[idx:idx + n_regions].astype(int)
|
||||
interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int)
|
||||
else:
|
||||
breakpoints = np.array([n_energy_in])
|
||||
interpolation = np.array([2])
|
||||
|
||||
# Incoming energies at which distributions exist
|
||||
idx += 2*n_regions + 1
|
||||
energy = ace.xss[idx:idx + n_energy_in]
|
||||
|
||||
# Location of distributions
|
||||
idx += n_energy_in
|
||||
loc_dist = ace.xss[idx:idx + n_energy_in].astype(int)
|
||||
|
||||
# Initialize list of distributions
|
||||
energy_out = []
|
||||
mu = []
|
||||
|
||||
# Read each outgoing energy distribution
|
||||
for i in range(n_energy_in):
|
||||
idx = ldis + loc_dist[i] - 1
|
||||
|
||||
# intt = interpolation scheme (1=hist, 2=lin-lin)
|
||||
INTTp = int(ace.xss[idx])
|
||||
intt = INTTp % 10
|
||||
n_discrete_lines = (INTTp - intt)//10
|
||||
if intt not in (1, 2):
|
||||
warn("Interpolation scheme for continuous tabular distribution "
|
||||
"is not histogram or linear-linear.")
|
||||
intt = 2
|
||||
|
||||
# Secondary energy distribution
|
||||
n_energy_out = int(ace.xss[idx + 1])
|
||||
data = ace.xss[idx + 2:idx + 2 + 4*n_energy_out]
|
||||
data.shape = (4, n_energy_out)
|
||||
|
||||
# Create continuous distribution
|
||||
eout_continuous = Tabular(data[0][n_discrete_lines:],
|
||||
data[1][n_discrete_lines:],
|
||||
INTERPOLATION_SCHEME[intt],
|
||||
ignore_negative=True)
|
||||
eout_continuous.c = data[2][n_discrete_lines:]
|
||||
if np.any(data[1][n_discrete_lines:] < 0.0):
|
||||
warn("Correlated angle-energy distribution has negative "
|
||||
"probabilities.")
|
||||
|
||||
# If discrete lines are present, create a mixture distribution
|
||||
if n_discrete_lines > 0:
|
||||
eout_discrete = Discrete(data[0][:n_discrete_lines],
|
||||
data[1][:n_discrete_lines])
|
||||
eout_discrete.c = data[2][:n_discrete_lines]
|
||||
if n_discrete_lines == n_energy_out:
|
||||
eout_i = eout_discrete
|
||||
else:
|
||||
p_discrete = min(sum(eout_discrete.p), 1.0)
|
||||
eout_i = Mixture([p_discrete, 1. - p_discrete],
|
||||
[eout_discrete, eout_continuous])
|
||||
else:
|
||||
eout_i = eout_continuous
|
||||
|
||||
energy_out.append(eout_i)
|
||||
|
||||
lc = data[3].astype(int)
|
||||
|
||||
# Secondary angular distributions
|
||||
mu_i = []
|
||||
for j in range(n_energy_out):
|
||||
if lc[j] > 0:
|
||||
idx = ldis + abs(lc[j]) - 1
|
||||
|
||||
intt = int(ace.xss[idx])
|
||||
n_cosine = int(ace.xss[idx + 1])
|
||||
data = ace.xss[idx + 2:idx + 2 + 3*n_cosine]
|
||||
data.shape = (3, n_cosine)
|
||||
|
||||
mu_ij = Tabular(data[0], data[1], INTERPOLATION_SCHEME[intt])
|
||||
mu_ij.c = data[2]
|
||||
else:
|
||||
# Isotropic distribution
|
||||
mu_ij = Uniform(-1., 1.)
|
||||
|
||||
mu_i.append(mu_ij)
|
||||
|
||||
# Add cosine distributions for this incoming energy to list
|
||||
mu.append(mu_i)
|
||||
|
||||
return cls(breakpoints, interpolation, energy, energy_out, mu)
|
||||
|
|
@ -1,101 +1,225 @@
|
|||
import itertools
|
||||
import os
|
||||
|
||||
|
||||
# Isotopic abundances from M. Berglund and M. E. Wieser, "Isotopic compositions
|
||||
# of the elements 2009 (IUPAC Technical Report)", Pure. Appl. Chem. 83 (2),
|
||||
# pp. 397--410 (2011).
|
||||
natural_abundance = {
|
||||
'H-1': 0.999885, 'H-2': 0.000115, 'He-3': 1.34e-06,
|
||||
'He-4': 0.99999866, 'Li-6': 0.0759, 'Li-7': 0.9241,
|
||||
'Be-9': 1.0, 'B-10': 0.199, 'B-11': 0.801,
|
||||
'C-12': 0.9893, 'C-13': 0.0107, 'N-14': 0.99636,
|
||||
'N-15': 0.00364, 'O-16': 0.99757, 'O-17': 0.00038,
|
||||
'O-18': 0.00205, 'F-19': 1.0, 'Ne-20': 0.9048,
|
||||
'Ne-21': 0.0027, 'Ne-22': 0.0925, 'Na-23': 1.0,
|
||||
'Mg-24': 0.7899, 'Mg-25': 0.1, 'Mg-26': 0.1101,
|
||||
'Al-27': 1.0, 'Si-28': 0.92223, 'Si-29': 0.04685,
|
||||
'Si-30': 0.03092, 'P-31': 1.0, 'S-32': 0.9499,
|
||||
'S-33': 0.0075, 'S-34': 0.0425, 'S-36': 0.0001,
|
||||
'Cl-35': 0.7576, 'Cl-37': 0.2424, 'Ar-36': 0.003336,
|
||||
'Ar-38': 0.000629, 'Ar-40': 0.996035, 'K-39': 0.932581,
|
||||
'K-40': 0.000117, 'K-41': 0.067302, 'Ca-40': 0.96941,
|
||||
'Ca-42': 0.00647, 'Ca-43': 0.00135, 'Ca-44': 0.02086,
|
||||
'Ca-46': 4e-05, 'Ca-48': 0.00187, 'Sc-45': 1.0,
|
||||
'Ti-46': 0.0825, 'Ti-47': 0.0744, 'Ti-48': 0.7372,
|
||||
'Ti-49': 0.0541, 'Ti-50': 0.0518, 'V-50': 0.0025,
|
||||
'V-51': 0.9975, 'Cr-50': 0.04345, 'Cr-52': 0.83789,
|
||||
'Cr-53': 0.09501, 'Cr-54': 0.02365, 'Mn-55': 1.0,
|
||||
'Fe-54': 0.05845, 'Fe-56': 0.91754, 'Fe-57': 0.02119,
|
||||
'Fe-58': 0.00282, 'Co-59': 1.0, 'Ni-58': 0.68077,
|
||||
'Ni-60': 0.26223, 'Ni-61': 0.011399, 'Ni-62': 0.036346,
|
||||
'Ni-64': 0.009255, 'Cu-63': 0.6915, 'Cu-65': 0.3085,
|
||||
'Zn-64': 0.4917, 'Zn-66': 0.2773, 'Zn-67': 0.0404,
|
||||
'Zn-68': 0.1845, 'Zn-70': 0.0061, 'Ga-69': 0.60108,
|
||||
'Ga-71': 0.39892, 'Ge-70': 0.2057, 'Ge-72': 0.2745,
|
||||
'Ge-73': 0.0775, 'Ge-74': 0.365, 'Ge-76': 0.0773,
|
||||
'As-75': 1.0, 'Se-74': 0.0089, 'Se-76': 0.0937,
|
||||
'Se-77': 0.0763, 'Se-78': 0.2377, 'Se-80': 0.4961,
|
||||
'Se-82': 0.0873, 'Br-79': 0.5069, 'Br-81': 0.4931,
|
||||
'Kr-78': 0.00355, 'Kr-80': 0.02286, 'Kr-82': 0.11593,
|
||||
'Kr-83': 0.115, 'Kr-84': 0.56987, 'Kr-86': 0.17279,
|
||||
'Rb-85': 0.7217, 'Rb-87': 0.2783, 'Sr-84': 0.0056,
|
||||
'Sr-86': 0.0986, 'Sr-87': 0.07, 'Sr-88': 0.8258,
|
||||
'Y-89': 1.0, 'Zr-90': 0.5145, 'Zr-91': 0.1122,
|
||||
'Zr-92': 0.1715, 'Zr-94': 0.1738, 'Zr-96': 0.028,
|
||||
'Nb-93': 1.0, 'Mo-92': 0.1453, 'Mo-94': 0.0915,
|
||||
'Mo-95': 0.1584, 'Mo-96': 0.1667, 'Mo-97': 0.096,
|
||||
'Mo-98': 0.2439, 'Mo-100': 0.0982, 'Ru-96': 0.0554,
|
||||
'Ru-98': 0.0187, 'Ru-99': 0.1276, 'Ru-100': 0.126,
|
||||
'Ru-101': 0.1706, 'Ru-102': 0.3155, 'Ru-104': 0.1862,
|
||||
'Rh-103': 1.0, 'Pd-102': 0.0102, 'Pd-104': 0.1114,
|
||||
'Pd-105': 0.2233, 'Pd-106': 0.2733, 'Pd-108': 0.2646,
|
||||
'Pd-110': 0.1172, 'Ag-107': 0.51839, 'Ag-109': 0.48161,
|
||||
'Cd-106': 0.0125, 'Cd-108': 0.0089, 'Cd-110': 0.1249,
|
||||
'Cd-111': 0.128, 'Cd-112': 0.2413, 'Cd-113': 0.1222,
|
||||
'Cd-114': 0.2873, 'Cd-116': 0.0749, 'In-113': 0.0429,
|
||||
'In-115': 0.9571, 'Sn-112': 0.0097, 'Sn-114': 0.0066,
|
||||
'Sn-115': 0.0034, 'Sn-116': 0.1454, 'Sn-117': 0.0768,
|
||||
'Sn-118': 0.2422, 'Sn-119': 0.0859, 'Sn-120': 0.3258,
|
||||
'Sn-122': 0.0463, 'Sn-124': 0.0579, 'Sb-121': 0.5721,
|
||||
'Sb-123': 0.4279, 'Te-120': 0.0009, 'Te-122': 0.0255,
|
||||
'Te-123': 0.0089, 'Te-124': 0.0474, 'Te-125': 0.0707,
|
||||
'Te-126': 0.1884, 'Te-128': 0.3174, 'Te-130': 0.3408,
|
||||
'I-127': 1.0, 'Xe-124': 0.000952, 'Xe-126': 0.00089,
|
||||
'Xe-128': 0.019102, 'Xe-129': 0.264006, 'Xe-130': 0.04071,
|
||||
'Xe-131': 0.212324, 'Xe-132': 0.269086, 'Xe-134': 0.104357,
|
||||
'Xe-136': 0.088573, 'Cs-133': 1.0, 'Ba-130': 0.00106,
|
||||
'Ba-132': 0.00101, 'Ba-134': 0.02417, 'Ba-135': 0.06592,
|
||||
'Ba-136': 0.07854, 'Ba-137': 0.11232, 'Ba-138': 0.71698,
|
||||
'La-138': 0.0008881, 'La-139': 0.9991119, 'Ce-136': 0.00185,
|
||||
'Ce-138': 0.00251, 'Ce-140': 0.8845, 'Ce-142': 0.11114,
|
||||
'Pr-141': 1.0, 'Nd-142': 0.27152, 'Nd-143': 0.12174,
|
||||
'Nd-144': 0.23798, 'Nd-145': 0.08293, 'Nd-146': 0.17189,
|
||||
'Nd-148': 0.05756, 'Nd-150': 0.05638, 'Sm-144': 0.0307,
|
||||
'Sm-147': 0.1499, 'Sm-148': 0.1124, 'Sm-149': 0.1382,
|
||||
'Sm-150': 0.0738, 'Sm-152': 0.2675, 'Sm-154': 0.2275,
|
||||
'Eu-151': 0.4781, 'Eu-153': 0.5219, 'Gd-152': 0.002,
|
||||
'Gd-154': 0.0218, 'Gd-155': 0.148, 'Gd-156': 0.2047,
|
||||
'Gd-157': 0.1565, 'Gd-158': 0.2484, 'Gd-160': 0.2186,
|
||||
'Tb-159': 1.0, 'Dy-156': 0.00056, 'Dy-158': 0.00095,
|
||||
'Dy-160': 0.02329, 'Dy-161': 0.18889, 'Dy-162': 0.25475,
|
||||
'Dy-163': 0.24896, 'Dy-164': 0.2826, 'Ho-165': 1.0,
|
||||
'Er-162': 0.00139, 'Er-164': 0.01601, 'Er-166': 0.33503,
|
||||
'Er-167': 0.22869, 'Er-168': 0.26978, 'Er-170': 0.1491,
|
||||
'Tm-169': 1.0, 'Yb-168': 0.00123, 'Yb-170': 0.02982,
|
||||
'Yb-171': 0.1409, 'Yb-172': 0.2168, 'Yb-173': 0.16103,
|
||||
'Yb-174': 0.32026, 'Yb-176': 0.12996, 'Lu-175': 0.97401,
|
||||
'Lu-176': 0.02599, 'Hf-174': 0.0016, 'Hf-176': 0.0526,
|
||||
'Hf-177': 0.186, 'Hf-178': 0.2728, 'Hf-179': 0.1362,
|
||||
'Hf-180': 0.3508, 'Ta-180': 0.0001201, 'Ta-181': 0.9998799,
|
||||
'W-180': 0.0012, 'W-182': 0.265, 'W-183': 0.1431,
|
||||
'W-184': 0.3064, 'W-186': 0.2843, 'Re-185': 0.374,
|
||||
'Re-187': 0.626, 'Os-184': 0.0002, 'Os-186': 0.0159,
|
||||
'Os-187': 0.0196, 'Os-188': 0.1324, 'Os-189': 0.1615,
|
||||
'Os-190': 0.2626, 'Os-192': 0.4078, 'Ir-191': 0.373,
|
||||
'Ir-193': 0.627, 'Pt-190': 0.00012, 'Pt-192': 0.00782,
|
||||
'Pt-194': 0.3286, 'Pt-195': 0.3378, 'Pt-196': 0.2521,
|
||||
'Pt-198': 0.07356, 'Au-197': 1.0, 'Hg-196': 0.0015,
|
||||
'Hg-198': 0.0997, 'Hg-199': 0.1687, 'Hg-200': 0.231,
|
||||
'Hg-201': 0.1318, 'Hg-202': 0.2986, 'Hg-204': 0.0687,
|
||||
'Tl-203': 0.2952, 'Tl-205': 0.7048, 'Pb-204': 0.014,
|
||||
'Pb-206': 0.241, 'Pb-207': 0.221, 'Pb-208': 0.524,
|
||||
'Bi-209': 1.0, 'Th-232': 1.0, 'Pa-231': 1.0,
|
||||
'U-234': 5.4e-05, 'U-235': 0.007204, 'U-238': 0.992742
|
||||
NATURAL_ABUNDANCE = {
|
||||
'H1': 0.999885, 'H2': 0.000115, 'He3': 1.34e-06,
|
||||
'He4': 0.99999866, 'Li6': 0.0759, 'Li7': 0.9241,
|
||||
'Be9': 1.0, 'B10': 0.199, 'B11': 0.801,
|
||||
'C12': 0.9893, 'C13': 0.0107, 'N14': 0.99636,
|
||||
'N15': 0.00364, 'O16': 0.99757, 'O17': 0.00038,
|
||||
'O18': 0.00205, 'F19': 1.0, 'Ne20': 0.9048,
|
||||
'Ne21': 0.0027, 'Ne22': 0.0925, 'Na23': 1.0,
|
||||
'Mg24': 0.7899, 'Mg25': 0.1, 'Mg26': 0.1101,
|
||||
'Al27': 1.0, 'Si28': 0.92223, 'Si29': 0.04685,
|
||||
'Si30': 0.03092, 'P31': 1.0, 'S32': 0.9499,
|
||||
'S33': 0.0075, 'S34': 0.0425, 'S36': 0.0001,
|
||||
'Cl35': 0.7576, 'Cl37': 0.2424, 'Ar36': 0.003336,
|
||||
'Ar38': 0.000629, 'Ar40': 0.996035, 'K39': 0.932581,
|
||||
'K40': 0.000117, 'K41': 0.067302, 'Ca40': 0.96941,
|
||||
'Ca42': 0.00647, 'Ca43': 0.00135, 'Ca44': 0.02086,
|
||||
'Ca46': 4e-05, 'Ca48': 0.00187, 'Sc45': 1.0,
|
||||
'Ti46': 0.0825, 'Ti47': 0.0744, 'Ti48': 0.7372,
|
||||
'Ti49': 0.0541, 'Ti50': 0.0518, 'V50': 0.0025,
|
||||
'V51': 0.9975, 'Cr50': 0.04345, 'Cr52': 0.83789,
|
||||
'Cr53': 0.09501, 'Cr54': 0.02365, 'Mn55': 1.0,
|
||||
'Fe54': 0.05845, 'Fe56': 0.91754, 'Fe57': 0.02119,
|
||||
'Fe58': 0.00282, 'Co59': 1.0, 'Ni58': 0.68077,
|
||||
'Ni60': 0.26223, 'Ni61': 0.011399, 'Ni62': 0.036346,
|
||||
'Ni64': 0.009255, 'Cu63': 0.6915, 'Cu65': 0.3085,
|
||||
'Zn64': 0.4917, 'Zn66': 0.2773, 'Zn67': 0.0404,
|
||||
'Zn68': 0.1845, 'Zn70': 0.0061, 'Ga69': 0.60108,
|
||||
'Ga71': 0.39892, 'Ge70': 0.2057, 'Ge72': 0.2745,
|
||||
'Ge73': 0.0775, 'Ge74': 0.365, 'Ge76': 0.0773,
|
||||
'As75': 1.0, 'Se74': 0.0089, 'Se76': 0.0937,
|
||||
'Se77': 0.0763, 'Se78': 0.2377, 'Se80': 0.4961,
|
||||
'Se82': 0.0873, 'Br79': 0.5069, 'Br81': 0.4931,
|
||||
'Kr78': 0.00355, 'Kr80': 0.02286, 'Kr82': 0.11593,
|
||||
'Kr83': 0.115, 'Kr84': 0.56987, 'Kr86': 0.17279,
|
||||
'Rb85': 0.7217, 'Rb87': 0.2783, 'Sr84': 0.0056,
|
||||
'Sr86': 0.0986, 'Sr87': 0.07, 'Sr88': 0.8258,
|
||||
'Y89': 1.0, 'Zr90': 0.5145, 'Zr91': 0.1122,
|
||||
'Zr92': 0.1715, 'Zr94': 0.1738, 'Zr96': 0.028,
|
||||
'Nb93': 1.0, 'Mo92': 0.1453, 'Mo94': 0.0915,
|
||||
'Mo95': 0.1584, 'Mo96': 0.1667, 'Mo97': 0.096,
|
||||
'Mo98': 0.2439, 'Mo100': 0.0982, 'Ru96': 0.0554,
|
||||
'Ru98': 0.0187, 'Ru99': 0.1276, 'Ru100': 0.126,
|
||||
'Ru101': 0.1706, 'Ru102': 0.3155, 'Ru104': 0.1862,
|
||||
'Rh103': 1.0, 'Pd102': 0.0102, 'Pd104': 0.1114,
|
||||
'Pd105': 0.2233, 'Pd106': 0.2733, 'Pd108': 0.2646,
|
||||
'Pd110': 0.1172, 'Ag107': 0.51839, 'Ag109': 0.48161,
|
||||
'Cd106': 0.0125, 'Cd108': 0.0089, 'Cd110': 0.1249,
|
||||
'Cd111': 0.128, 'Cd112': 0.2413, 'Cd113': 0.1222,
|
||||
'Cd114': 0.2873, 'Cd116': 0.0749, 'In113': 0.0429,
|
||||
'In115': 0.9571, 'Sn112': 0.0097, 'Sn114': 0.0066,
|
||||
'Sn115': 0.0034, 'Sn116': 0.1454, 'Sn117': 0.0768,
|
||||
'Sn118': 0.2422, 'Sn119': 0.0859, 'Sn120': 0.3258,
|
||||
'Sn122': 0.0463, 'Sn124': 0.0579, 'Sb121': 0.5721,
|
||||
'Sb123': 0.4279, 'Te120': 0.0009, 'Te122': 0.0255,
|
||||
'Te123': 0.0089, 'Te124': 0.0474, 'Te125': 0.0707,
|
||||
'Te126': 0.1884, 'Te128': 0.3174, 'Te130': 0.3408,
|
||||
'I127': 1.0, 'Xe124': 0.000952, 'Xe126': 0.00089,
|
||||
'Xe128': 0.019102, 'Xe129': 0.264006, 'Xe130': 0.04071,
|
||||
'Xe131': 0.212324, 'Xe132': 0.269086, 'Xe134': 0.104357,
|
||||
'Xe136': 0.088573, 'Cs133': 1.0, 'Ba130': 0.00106,
|
||||
'Ba132': 0.00101, 'Ba134': 0.02417, 'Ba135': 0.06592,
|
||||
'Ba136': 0.07854, 'Ba137': 0.11232, 'Ba138': 0.71698,
|
||||
'La138': 0.0008881, 'La139': 0.9991119, 'Ce136': 0.00185,
|
||||
'Ce138': 0.00251, 'Ce140': 0.8845, 'Ce142': 0.11114,
|
||||
'Pr141': 1.0, 'Nd142': 0.27152, 'Nd143': 0.12174,
|
||||
'Nd144': 0.23798, 'Nd145': 0.08293, 'Nd146': 0.17189,
|
||||
'Nd148': 0.05756, 'Nd150': 0.05638, 'Sm144': 0.0307,
|
||||
'Sm147': 0.1499, 'Sm148': 0.1124, 'Sm149': 0.1382,
|
||||
'Sm150': 0.0738, 'Sm152': 0.2675, 'Sm154': 0.2275,
|
||||
'Eu151': 0.4781, 'Eu153': 0.5219, 'Gd152': 0.002,
|
||||
'Gd154': 0.0218, 'Gd155': 0.148, 'Gd156': 0.2047,
|
||||
'Gd157': 0.1565, 'Gd158': 0.2484, 'Gd160': 0.2186,
|
||||
'Tb159': 1.0, 'Dy156': 0.00056, 'Dy158': 0.00095,
|
||||
'Dy160': 0.02329, 'Dy161': 0.18889, 'Dy162': 0.25475,
|
||||
'Dy163': 0.24896, 'Dy164': 0.2826, 'Ho165': 1.0,
|
||||
'Er162': 0.00139, 'Er164': 0.01601, 'Er166': 0.33503,
|
||||
'Er167': 0.22869, 'Er168': 0.26978, 'Er170': 0.1491,
|
||||
'Tm169': 1.0, 'Yb168': 0.00123, 'Yb170': 0.02982,
|
||||
'Yb171': 0.1409, 'Yb172': 0.2168, 'Yb173': 0.16103,
|
||||
'Yb174': 0.32026, 'Yb176': 0.12996, 'Lu175': 0.97401,
|
||||
'Lu176': 0.02599, 'Hf174': 0.0016, 'Hf176': 0.0526,
|
||||
'Hf177': 0.186, 'Hf178': 0.2728, 'Hf179': 0.1362,
|
||||
'Hf180': 0.3508, 'Ta180': 0.0001201, 'Ta181': 0.9998799,
|
||||
'W180': 0.0012, 'W182': 0.265, 'W183': 0.1431,
|
||||
'W184': 0.3064, 'W186': 0.2843, 'Re185': 0.374,
|
||||
'Re187': 0.626, 'Os184': 0.0002, 'Os186': 0.0159,
|
||||
'Os187': 0.0196, 'Os188': 0.1324, 'Os189': 0.1615,
|
||||
'Os190': 0.2626, 'Os192': 0.4078, 'Ir191': 0.373,
|
||||
'Ir193': 0.627, 'Pt190': 0.00012, 'Pt192': 0.00782,
|
||||
'Pt194': 0.3286, 'Pt195': 0.3378, 'Pt196': 0.2521,
|
||||
'Pt198': 0.07356, 'Au197': 1.0, 'Hg196': 0.0015,
|
||||
'Hg198': 0.0997, 'Hg199': 0.1687, 'Hg200': 0.231,
|
||||
'Hg201': 0.1318, 'Hg202': 0.2986, 'Hg204': 0.0687,
|
||||
'Tl203': 0.2952, 'Tl205': 0.7048, 'Pb204': 0.014,
|
||||
'Pb206': 0.241, 'Pb207': 0.221, 'Pb208': 0.524,
|
||||
'Bi209': 1.0, 'Th232': 1.0, 'Pa231': 1.0,
|
||||
'U234': 5.4e-05, 'U235': 0.007204, 'U238': 0.992742
|
||||
}
|
||||
|
||||
ATOMIC_SYMBOL = {1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N',
|
||||
8: 'O', 9: 'F', 10: 'Ne', 11: 'Na', 12: 'Mg', 13: 'Al',
|
||||
14: 'Si', 15: 'P', 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K',
|
||||
20: 'Ca', 21: 'Sc', 22: 'Ti', 23: 'V', 24: 'Cr', 25: 'Mn',
|
||||
26: 'Fe', 27: 'Co', 28: 'Ni', 29: 'Cu', 30: 'Zn', 31: 'Ga',
|
||||
32: 'Ge', 33: 'As', 34: 'Se', 35: 'Br', 36: 'Kr', 37: 'Rb',
|
||||
38: 'Sr', 39: 'Y', 40: 'Zr', 41: 'Nb', 42: 'Mo', 43: 'Tc',
|
||||
44: 'Ru', 45: 'Rh', 46: 'Pd', 47: 'Ag', 48: 'Cd', 49: 'In',
|
||||
50: 'Sn', 51: 'Sb', 52: 'Te', 53: 'I', 54: 'Xe', 55: 'Cs',
|
||||
56: 'Ba', 57: 'La', 58: 'Ce', 59: 'Pr', 60: 'Nd', 61: 'Pm',
|
||||
62: 'Sm', 63: 'Eu', 64: 'Gd', 65: 'Tb', 66: 'Dy', 67: 'Ho',
|
||||
68: 'Er', 69: 'Tm', 70: 'Yb', 71: 'Lu', 72: 'Hf', 73: 'Ta',
|
||||
74: 'W', 75: 'Re', 76: 'Os', 77: 'Ir', 78: 'Pt', 79: 'Au',
|
||||
80: 'Hg', 81: 'Tl', 82: 'Pb', 83: 'Bi', 84: 'Po', 85: 'At',
|
||||
86: 'Rn', 87: 'Fr', 88: 'Ra', 89: 'Ac', 90: 'Th', 91: 'Pa',
|
||||
92: 'U', 93: 'Np', 94: 'Pu', 95: 'Am', 96: 'Cm', 97: 'Bk',
|
||||
98: 'Cf', 99: 'Es', 100: 'Fm', 101: 'Md', 102: 'No',
|
||||
103: 'Lr', 104: 'Rf', 105: 'Db', 106: 'Sg', 107: 'Bh',
|
||||
108: 'Hs', 109: 'Mt', 110: 'Ds', 111: 'Rg', 112: 'Cn',
|
||||
113: 'Nh', 114: 'Fl', 115: 'Mc', 116: 'Lv', 117: 'Ts',
|
||||
118: 'Og'}
|
||||
ATOMIC_NUMBER = {value: key for key, value in ATOMIC_SYMBOL.items()}
|
||||
|
||||
_ATOMIC_MASS = {}
|
||||
|
||||
REACTION_NAME = {1: '(n,total)', 2: '(n,elastic)', 4: '(n,level)',
|
||||
5: '(n,misc)', 11: '(n,2nd)', 16: '(n,2n)', 17: '(n,3n)',
|
||||
18: '(n,fission)', 19: '(n,f)', 20: '(n,nf)', 21: '(n,2nf)',
|
||||
22: '(n,na)', 23: '(n,n3a)', 24: '(n,2na)', 25: '(n,3na)',
|
||||
27: '(n,absorption)', 28: '(n,np)', 29: '(n,n2a)',
|
||||
30: '(n,2n2a)', 32: '(n,nd)', 33: '(n,nt)', 34: '(n,nHe-3)',
|
||||
35: '(n,nd2a)', 36: '(n,nt2a)', 37: '(n,4n)', 38: '(n,3nf)',
|
||||
41: '(n,2np)', 42: '(n,3np)', 44: '(n,n2p)', 45: '(n,npa)',
|
||||
91: '(n,nc)', 101: '(n,disappear)', 102: '(n,gamma)',
|
||||
103: '(n,p)', 104: '(n,d)', 105: '(n,t)', 106: '(n,3He)',
|
||||
107: '(n,a)', 108: '(n,2a)', 109: '(n,3a)', 111: '(n,2p)',
|
||||
112: '(n,pa)', 113: '(n,t2a)', 114: '(n,d2a)', 115: '(n,pd)',
|
||||
116: '(n,pt)', 117: '(n,da)', 152: '(n,5n)', 153: '(n,6n)',
|
||||
154: '(n,2nt)', 155: '(n,ta)', 156: '(n,4np)', 157: '(n,3nd)',
|
||||
158: '(n,nda)', 159: '(n,2npa)', 160: '(n,7n)', 161: '(n,8n)',
|
||||
162: '(n,5np)', 163: '(n,6np)', 164: '(n,7np)', 165: '(n,4na)',
|
||||
166: '(n,5na)', 167: '(n,6na)', 168: '(n,7na)', 169: '(n,4nd)',
|
||||
170: '(n,5nd)', 171: '(n,6nd)', 172: '(n,3nt)', 173: '(n,4nt)',
|
||||
174: '(n,5nt)', 175: '(n,6nt)', 176: '(n,2n3He)',
|
||||
177: '(n,3n3He)', 178: '(n,4n3He)', 179: '(n,3n2p)',
|
||||
180: '(n,3n3a)', 181: '(n,3npa)', 182: '(n,dt)',
|
||||
183: '(n,npd)', 184: '(n,npt)', 185: '(n,ndt)',
|
||||
186: '(n,np3He)', 187: '(n,nd3He)', 188: '(n,nt3He)',
|
||||
189: '(n,nta)', 190: '(n,2n2p)', 191: '(n,p3He)',
|
||||
192: '(n,d3He)', 193: '(n,3Hea)', 194: '(n,4n2p)',
|
||||
195: '(n,4n2a)', 196: '(n,4npa)', 197: '(n,3p)',
|
||||
198: '(n,n3p)', 199: '(n,3n2pa)', 200: '(n,5n2p)', 444: '(n,damage)',
|
||||
649: '(n,pc)', 699: '(n,dc)', 749: '(n,tc)', 799: '(n,3Hec)',
|
||||
849: '(n,ac)'}
|
||||
REACTION_NAME.update({i: '(n,n{})'.format(i-50) for i in range(50, 91)})
|
||||
REACTION_NAME.update({i: '(n,p{})'.format(i-600) for i in range(600, 649)})
|
||||
REACTION_NAME.update({i: '(n,d{})'.format(i-650) for i in range(650, 699)})
|
||||
REACTION_NAME.update({i: '(n,t{})'.format(i-700) for i in range(700, 749)})
|
||||
REACTION_NAME.update({i: '(n,3He{})'.format(i-750) for i in range(750, 799)})
|
||||
REACTION_NAME.update({i: '(n,a{})'.format(i-800) for i in range(800, 849)})
|
||||
|
||||
SUM_RULES = {1: [2, 3],
|
||||
3: [4, 5, 11, 16, 17, 22, 23, 24, 25, 27, 28, 29, 30, 32, 33, 34, 35,
|
||||
36, 37, 41, 42, 44, 45, 152, 153, 154, 156, 157, 158, 159, 160,
|
||||
161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
|
||||
173, 174, 175, 176, 177, 178, 179, 180, 181, 183, 184, 185,
|
||||
186, 187, 188, 189, 190, 194, 195, 196, 198, 199, 200],
|
||||
4: list(range(50, 92)),
|
||||
16: list(range(875, 892)),
|
||||
18: [19, 20, 21, 38],
|
||||
27: [18, 101],
|
||||
101: [102, 103, 104, 105, 106, 107, 108, 109, 111, 112, 113, 114,
|
||||
115, 116, 117, 155, 182, 191, 192, 193, 197],
|
||||
103: list(range(600, 650)),
|
||||
104: list(range(650, 700)),
|
||||
105: list(range(700, 750)),
|
||||
106: list(range(750, 800)),
|
||||
107: list(range(800, 850))}
|
||||
|
||||
|
||||
def atomic_mass(isotope):
|
||||
"""Return atomic mass of isotope in atomic mass units.
|
||||
|
||||
Atomic mass data comes from the Atomic Mass Evaluation 2012, published in
|
||||
Chinese Physics C 36 (2012), 1287--1602.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
isotope : str
|
||||
Name of isotope, e.g. 'Pu239'
|
||||
|
||||
Returns
|
||||
-------
|
||||
float or None
|
||||
Atomic mass of isotope in atomic mass units. If the isotope listed does
|
||||
not have a known atomic mass, None is returned.
|
||||
|
||||
"""
|
||||
if not _ATOMIC_MASS:
|
||||
# Load data from AME2012 file
|
||||
mass_file = os.path.join(os.path.dirname(__file__), 'mass.mas12')
|
||||
with open(mass_file, 'r') as ame:
|
||||
# Read lines in file starting at line 40
|
||||
for line in itertools.islice(ame, 40, None):
|
||||
name = '{}{}'.format(line[20:22].strip(), int(line[16:19]))
|
||||
mass = float(line[96:99]) + 1e-6*float(
|
||||
line[100:106] + '.' + line[107:112])
|
||||
_ATOMIC_MASS[name.lower()] = mass
|
||||
|
||||
# Get rid of metastable information
|
||||
if '_' in isotope:
|
||||
isotope = isotope[:isotope.find('_')]
|
||||
|
||||
return _ATOMIC_MASS.get(isotope.lower())
|
||||
|
||||
# The value of the Boltzman constant in units of MeV / K
|
||||
# Values here are from the Committee on Data for Science and Technology
|
||||
# (CODATA) 2010 recommendation (doi:10.1103/RevModPhys.84.1527).
|
||||
K_BOLTZMANN = 8.6173324E-11
|
||||
|
|
|
|||
44
openmc/data/endf_utils.py
Normal file
44
openmc/data/endf_utils.py
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
"""This module contains a few utility functions for reading ENDF_ data. It is by
|
||||
no means enough to read an entire ENDF file. For a more complete ENDF reader,
|
||||
see Pyne_.
|
||||
|
||||
.. _ENDF: http://www.nndc.bnl.gov/endf
|
||||
.. _Pyne: http://www.pyne.io
|
||||
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
def read_float(float_string):
|
||||
"""Parse ENDF 6E11.0 formatted string into a float."""
|
||||
assert len(float_string) == 11
|
||||
pattern = r'([\s\-]\d+\.\d+)([\+\-]\d+)'
|
||||
return float(re.sub(pattern, r'\1e\2', float_string))
|
||||
|
||||
|
||||
def read_CONT_line(line):
|
||||
"""Parse 80-column line from ENDF CONT record into floats and ints."""
|
||||
return (read_float(line[0:11]), read_float(line[11:22]), int(line[22:33]),
|
||||
int(line[33:44]), int(line[44:55]), int(line[55:66]),
|
||||
int(line[66:70]), int(line[70:72]), int(line[72:75]),
|
||||
int(line[75:80]))
|
||||
|
||||
|
||||
def identify_nuclide(fname):
|
||||
"""Read the header of an ENDF file and extract identifying information."""
|
||||
with open(fname, 'r') as fh:
|
||||
# Skip the tape id (TPID).
|
||||
line = fh.readline()
|
||||
|
||||
# Read the first HEAD and CONT info.
|
||||
line = fh.readline()
|
||||
ZA, AW, LRP, LFI, NLIB, NMOD, MAT, MF, MT, NS = read_CONT_line(line)
|
||||
line = fh.readline()
|
||||
ELIS, STA, LIS, LISO, junk, NFOR, MAT, MF, MT, NS = read_CONT_line(line)
|
||||
|
||||
# Return dictionary of the most important identifying information.
|
||||
return {'Z': int(ZA) // 1000,
|
||||
'A': int(ZA) % 1000,
|
||||
'LFI': bool(LFI),
|
||||
'LIS': LIS,
|
||||
'LISO': LISO}
|
||||
1084
openmc/data/energy_distribution.py
Normal file
1084
openmc/data/energy_distribution.py
Normal file
File diff suppressed because it is too large
Load diff
593
openmc/data/fission_energy.py
Normal file
593
openmc/data/fission_energy.py
Normal file
|
|
@ -0,0 +1,593 @@
|
|||
from collections import Callable
|
||||
from copy import deepcopy
|
||||
import sys
|
||||
|
||||
import h5py
|
||||
import numpy as np
|
||||
|
||||
from .data import ATOMIC_SYMBOL
|
||||
from .endf_utils import read_float, read_CONT_line, identify_nuclide
|
||||
from .function import Function1D, Tabulated1D, Polynomial, Sum
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.mixin import EqualityMixin
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
|
||||
def _extract_458_data(filename):
|
||||
"""Read an ENDF file and extract the MF=1, MT=458 values.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Path to and ENDF file
|
||||
|
||||
Returns
|
||||
-------
|
||||
value : dict of str to list of float
|
||||
Dictionary that gives lists of coefficients for each energy component.
|
||||
The keys are the 2-3 letter strings used in ENDF-102, e.g. 'EFR' and
|
||||
'ET'. The list will have a length of 1 for Sher-Beck data, more for
|
||||
polynomial data.
|
||||
uncertainty : dict of str to list of float
|
||||
A dictionary with the same format as above. This is probably a
|
||||
one-standard deviation value, but that is not specified explicitly in
|
||||
ENDF-102. Also, some evaluations will give zero uncertainty. Use with
|
||||
caution.
|
||||
|
||||
"""
|
||||
ident = identify_nuclide(filename)
|
||||
|
||||
if not ident['LFI']:
|
||||
# This nuclide isn't fissionable.
|
||||
return None
|
||||
|
||||
# Extract the MF=1, MT=458 section.
|
||||
lines = []
|
||||
with open(filename, 'r') as fh:
|
||||
line = fh.readline()
|
||||
while line != '':
|
||||
if line[70:75] == ' 1458':
|
||||
lines.append(line)
|
||||
line = fh.readline()
|
||||
|
||||
if len(lines) == 0:
|
||||
# No 458 data here.
|
||||
return None
|
||||
|
||||
# Read the number of coefficients in this LIST record.
|
||||
NPL = read_CONT_line(lines[1])[4]
|
||||
|
||||
# Parse the ENDF LIST into an array.
|
||||
data = []
|
||||
for i in range(NPL):
|
||||
row, column = divmod(i, 6)
|
||||
data.append(read_float(lines[2 + row][11*column:11*(column+1)]))
|
||||
|
||||
# Declare the coefficient names and the order they are given in. The LIST
|
||||
# contains a value followed immediately by an uncertainty for each of these
|
||||
# components, times the polynomial order + 1.
|
||||
labels = ('EFR', 'ENP', 'END', 'EGP', 'EGD', 'EB', 'ENU', 'ER', 'ET')
|
||||
|
||||
# Associate each set of values and uncertainties with its label.
|
||||
value = {}
|
||||
uncertainty = {}
|
||||
for i, label in enumerate(labels):
|
||||
value[label] = data[2*i::18]
|
||||
uncertainty[label] = data[2*i + 1::18]
|
||||
|
||||
# In ENDF/B-7.1, data for 2nd-order coefficients were mistakenly not
|
||||
# converted from MeV to eV. Check for this error and fix it if present.
|
||||
n_coeffs = len(value['EFR'])
|
||||
if n_coeffs == 3: # Only check 2nd-order data.
|
||||
# Check each energy component for the error. If a 1 MeV neutron
|
||||
# causes a change of more than 100 MeV, we know something is wrong.
|
||||
error_present = False
|
||||
for coeffs in value.values():
|
||||
second_order = coeffs[2]
|
||||
if abs(second_order) * 1e12 > 1e8:
|
||||
error_present = True
|
||||
break
|
||||
|
||||
# If we found the error, reduce all 2nd-order coeffs by 10**6.
|
||||
if error_present:
|
||||
for coeffs in value.values(): coeffs[2] *= 1e-6
|
||||
for coeffs in uncertainty.values(): coeffs[2] *= 1e-6
|
||||
|
||||
# Convert eV to MeV.
|
||||
for coeffs in value.values():
|
||||
for i in range(len(coeffs)):
|
||||
coeffs[i] *= 10**(-6 + 6*i)
|
||||
for coeffs in uncertainty.values():
|
||||
for i in range(len(coeffs)):
|
||||
coeffs[i] *= 10**(-6 + 6*i)
|
||||
|
||||
return value, uncertainty
|
||||
|
||||
|
||||
def write_compact_458_library(endf_files, output_name='fission_Q_data.h5',
|
||||
comment=None, verbose=False):
|
||||
"""Read ENDF files, strip the MF=1 MT=458 data and write to small HDF5.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
endf_files : Collection of str
|
||||
Strings giving the paths to the ENDF files that will be parsed for data.
|
||||
output_name : str
|
||||
Name of the output HDF5 file. Default is 'fission_Q_data.h5'.
|
||||
comment : str
|
||||
Comment to write in the output HDF5 file. Defaults to no comment.
|
||||
verbose : bool
|
||||
If True, print the name of each isomer as it is read. Defaults to
|
||||
False.
|
||||
|
||||
"""
|
||||
# Open the output file.
|
||||
out = h5py.File(output_name, 'w', libver='latest')
|
||||
|
||||
# Write comments, if given. This commented out comment is the one used for
|
||||
# the library distributed with OpenMC.
|
||||
#comment = ('This data is extracted from ENDF/B-VII.1 library. Thanks '
|
||||
# 'evaluators, for all your hard work :) Citation: '
|
||||
# 'M. B. Chadwick, M. Herman, P. Oblozinsky, '
|
||||
# 'M. E. Dunn, Y. Danon, A. C. Kahler, D. L. Smith, '
|
||||
# 'B. Pritychenko, G. Arbanas, R. Arcilla, R. Brewer, '
|
||||
# 'D. A. Brown, R. Capote, A. D. Carlson, Y. S. Cho, H. Derrien, '
|
||||
# 'K. Guber, G. M. Hale, S. Hoblit, S. Holloway, T. D. Johnson, '
|
||||
# 'T. Kawano, B. C. Kiedrowski, H. Kim, S. Kunieda, '
|
||||
# 'N. M. Larson, L. Leal, J. P. Lestone, R. C. Little, '
|
||||
# 'E. A. McCutchan, R. E. MacFarlane, M. MacInnes, '
|
||||
# 'C. M. Mattoon, R. D. McKnight, S. F. Mughabghab, '
|
||||
# 'G. P. A. Nobre, G. Palmiotti, A. Palumbo, M. T. Pigni, '
|
||||
# 'V. G. Pronyaev, R. O. Sayer, A. A. Sonzogni, N. C. Summers, '
|
||||
# 'P. Talou, I. J. Thompson, A. Trkov, R. L. Vogt, '
|
||||
# 'S. C. van der Marck, A. Wallner, M. C. White, D. Wiarda, '
|
||||
# 'and P. G. Young. ENDF/B-VII.1 nuclear data for science and '
|
||||
# 'technology: Cross sections, covariances, fission product '
|
||||
# 'yields and decay data", Nuclear Data Sheets, '
|
||||
# '112(12):2887-2996 (2011).')
|
||||
if comment is not None:
|
||||
out.attrs['comment'] = np.string_(comment)
|
||||
|
||||
# Declare the order of the components. Use fixed-length numpy strings
|
||||
# because they work well with h5py.
|
||||
labels = np.array(('EFR', 'ENP', 'END', 'EGP', 'EGD', 'EB', 'ENU', 'ER',
|
||||
'ET'), dtype='S3')
|
||||
out.attrs['component order'] = labels
|
||||
|
||||
# Iterate over the given files.
|
||||
if verbose: print('Reading ENDF files:')
|
||||
for fname in endf_files:
|
||||
if verbose: print(fname)
|
||||
|
||||
ident = identify_nuclide(fname)
|
||||
|
||||
# Skip non-fissionable nuclides.
|
||||
if not ident['LFI']: continue
|
||||
|
||||
# Get the important bits.
|
||||
data = _extract_458_data(fname)
|
||||
if data is None: continue
|
||||
value, uncertainty = data
|
||||
|
||||
# Make a group for this isomer.
|
||||
name = ATOMIC_SYMBOL[ident['Z']] + str(ident['A'])
|
||||
if ident['LISO'] != 0:
|
||||
name += '_m' + str(ident['LISO'])
|
||||
nuclide_group = out.create_group(name)
|
||||
|
||||
# Write all the coefficients into one array. The first dimension gives
|
||||
# the component (e.g. fragments or prompt neutrons); the second switches
|
||||
# between value and uncertainty; the third gives the polynomial order.
|
||||
n_coeffs = len(value['EFR'])
|
||||
data_out = np.zeros((len(labels), 2, n_coeffs))
|
||||
for i, label in enumerate(labels):
|
||||
data_out[i, 0, :] = value[label.decode()]
|
||||
data_out[i, 1, :] = uncertainty[label.decode()]
|
||||
nuclide_group.create_dataset('data', data=data_out)
|
||||
|
||||
out.close()
|
||||
|
||||
|
||||
class FissionEnergyRelease(EqualityMixin):
|
||||
"""Energy relased by fission reactions.
|
||||
|
||||
Energy is carried away from fission reactions by many different particles.
|
||||
The attributes of this class specify how much energy is released in the form
|
||||
of fission fragments, neutrons, photons, etc. Each component is also (in
|
||||
general) a function of the incident neutron energy.
|
||||
|
||||
Following a fission reaction, most of the energy release is carried by the
|
||||
daughter nuclei fragments. These fragments accelerate apart from the
|
||||
Coulomb force on the time scale of ~10^-20 s [1]. Those fragments emit
|
||||
prompt neutrons between ~10^-18 and ~10^-13 s after scission (although some
|
||||
prompt neutrons may come directly from the scission point) [1]. Prompt
|
||||
photons follow with a time scale of ~10^-14 to ~10^-7 s [1]. The fission
|
||||
products then emit delayed neutrons with half lives between 0.1 and 100 s.
|
||||
The remaining fission energy comes from beta decays of the fission products
|
||||
which release beta particles, photons, and neutrinos (that escape the
|
||||
reactor and do not produce usable heat).
|
||||
|
||||
Use the class methods to instantiate this class from an HDF5 or ENDF
|
||||
dataset. The :meth:`FissionEnergyRelease.from_hdf5` method builds this
|
||||
class from the usual OpenMC HDF5 data files.
|
||||
:meth:`FissionEnergyRelease.from_endf` uses ENDF-formatted data.
|
||||
:meth:`FissionEnergyRelease.from_compact_hdf5` uses a different HDF5 format
|
||||
that is meant to be compact and store the exact same data as the ENDF
|
||||
format. Files with this format can be generated with the
|
||||
:func:`openmc.data.write_compact_458_library` function.
|
||||
|
||||
References
|
||||
----------
|
||||
[1] D. G. Madland, "Total prompt energy release in the neutron-induced
|
||||
fission of ^235U, ^238U, and ^239Pu", Nuclear Physics A 772:113--137 (2006).
|
||||
<http://dx.doi.org/10.1016/j.nuclphysa.2006.03.013>
|
||||
|
||||
Attributes
|
||||
----------
|
||||
fragments : Callable
|
||||
Function that accepts incident neutron energy value(s) and returns the
|
||||
kinetic energy of the fission daughter nuclides (after prompt neutron
|
||||
emission).
|
||||
prompt_neutrons : Callable
|
||||
Function of energy that returns the kinetic energy of prompt fission
|
||||
neutrons.
|
||||
delayed_neutrons : Callable
|
||||
Function of energy that returns the kinetic energy of delayed neutrons
|
||||
emitted from fission products.
|
||||
prompt_photons : Callable
|
||||
Function of energy that returns the kinetic energy of prompt fission
|
||||
photons.
|
||||
delayed_photons : Callable
|
||||
Function of energy that returns the kinetic energy of delayed photons.
|
||||
betas : Callable
|
||||
Function of energy that returns the kinetic energy of delayed beta
|
||||
particles.
|
||||
neutrinos : Callable
|
||||
Function of energy that returns the kinetic energy of neutrinos.
|
||||
recoverable : Callable
|
||||
Function of energy that returns the kinetic energy of all products that
|
||||
can be absorbed in the reactor (all of the energy except for the
|
||||
neutrinos).
|
||||
total : Callable
|
||||
Function of energy that returns the kinetic energy of all products.
|
||||
q_prompt : Callable
|
||||
Function of energy that returns the prompt fission Q-value (fragments +
|
||||
prompt neutrons + prompt photons - incident neutron energy).
|
||||
q_recoverable : Callable
|
||||
Function of energy that returns the recoverable fission Q-value
|
||||
(total release - neutrinos - incident neutron energy). This value is
|
||||
sometimes referred to as the pseudo-Q-value.
|
||||
q_total : Callable
|
||||
Function of energy that returns the total fission Q-value (total release
|
||||
- incident neutron energy).
|
||||
|
||||
"""
|
||||
def __init__(self):
|
||||
self._fragments = None
|
||||
self._prompt_neutrons = None
|
||||
self._delayed_neutrons = None
|
||||
self._prompt_photons = None
|
||||
self._delayed_photons = None
|
||||
self._betas = None
|
||||
self._neutrinos = None
|
||||
|
||||
@property
|
||||
def fragments(self):
|
||||
return self._fragments
|
||||
|
||||
@property
|
||||
def prompt_neutrons(self):
|
||||
return self._prompt_neutrons
|
||||
|
||||
@property
|
||||
def delayed_neutrons(self):
|
||||
return self._delayed_neutrons
|
||||
|
||||
@property
|
||||
def prompt_photons(self):
|
||||
return self._prompt_photons
|
||||
|
||||
@property
|
||||
def delayed_photons(self):
|
||||
return self._delayed_photons
|
||||
|
||||
@property
|
||||
def betas(self):
|
||||
return self._betas
|
||||
|
||||
@property
|
||||
def neutrinos(self):
|
||||
return self._neutrinos
|
||||
|
||||
@property
|
||||
def recoverable(self):
|
||||
return Sum([self.fragments, self.prompt_neutrons, self.delayed_neutrons,
|
||||
self.prompt_photons, self.delayed_photons, self.betas])
|
||||
|
||||
@property
|
||||
def total(self):
|
||||
return Sum([self.fragments, self.prompt_neutrons, self.delayed_neutrons,
|
||||
self.prompt_photons, self.delayed_photons, self.betas,
|
||||
self.neutrinos])
|
||||
|
||||
@property
|
||||
def q_prompt(self):
|
||||
return Sum([self.fragments, self.prompt_neutrons, self.prompt_photons,
|
||||
lambda E: -E])
|
||||
|
||||
@property
|
||||
def q_recoverable(self):
|
||||
return Sum([self.recoverable, lambda E: -E])
|
||||
|
||||
@property
|
||||
def q_total(self):
|
||||
return Sum([self.total, lambda E: -E])
|
||||
|
||||
@fragments.setter
|
||||
def fragments(self, energy_release):
|
||||
cv.check_type('fragments', energy_release, Callable)
|
||||
self._fragments = energy_release
|
||||
|
||||
@prompt_neutrons.setter
|
||||
def prompt_neutrons(self, energy_release):
|
||||
cv.check_type('prompt_neutrons', energy_release, Callable)
|
||||
self._prompt_neutrons = energy_release
|
||||
|
||||
@delayed_neutrons.setter
|
||||
def delayed_neutrons(self, energy_release):
|
||||
cv.check_type('delayed_neutrons', energy_release, Callable)
|
||||
self._delayed_neutrons = energy_release
|
||||
|
||||
@prompt_photons.setter
|
||||
def prompt_photons(self, energy_release):
|
||||
cv.check_type('prompt_photons', energy_release, Callable)
|
||||
self._prompt_photons = energy_release
|
||||
|
||||
@delayed_photons.setter
|
||||
def delayed_photons(self, energy_release):
|
||||
cv.check_type('delayed_photons', energy_release, Callable)
|
||||
self._delayed_photons = energy_release
|
||||
|
||||
@betas.setter
|
||||
def betas(self, energy_release):
|
||||
cv.check_type('betas', energy_release, Callable)
|
||||
self._betas = energy_release
|
||||
|
||||
@neutrinos.setter
|
||||
def neutrinos(self, energy_release):
|
||||
cv.check_type('neutrinos', energy_release, Callable)
|
||||
self._neutrinos = energy_release
|
||||
|
||||
@classmethod
|
||||
def _from_dictionary(cls, energy_release, incident_neutron):
|
||||
"""Generate fission energy release data from a dictionary.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
energy_release : dict of str to list of float
|
||||
Dictionary that gives lists of coefficients for each energy
|
||||
component. The keys are the 2-3 letter strings used in ENDF-102,
|
||||
e.g. 'EFR' and 'ET'. The list will have a length of 1 for Sher-Beck
|
||||
data, more for polynomial data.
|
||||
|
||||
incident_neutron : openmc.data.IncidentNeutron
|
||||
Corresponding incident neutron dataset
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.FissionEnergyRelease
|
||||
Fission energy release data
|
||||
|
||||
"""
|
||||
out = cls()
|
||||
|
||||
# How many coefficients are given for each component? If we only find
|
||||
# one value for each, then we need to use the Sher-Beck formula for
|
||||
# energy dependence. Otherwise, it is a polynomial.
|
||||
n_coeffs = len(energy_release['EFR'])
|
||||
if n_coeffs > 1:
|
||||
out.fragments = Polynomial(energy_release['EFR'])
|
||||
out.prompt_neutrons = Polynomial(energy_release['ENP'])
|
||||
out.delayed_neutrons = Polynomial(energy_release['END'])
|
||||
out.prompt_photons = Polynomial(energy_release['EGP'])
|
||||
out.delayed_photons = Polynomial(energy_release['EGD'])
|
||||
out.betas = Polynomial(energy_release['EB'])
|
||||
out.neutrinos = Polynomial(energy_release['ENU'])
|
||||
else:
|
||||
# EFR and ENP are energy independent. Use 0-order polynomials to
|
||||
# make a constant function. The energy-dependence of END is
|
||||
# unspecified in ENDF-102 so assume it is independent.
|
||||
out.fragments = Polynomial((energy_release['EFR'][0]))
|
||||
out.prompt_photons = Polynomial((energy_release['EGP'][0]))
|
||||
out.delayed_neutrons = Polynomial((energy_release['END'][0]))
|
||||
|
||||
# EDP, EB, and ENU are linear.
|
||||
out.delayed_photons = Polynomial((energy_release['EGD'][0], -0.075))
|
||||
out.betas = Polynomial((energy_release['EB'][0], -0.075))
|
||||
out.neutrinos = Polynomial((energy_release['ENU'][0], -0.105))
|
||||
|
||||
# Prompt neutrons require nu-data. It is not clear from ENDF-102
|
||||
# whether prompt or total nu value should be used, but the delayed
|
||||
# neutron fraction is so small that the difference is negligible.
|
||||
# MT=18 (n, fission) might not be available so try MT=19 (n, f) as
|
||||
# well.
|
||||
if 18 in incident_neutron.reactions:
|
||||
nu_prompt = [p for p in incident_neutron[18].products
|
||||
if p.particle == 'neutron'
|
||||
and p.emission_mode == 'prompt']
|
||||
elif 19 in incident_neutron.reactions:
|
||||
nu_prompt = [p for p in incident_neutron[19].products
|
||||
if p.particle == 'neutron'
|
||||
and p.emission_mode == 'prompt']
|
||||
else:
|
||||
raise ValueError('IncidentNeutron data has no fission '
|
||||
'reaction.')
|
||||
if len(nu_prompt) == 0:
|
||||
raise ValueError('Nu data is needed to compute fission energy '
|
||||
'release with the Sher-Beck format.')
|
||||
if len(nu_prompt) > 1:
|
||||
raise ValueError('Ambiguous prompt value.')
|
||||
if not isinstance(nu_prompt[0].yield_, Tabulated1D):
|
||||
raise TypeError('Sher-Beck fission energy release currently '
|
||||
'only supports Tabulated1D nu data.')
|
||||
ENP = deepcopy(nu_prompt[0].yield_)
|
||||
ENP.y = (energy_release['ENP'] + 1.307 * ENP.x
|
||||
- 8.07 * (ENP.y - ENP.y[0]))
|
||||
out.prompt_neutrons = ENP
|
||||
|
||||
return out
|
||||
|
||||
@classmethod
|
||||
def from_endf(cls, filename, incident_neutron):
|
||||
"""Generate fission energy release data from an ENDF file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Name of the ENDF file containing fission energy release data
|
||||
|
||||
incident_neutron : openmc.data.IncidentNeutron
|
||||
Corresponding incident neutron dataset
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.FissionEnergyRelease
|
||||
Fission energy release data
|
||||
|
||||
"""
|
||||
|
||||
# Check to make sure this ENDF file matches the expected isomer.
|
||||
ident = identify_nuclide(filename)
|
||||
if ident['Z'] != incident_neutron.atomic_number:
|
||||
raise ValueError('The atomic number of the ENDF evaluation does '
|
||||
'not match the given IncidentNeutron.')
|
||||
if ident['A'] != incident_neutron.mass_number:
|
||||
raise ValueError('The atomic mass of the ENDF evaluation does '
|
||||
'not match the given IncidentNeutron.')
|
||||
if ident['LISO'] != incident_neutron.metastable:
|
||||
raise ValueError('The metastable state of the ENDF evaluation does '
|
||||
'not match the given IncidentNeutron.')
|
||||
if not ident['LFI']:
|
||||
raise ValueError('The ENDF evaluation is not fissionable.')
|
||||
|
||||
# Read the 458 data from the ENDF file.
|
||||
value, uncertainty = _extract_458_data(filename)
|
||||
|
||||
# Build the object.
|
||||
return cls._from_dictionary(value, incident_neutron)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate fission energy release data from an HDF5 group.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.FissionEnergyRelease
|
||||
Fission energy release data
|
||||
|
||||
"""
|
||||
|
||||
obj = cls()
|
||||
|
||||
obj.fragments = Function1D.from_hdf5(group['fragments'])
|
||||
obj.prompt_neutrons = Function1D.from_hdf5(group['prompt_neutrons'])
|
||||
obj.delayed_neutrons = Function1D.from_hdf5(group['delayed_neutrons'])
|
||||
obj.prompt_photons = Function1D.from_hdf5(group['prompt_photons'])
|
||||
obj.delayed_photons = Function1D.from_hdf5(group['delayed_photons'])
|
||||
obj.betas = Function1D.from_hdf5(group['betas'])
|
||||
obj.neutrinos = Function1D.from_hdf5(group['neutrinos'])
|
||||
|
||||
return obj
|
||||
|
||||
@classmethod
|
||||
def from_compact_hdf5(cls, fname, incident_neutron):
|
||||
"""Generate fission energy release data from a small HDF5 library.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : str
|
||||
Path to an HDF5 file containing fission energy release data. This
|
||||
file should have been generated form the
|
||||
:func:`openmc.data.write_compact_458_library` function.
|
||||
|
||||
incident_neutron : openmc.data.IncidentNeutron
|
||||
Corresponding incident neutron dataset
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.FissionEnergyRelease or None
|
||||
Fission energy release data for the given nuclide if it is present
|
||||
in the data file
|
||||
|
||||
"""
|
||||
|
||||
fin = h5py.File(fname, 'r')
|
||||
|
||||
components = [s.decode() for s in fin.attrs['component order']]
|
||||
|
||||
nuclide_name = ATOMIC_SYMBOL[incident_neutron.atomic_number]
|
||||
nuclide_name += str(incident_neutron.mass_number)
|
||||
if incident_neutron.metastable != 0:
|
||||
nuclide_name += '_m' + str(incident_neutron.metastable)
|
||||
|
||||
if nuclide_name not in fin: return None
|
||||
|
||||
data = {c: fin[nuclide_name + '/data'][i, 0, :]
|
||||
for i, c in enumerate(components)}
|
||||
|
||||
return cls._from_dictionary(data, incident_neutron)
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write energy release data to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
|
||||
self.fragments.to_hdf5(group, 'fragments')
|
||||
self.prompt_neutrons.to_hdf5(group, 'prompt_neutrons')
|
||||
self.delayed_neutrons.to_hdf5(group, 'delayed_neutrons')
|
||||
self.prompt_photons.to_hdf5(group, 'prompt_photons')
|
||||
self.delayed_photons.to_hdf5(group, 'delayed_photons')
|
||||
self.betas.to_hdf5(group, 'betas')
|
||||
self.neutrinos.to_hdf5(group, 'neutrinos')
|
||||
|
||||
if isinstance(self.prompt_neutrons, Polynomial):
|
||||
# Add the polynomials for the relevant components together. Use a
|
||||
# Polynomial((0.0, -1.0)) to subtract incident energy.
|
||||
q_prompt = (self.fragments + self.prompt_neutrons +
|
||||
self.prompt_photons + Polynomial((0.0, -1.0)))
|
||||
q_prompt.to_hdf5(group, 'q_prompt')
|
||||
q_recoverable = (self.fragments + self.prompt_neutrons +
|
||||
self.delayed_neutrons + self.prompt_photons +
|
||||
self.delayed_photons + self.betas +
|
||||
Polynomial((0.0, -1.0)))
|
||||
q_recoverable.to_hdf5(group, 'q_recoverable')
|
||||
|
||||
elif isinstance(self.prompt_neutrons, Tabulated1D):
|
||||
# Make a Tabulated1D and evaluate the polynomial components at the
|
||||
# table x points to get new y points. Subtract x from y to remove
|
||||
# incident energy.
|
||||
q_prompt = deepcopy(self.prompt_neutrons)
|
||||
q_prompt.y += self.fragments(q_prompt.x)
|
||||
q_prompt.y += self.prompt_photons(q_prompt.x)
|
||||
q_prompt.y -= q_prompt.x
|
||||
q_prompt.to_hdf5(group, 'q_prompt')
|
||||
q_recoverable = q_prompt
|
||||
q_recoverable.y += self.delayed_neutrons(q_recoverable.x)
|
||||
q_recoverable.y += self.delayed_photons(q_recoverable.x)
|
||||
q_recoverable.y += self.betas(q_recoverable.x)
|
||||
q_recoverable.to_hdf5(group, 'q_recoverable')
|
||||
|
||||
else:
|
||||
raise ValueError('Unrecognized energy release format')
|
||||
425
openmc/data/function.py
Normal file
425
openmc/data/function.py
Normal file
|
|
@ -0,0 +1,425 @@
|
|||
from abc import ABCMeta, abstractmethod
|
||||
from collections import Iterable, Callable
|
||||
from numbers import Real, Integral
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.mixin import EqualityMixin
|
||||
|
||||
INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log',
|
||||
4: 'log-linear', 5: 'log-log'}
|
||||
|
||||
|
||||
class Function1D(EqualityMixin):
|
||||
"""A function of one independent variable with HDF5 support."""
|
||||
|
||||
__metaclass__ = ABCMeta
|
||||
|
||||
@abstractmethod
|
||||
def __call__(self): pass
|
||||
|
||||
@abstractmethod
|
||||
def to_hdf5(self, group, name='xy'):
|
||||
"""Write function to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
name : str
|
||||
Name of the dataset to create
|
||||
|
||||
"""
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, dataset):
|
||||
"""Generate function from an HDF5 dataset
|
||||
|
||||
Parameters
|
||||
----------
|
||||
dataset : h5py.Dataset
|
||||
Dataset to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.Function1D
|
||||
Function read from dataset
|
||||
|
||||
"""
|
||||
for subclass in cls.__subclasses__():
|
||||
if dataset.attrs['type'].decode() == subclass.__name__:
|
||||
return subclass.from_hdf5(dataset)
|
||||
raise ValueError("Unrecognized Function1D class: '"
|
||||
+ dataset.attrs['type'].decode() + "'")
|
||||
|
||||
|
||||
class Tabulated1D(Function1D):
|
||||
"""A one-dimensional tabulated function.
|
||||
|
||||
This class mirrors the TAB1 type from the ENDF-6 format. A tabulated
|
||||
function is specified by tabulated (x,y) pairs along with interpolation
|
||||
rules that determine the values between tabulated pairs.
|
||||
|
||||
Once an object has been created, it can be used as though it were an actual
|
||||
function, e.g.:
|
||||
|
||||
>>> f = Tabulated1D([0, 10], [4, 5])
|
||||
>>> [f(xi) for xi in numpy.linspace(0, 10, 5)]
|
||||
[4.0, 4.25, 4.5, 4.75, 5.0]
|
||||
|
||||
Parameters
|
||||
----------
|
||||
x : Iterable of float
|
||||
Independent variable
|
||||
y : Iterable of float
|
||||
Dependent variable
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints for interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation scheme identification number, e.g., 3 means y is linear in
|
||||
ln(x).
|
||||
|
||||
Attributes
|
||||
----------
|
||||
x : Iterable of float
|
||||
Independent variable
|
||||
y : Iterable of float
|
||||
Dependent variable
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints for interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation scheme identification number, e.g., 3 means y is linear in
|
||||
ln(x).
|
||||
n_regions : int
|
||||
Number of interpolation regions
|
||||
n_pairs : int
|
||||
Number of tabulated (x,y) pairs
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, x, y, breakpoints=None, interpolation=None):
|
||||
if breakpoints is None or interpolation is None:
|
||||
# Single linear-linear interpolation region by default
|
||||
self.breakpoints = np.array([len(x)])
|
||||
self.interpolation = np.array([2])
|
||||
else:
|
||||
self.breakpoints = np.asarray(breakpoints, dtype=int)
|
||||
self.interpolation = np.asarray(interpolation, dtype=int)
|
||||
|
||||
self.x = np.asarray(x)
|
||||
self.y = np.asarray(y)
|
||||
|
||||
def __call__(self, x):
|
||||
# Check if input is array or scalar
|
||||
if isinstance(x, Iterable):
|
||||
iterable = True
|
||||
x = np.array(x)
|
||||
else:
|
||||
iterable = False
|
||||
x = np.array([x], dtype=float)
|
||||
|
||||
# Create output array
|
||||
y = np.zeros_like(x)
|
||||
|
||||
# Get indices for interpolation
|
||||
idx = np.searchsorted(self.x, x, side='right') - 1
|
||||
|
||||
# Loop over interpolation regions
|
||||
for k in range(len(self.breakpoints)):
|
||||
# Get indices for the begining and ending of this region
|
||||
i_begin = self.breakpoints[k-1] - 1 if k > 0 else 0
|
||||
i_end = self.breakpoints[k] - 1
|
||||
|
||||
# Figure out which idx values lie within this region
|
||||
contained = (idx >= i_begin) & (idx < i_end)
|
||||
|
||||
xk = x[contained] # x values in this region
|
||||
xi = self.x[idx[contained]] # low edge of corresponding bins
|
||||
xi1 = self.x[idx[contained] + 1] # high edge of corresponding bins
|
||||
yi = self.y[idx[contained]]
|
||||
yi1 = self.y[idx[contained] + 1]
|
||||
|
||||
if self.interpolation[k] == 1:
|
||||
# Histogram
|
||||
y[contained] = yi
|
||||
|
||||
elif self.interpolation[k] == 2:
|
||||
# Linear-linear
|
||||
y[contained] = yi + (xk - xi)/(xi1 - xi)*(yi1 - yi)
|
||||
|
||||
elif self.interpolation[k] == 3:
|
||||
# Linear-log
|
||||
y[contained] = yi + np.log(xk/xi)/np.log(xi1/xi)*(yi1 - yi)
|
||||
|
||||
elif self.interpolation[k] == 4:
|
||||
# Log-linear
|
||||
y[contained] = yi*np.exp((xk - xi)/(xi1 - xi)*np.log(yi1/yi))
|
||||
|
||||
elif self.interpolation[k] == 5:
|
||||
# Log-log
|
||||
y[contained] = (yi*np.exp(np.log(xk/xi)/np.log(xi1/xi)
|
||||
*np.log(yi1/yi)))
|
||||
|
||||
# In some cases, x values might be outside the tabulated region due only
|
||||
# to precision, so we check if they're close and set them equal if so.
|
||||
y[np.isclose(x, self.x[0], atol=1e-14)] = self.y[0]
|
||||
y[np.isclose(x, self.x[-1], atol=1e-14)] = self.y[-1]
|
||||
|
||||
return y if iterable else y[0]
|
||||
|
||||
def __len__(self):
|
||||
return len(self.x)
|
||||
|
||||
@property
|
||||
def x(self):
|
||||
return self._x
|
||||
|
||||
@property
|
||||
def y(self):
|
||||
return self._y
|
||||
|
||||
@property
|
||||
def breakpoints(self):
|
||||
return self._breakpoints
|
||||
|
||||
@property
|
||||
def interpolation(self):
|
||||
return self._interpolation
|
||||
|
||||
@property
|
||||
def n_pairs(self):
|
||||
return len(self.x)
|
||||
|
||||
@property
|
||||
def n_regions(self):
|
||||
return len(self.breakpoints)
|
||||
|
||||
@x.setter
|
||||
def x(self, x):
|
||||
cv.check_type('x values', x, Iterable, Real)
|
||||
self._x = x
|
||||
|
||||
@y.setter
|
||||
def y(self, y):
|
||||
cv.check_type('y values', y, Iterable, Real)
|
||||
self._y = y
|
||||
|
||||
@breakpoints.setter
|
||||
def breakpoints(self, breakpoints):
|
||||
cv.check_type('breakpoints', breakpoints, Iterable, Integral)
|
||||
self._breakpoints = breakpoints
|
||||
|
||||
@interpolation.setter
|
||||
def interpolation(self, interpolation):
|
||||
cv.check_type('interpolation', interpolation, Iterable, Integral)
|
||||
self._interpolation = interpolation
|
||||
|
||||
def integral(self):
|
||||
"""Integral of the tabulated function over its tabulated range.
|
||||
|
||||
Returns
|
||||
-------
|
||||
numpy.ndarray
|
||||
Array of same length as the tabulated data that represents partial
|
||||
integrals from the bottom of the range to each tabulated point.
|
||||
|
||||
"""
|
||||
|
||||
# Create output array
|
||||
partial_sum = np.zeros(len(self.x) - 1)
|
||||
|
||||
i_low = 0
|
||||
for k in range(len(self.breakpoints)):
|
||||
# Determine which x values are within this interpolation range
|
||||
i_high = self.breakpoints[k] - 1
|
||||
|
||||
# Get x values and bounding (x,y) pairs
|
||||
x0 = self.x[i_low:i_high]
|
||||
x1 = self.x[i_low + 1:i_high + 1]
|
||||
y0 = self.y[i_low:i_high]
|
||||
y1 = self.y[i_low + 1:i_high + 1]
|
||||
|
||||
if self.interpolation[k] == 1:
|
||||
# Histogram
|
||||
partial_sum[i_low:i_high] = y0*(x1 - x0)
|
||||
|
||||
elif self.interpolation[k] == 2:
|
||||
# Linear-linear
|
||||
m = (y1 - y0)/(x1 - x0)
|
||||
partial_sum[i_low:i_high] = (y0 - m*x0)*(x1 - x0) + \
|
||||
m*(x1**2 - x0**2)/2
|
||||
|
||||
elif self.interpolation[k] == 3:
|
||||
# Linear-log
|
||||
logx = np.log(x1/x0)
|
||||
m = (y1 - y0)/logx
|
||||
partial_sum[i_low:i_high] = y0 + m*(x1*(logx - 1) + x0)
|
||||
|
||||
elif self.interpolation[k] == 4:
|
||||
# Log-linear
|
||||
m = np.log(y1/y0)/(x1 - x0)
|
||||
partial_sum[i_low:i_high] = y0/m*(np.exp(m*(x1 - x0)) - 1)
|
||||
|
||||
elif self.interpolation[k] == 5:
|
||||
# Log-log
|
||||
m = np.log(y1/y0)/np.log(x1/x0)
|
||||
partial_sum[i_low:i_high] = y0/((m + 1)*x0**m)*(
|
||||
x1**(m + 1) - x0**(m + 1))
|
||||
|
||||
i_low = i_high
|
||||
|
||||
return np.concatenate(([0.], np.cumsum(partial_sum)))
|
||||
|
||||
def to_hdf5(self, group, name='xy'):
|
||||
"""Write tabulated function to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
name : str
|
||||
Name of the dataset to create
|
||||
|
||||
"""
|
||||
dataset = group.create_dataset(name, data=np.vstack(
|
||||
[self.x, self.y]))
|
||||
dataset.attrs['type'] = np.string_(type(self).__name__)
|
||||
dataset.attrs['breakpoints'] = self.breakpoints
|
||||
dataset.attrs['interpolation'] = self.interpolation
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, dataset):
|
||||
"""Generate tabulated function from an HDF5 dataset
|
||||
|
||||
Parameters
|
||||
----------
|
||||
dataset : h5py.Dataset
|
||||
Dataset to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.Tabulated1D
|
||||
Function read from dataset
|
||||
|
||||
"""
|
||||
if dataset.attrs['type'].decode() != cls.__name__:
|
||||
raise ValueError("Expected an HDF5 attribute 'type' equal to '"
|
||||
+ cls.__name__ + "'")
|
||||
|
||||
x = dataset.value[0, :]
|
||||
y = dataset.value[1, :]
|
||||
breakpoints = dataset.attrs['breakpoints']
|
||||
interpolation = dataset.attrs['interpolation']
|
||||
return cls(x, y, breakpoints, interpolation)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, idx=0):
|
||||
"""Create a Tabulated1D object from an ACE table.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
An ACE table
|
||||
idx : int
|
||||
Offset to read from in XSS array (default of zero)
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.Tabulated1D
|
||||
Tabulated data object
|
||||
|
||||
"""
|
||||
|
||||
# Get number of regions and pairs
|
||||
n_regions = int(ace.xss[idx])
|
||||
n_pairs = int(ace.xss[idx + 1 + 2*n_regions])
|
||||
|
||||
# Get interpolation information
|
||||
idx += 1
|
||||
if n_regions > 0:
|
||||
breakpoints = ace.xss[idx:idx + n_regions].astype(int)
|
||||
interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int)
|
||||
else:
|
||||
# 0 regions implies linear-linear interpolation by default
|
||||
breakpoints = np.array([n_pairs])
|
||||
interpolation = np.array([2])
|
||||
|
||||
# Get (x,y) pairs
|
||||
idx += 2*n_regions + 1
|
||||
x = ace.xss[idx:idx + n_pairs]
|
||||
y = ace.xss[idx + n_pairs:idx + 2*n_pairs]
|
||||
|
||||
return Tabulated1D(x, y, breakpoints, interpolation)
|
||||
|
||||
|
||||
class Polynomial(np.polynomial.Polynomial, Function1D):
|
||||
def to_hdf5(self, group, name='xy'):
|
||||
"""Write polynomial function to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
name : str
|
||||
Name of the dataset to create
|
||||
|
||||
"""
|
||||
dataset = group.create_dataset(name, data=self.coef)
|
||||
dataset.attrs['type'] = np.string_(type(self).__name__)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, dataset):
|
||||
"""Generate function from an HDF5 dataset
|
||||
|
||||
Parameters
|
||||
----------
|
||||
dataset : h5py.Dataset
|
||||
Dataset to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.Function1D
|
||||
Function read from dataset
|
||||
|
||||
"""
|
||||
if dataset.attrs['type'].decode() != cls.__name__:
|
||||
raise ValueError("Expected an HDF5 attribute 'type' equal to '"
|
||||
+ cls.__name__ + "'")
|
||||
return cls(dataset.value)
|
||||
|
||||
|
||||
class Sum(EqualityMixin):
|
||||
"""Sum of multiple functions.
|
||||
|
||||
This class allows you to create a callable object which represents the sum
|
||||
of other callable objects. This is used for summed reactions whereby the
|
||||
cross section is defined as the sum of other cross sections.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
functions : Iterable of Callable
|
||||
Functions which are to be added together
|
||||
|
||||
Attributes
|
||||
----------
|
||||
functions : Iterable of Callable
|
||||
Functions which are to be added together
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, functions):
|
||||
self.functions = functions
|
||||
|
||||
def __call__(self, x):
|
||||
return sum(f(x) for f in self.functions)
|
||||
|
||||
@property
|
||||
def functions(self):
|
||||
return self._functions
|
||||
|
||||
@functions.setter
|
||||
def functions(self, functions):
|
||||
cv.check_type('functions', functions, Iterable, Callable)
|
||||
self._functions = functions
|
||||
348
openmc/data/kalbach_mann.py
Normal file
348
openmc/data/kalbach_mann.py
Normal file
|
|
@ -0,0 +1,348 @@
|
|||
from collections import Iterable
|
||||
from numbers import Real, Integral
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.stats import Tabular, Univariate, Discrete, Mixture
|
||||
from .function import Tabulated1D, INTERPOLATION_SCHEME
|
||||
from .angle_energy import AngleEnergy
|
||||
|
||||
|
||||
class KalbachMann(AngleEnergy):
|
||||
"""Kalbach-Mann distribution
|
||||
|
||||
Parameters
|
||||
----------
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints defining interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation codes
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
energy_out : Iterable of openmc.stats.Univariate
|
||||
Distribution of outgoing energies corresponding to each incoming energy
|
||||
precompound : Iterable of openmc.data.Tabulated1D
|
||||
Precompound factor 'r' as a function of outgoing energy for each
|
||||
incoming energy
|
||||
slope : Iterable of openmc.data.Tabulated1D
|
||||
Kalbach-Chadwick angular distribution slope value 'a' as a function of
|
||||
outgoing energy for each incoming energy
|
||||
|
||||
Attributes
|
||||
----------
|
||||
breakpoints : Iterable of int
|
||||
Breakpoints defining interpolation regions
|
||||
interpolation : Iterable of int
|
||||
Interpolation codes
|
||||
energy : Iterable of float
|
||||
Incoming energies at which distributions exist
|
||||
energy_out : Iterable of openmc.stats.Univariate
|
||||
Distribution of outgoing energies corresponding to each incoming energy
|
||||
precompound : Iterable of openmc.data.Tabulated1D
|
||||
Precompound factor 'r' as a function of outgoing energy for each
|
||||
incoming energy
|
||||
slope : Iterable of openmc.data.Tabulated1D
|
||||
Kalbach-Chadwick angular distribution slope value 'a' as a function of
|
||||
outgoing energy for each incoming energy
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, breakpoints, interpolation, energy, energy_out,
|
||||
precompound, slope):
|
||||
super(KalbachMann, self).__init__()
|
||||
self.breakpoints = breakpoints
|
||||
self.interpolation = interpolation
|
||||
self.energy = energy
|
||||
self.energy_out = energy_out
|
||||
self.precompound = precompound
|
||||
self.slope = slope
|
||||
|
||||
@property
|
||||
def breakpoints(self):
|
||||
return self._breakpoints
|
||||
|
||||
@property
|
||||
def interpolation(self):
|
||||
return self._interpolation
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@property
|
||||
def energy_out(self):
|
||||
return self._energy_out
|
||||
|
||||
@property
|
||||
def precompound(self):
|
||||
return self._precompound
|
||||
|
||||
@property
|
||||
def slope(self):
|
||||
return self._slope
|
||||
|
||||
@breakpoints.setter
|
||||
def breakpoints(self, breakpoints):
|
||||
cv.check_type('Kalbach-Mann breakpoints', breakpoints,
|
||||
Iterable, Integral)
|
||||
self._breakpoints = breakpoints
|
||||
|
||||
@interpolation.setter
|
||||
def interpolation(self, interpolation):
|
||||
cv.check_type('Kalbach-Mann interpolation', interpolation,
|
||||
Iterable, Integral)
|
||||
self._interpolation = interpolation
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('Kalbach-Mann incoming energy', energy,
|
||||
Iterable, Real)
|
||||
self._energy = energy
|
||||
|
||||
@energy_out.setter
|
||||
def energy_out(self, energy_out):
|
||||
cv.check_type('Kalbach-Mann distributions', energy_out,
|
||||
Iterable, Univariate)
|
||||
self._energy_out = energy_out
|
||||
|
||||
@precompound.setter
|
||||
def precompound(self, precompound):
|
||||
cv.check_type('Kalbach-Mann precompound factor', precompound,
|
||||
Iterable, Tabulated1D)
|
||||
self._precompound = precompound
|
||||
|
||||
@slope.setter
|
||||
def slope(self, slope):
|
||||
cv.check_type('Kalbach-Mann slope', slope, Iterable, Tabulated1D)
|
||||
self._slope = slope
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['type'] = np.string_('kalbach-mann')
|
||||
|
||||
dset = group.create_dataset('energy', data=self.energy)
|
||||
dset.attrs['interpolation'] = np.vstack((self.breakpoints,
|
||||
self.interpolation))
|
||||
|
||||
# Determine total number of (E,p,r,a) tuples and create array
|
||||
n_tuple = sum(len(d) for d in self.energy_out)
|
||||
distribution = np.empty((5, n_tuple))
|
||||
|
||||
# Create array for offsets
|
||||
offsets = np.empty(len(self.energy_out), dtype=int)
|
||||
interpolation = np.empty(len(self.energy_out), dtype=int)
|
||||
n_discrete_lines = np.empty(len(self.energy_out), dtype=int)
|
||||
j = 0
|
||||
|
||||
# Populate offsets and distribution array
|
||||
for i, (eout, km_r, km_a) in enumerate(zip(
|
||||
self.energy_out, self.precompound, self.slope)):
|
||||
n = len(eout)
|
||||
offsets[i] = j
|
||||
|
||||
if isinstance(eout, Mixture):
|
||||
discrete, continuous = eout.distribution
|
||||
n_discrete_lines[i] = m = len(discrete)
|
||||
interpolation[i] = 1 if continuous.interpolation == 'histogram' else 2
|
||||
distribution[0, j:j+m] = discrete.x
|
||||
distribution[1, j:j+m] = discrete.p
|
||||
distribution[2, j:j+m] = discrete.c
|
||||
distribution[0, j+m:j+n] = continuous.x
|
||||
distribution[1, j+m:j+n] = continuous.p
|
||||
distribution[2, j+m:j+n] = continuous.c
|
||||
else:
|
||||
if isinstance(eout, Tabular):
|
||||
n_discrete_lines[i] = 0
|
||||
interpolation[i] = 1 if eout.interpolation == 'histogram' else 2
|
||||
elif isinstance(eout, Discrete):
|
||||
n_discrete_lines[i] = n
|
||||
interpolation[i] = 1
|
||||
distribution[0, j:j+n] = eout.x
|
||||
distribution[1, j:j+n] = eout.p
|
||||
distribution[2, j:j+n] = eout.c
|
||||
|
||||
distribution[3, j:j+n] = km_r.y
|
||||
distribution[4, j:j+n] = km_a.y
|
||||
j += n
|
||||
|
||||
# Create dataset for distributions
|
||||
dset = group.create_dataset('distribution', data=distribution)
|
||||
|
||||
# Write interpolation as attribute
|
||||
dset.attrs['offsets'] = offsets
|
||||
dset.attrs['interpolation'] = interpolation
|
||||
dset.attrs['n_discrete_lines'] = n_discrete_lines
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate Kalbach-Mann distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.KalbachMann
|
||||
Kalbach-Mann energy distribution
|
||||
|
||||
"""
|
||||
interp_data = group['energy'].attrs['interpolation']
|
||||
energy_breakpoints = interp_data[0, :]
|
||||
energy_interpolation = interp_data[1, :]
|
||||
energy = group['energy'].value
|
||||
|
||||
data = group['distribution']
|
||||
offsets = data.attrs['offsets']
|
||||
interpolation = data.attrs['interpolation']
|
||||
n_discrete_lines = data.attrs['n_discrete_lines']
|
||||
|
||||
energy_out = []
|
||||
precompound = []
|
||||
slope = []
|
||||
n_energy = len(energy)
|
||||
for i in range(n_energy):
|
||||
# Determine length of outgoing energy distribution and number of
|
||||
# discrete lines
|
||||
j = offsets[i]
|
||||
if i < n_energy - 1:
|
||||
n = offsets[i+1] - j
|
||||
else:
|
||||
n = data.shape[1] - j
|
||||
m = n_discrete_lines[i]
|
||||
|
||||
# Create discrete distribution if lines are present
|
||||
if m > 0:
|
||||
eout_discrete = Discrete(data[0, j:j+m], data[1, j:j+m])
|
||||
eout_discrete.c = data[2, j:j+m]
|
||||
p_discrete = eout_discrete.c[-1]
|
||||
|
||||
# Create continuous distribution
|
||||
if m < n:
|
||||
interp = INTERPOLATION_SCHEME[interpolation[i]]
|
||||
eout_continuous = Tabular(data[0, j+m:j+n], data[1, j+m:j+n], interp)
|
||||
eout_continuous.c = data[2, j+m:j+n]
|
||||
|
||||
# If both continuous and discrete are present, create a mixture
|
||||
# distribution
|
||||
if m == 0:
|
||||
eout_i = eout_continuous
|
||||
elif m == n:
|
||||
eout_i = eout_discrete
|
||||
else:
|
||||
eout_i = Mixture([p_discrete, 1. - p_discrete],
|
||||
[eout_discrete, eout_continuous])
|
||||
|
||||
km_r = Tabulated1D(data[0, j:j+n], data[3, j:j+n])
|
||||
km_a = Tabulated1D(data[0, j:j+n], data[4, j:j+n])
|
||||
|
||||
energy_out.append(eout_i)
|
||||
precompound.append(km_r)
|
||||
slope.append(km_a)
|
||||
|
||||
return cls(energy_breakpoints, energy_interpolation,
|
||||
energy, energy_out, precompound, slope)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, idx, ldis):
|
||||
"""Generate Kalbach-Mann energy-angle distribution from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
idx : int
|
||||
Index in XSS array of the start of the energy distribution data
|
||||
(LDIS + LOCC - 1)
|
||||
ldis : int
|
||||
Index in XSS array of the start of the energy distribution block
|
||||
(e.g. JXS[11])
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.KalbachMann
|
||||
Kalbach-Mann energy-angle distribution
|
||||
|
||||
"""
|
||||
# Read number of interpolation regions and incoming energies
|
||||
n_regions = int(ace.xss[idx])
|
||||
n_energy_in = int(ace.xss[idx + 1 + 2*n_regions])
|
||||
|
||||
# Get interpolation information
|
||||
idx += 1
|
||||
if n_regions > 0:
|
||||
breakpoints = ace.xss[idx:idx + n_regions].astype(int)
|
||||
interpolation = ace.xss[idx + n_regions:idx + 2*n_regions].astype(int)
|
||||
else:
|
||||
breakpoints = np.array([n_energy_in])
|
||||
interpolation = np.array([2])
|
||||
|
||||
# Incoming energies at which distributions exist
|
||||
idx += 2*n_regions + 1
|
||||
energy = ace.xss[idx:idx + n_energy_in]
|
||||
|
||||
# Location of distributions
|
||||
idx += n_energy_in
|
||||
loc_dist = ace.xss[idx:idx + n_energy_in].astype(int)
|
||||
|
||||
# Initialize variables
|
||||
energy_out = []
|
||||
km_r = []
|
||||
km_a = []
|
||||
|
||||
# Read each outgoing energy distribution
|
||||
for i in range(n_energy_in):
|
||||
idx = ldis + loc_dist[i] - 1
|
||||
|
||||
# intt = interpolation scheme (1=hist, 2=lin-lin)
|
||||
INTTp = int(ace.xss[idx])
|
||||
intt = INTTp % 10
|
||||
n_discrete_lines = (INTTp - intt)//10
|
||||
if intt not in (1, 2):
|
||||
warn("Interpolation scheme for continuous tabular distribution "
|
||||
"is not histogram or linear-linear.")
|
||||
intt = 2
|
||||
|
||||
n_energy_out = int(ace.xss[idx + 1])
|
||||
data = ace.xss[idx + 2:idx + 2 + 5*n_energy_out]
|
||||
data.shape = (5, n_energy_out)
|
||||
|
||||
# Create continuous distribution
|
||||
eout_continuous = Tabular(data[0][n_discrete_lines:],
|
||||
data[1][n_discrete_lines:],
|
||||
INTERPOLATION_SCHEME[intt],
|
||||
ignore_negative=True)
|
||||
eout_continuous.c = data[2][n_discrete_lines:]
|
||||
if np.any(data[1][n_discrete_lines:] < 0.0):
|
||||
warn("Kalbach-Mann energy distribution has negative "
|
||||
"probabilities.")
|
||||
|
||||
# If discrete lines are present, create a mixture distribution
|
||||
if n_discrete_lines > 0:
|
||||
eout_discrete = Discrete(data[0][:n_discrete_lines],
|
||||
data[1][:n_discrete_lines])
|
||||
eout_discrete.c = data[2][:n_discrete_lines]
|
||||
if n_discrete_lines == n_energy_out:
|
||||
eout_i = eout_discrete
|
||||
else:
|
||||
p_discrete = min(sum(eout_discrete.p), 1.0)
|
||||
eout_i = Mixture([p_discrete, 1. - p_discrete],
|
||||
[eout_discrete, eout_continuous])
|
||||
else:
|
||||
eout_i = eout_continuous
|
||||
|
||||
energy_out.append(eout_i)
|
||||
km_r.append(Tabulated1D(data[0], data[3]))
|
||||
km_a.append(Tabulated1D(data[0], data[4]))
|
||||
|
||||
return cls(breakpoints, interpolation, energy, energy_out, km_r, km_a)
|
||||
80
openmc/data/library.py
Normal file
80
openmc/data/library.py
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
import os
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import h5py
|
||||
|
||||
from openmc.mixin import EqualityMixin
|
||||
from openmc.clean_xml import clean_xml_indentation
|
||||
|
||||
|
||||
class DataLibrary(EqualityMixin):
|
||||
"""Collection of cross section data libraries.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
libraries : list of dict
|
||||
List in which each item is a dictionary summarizing cross section data
|
||||
from a single file. The dictionary has keys 'path', 'type', and
|
||||
'materials'.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.libraries = []
|
||||
|
||||
def register_file(self, filename):
|
||||
"""Register a file with the data library.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Path to the file to be registered.
|
||||
|
||||
"""
|
||||
h5file = h5py.File(filename, 'r')
|
||||
|
||||
materials = []
|
||||
filetype = 'neutron'
|
||||
for name in h5file:
|
||||
if name.startswith('c_'):
|
||||
filetype = 'thermal'
|
||||
materials.append(name)
|
||||
|
||||
library = {'path': filename, 'type': filetype, 'materials': materials}
|
||||
self.libraries.append(library)
|
||||
|
||||
def export_to_xml(self, path='cross_sections.xml'):
|
||||
"""Export cross section data library to an XML file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
path : str
|
||||
Path to file to write. Defaults to 'cross_sections.xml'.
|
||||
|
||||
"""
|
||||
root = ET.Element('cross_sections')
|
||||
|
||||
# Determine common directory for library paths
|
||||
common_dir = os.path.dirname(os.path.commonprefix(
|
||||
[lib['path'] for lib in self.libraries]))
|
||||
if common_dir == '':
|
||||
common_dir = '.'
|
||||
|
||||
directory = os.path.relpath(common_dir, os.path.dirname(path))
|
||||
if directory != '.':
|
||||
dir_element = ET.SubElement(root, "directory")
|
||||
dir_element.text = directory
|
||||
|
||||
for library in self.libraries:
|
||||
lib_element = ET.SubElement(root, "library")
|
||||
lib_element.set('materials', ' '.join(library['materials']))
|
||||
lib_element.set('path', os.path.relpath(library['path'], common_dir))
|
||||
lib_element.set('type', library['type'])
|
||||
|
||||
# Clean the indentation to be user-readable
|
||||
clean_xml_indentation(root)
|
||||
|
||||
# Write XML file
|
||||
tree = ET.ElementTree(root)
|
||||
tree.write(path, xml_declaration=True, encoding='utf-8',
|
||||
method='xml')
|
||||
3392
openmc/data/mass.mas12
Normal file
3392
openmc/data/mass.mas12
Normal file
File diff suppressed because it is too large
Load diff
142
openmc/data/nbody.py
Normal file
142
openmc/data/nbody.py
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
from numbers import Real, Integral
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from .angle_energy import AngleEnergy
|
||||
|
||||
class NBodyPhaseSpace(AngleEnergy):
|
||||
"""N-body phase space distribution
|
||||
|
||||
Parameters
|
||||
----------
|
||||
total_mass : float
|
||||
Total mass of product particles
|
||||
n_particles : int
|
||||
Number of product particles
|
||||
atomic_weight_ratio : float
|
||||
Atomic weight ratio of target nuclide
|
||||
q_value : float
|
||||
Q value for reaction in MeV
|
||||
|
||||
Attributes
|
||||
----------
|
||||
total_mass : float
|
||||
Total mass of product particles
|
||||
n_particles : int
|
||||
Number of product particles
|
||||
atomic_weight_ratio : float
|
||||
Atomic weight ratio of target nuclide
|
||||
q_value : float
|
||||
Q value for reaction in MeV
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, total_mass, n_particles, atomic_weight_ratio, q_value):
|
||||
self.total_mass = total_mass
|
||||
self.n_particles = n_particles
|
||||
self.atomic_weight_ratio = atomic_weight_ratio
|
||||
self.q_value = q_value
|
||||
|
||||
@property
|
||||
def total_mass(self):
|
||||
return self._total_mass
|
||||
|
||||
@property
|
||||
def n_particles(self):
|
||||
return self._n_particles
|
||||
|
||||
@property
|
||||
def atomic_weight_ratio(self):
|
||||
return self._atomic_weight_ratio
|
||||
|
||||
@property
|
||||
def q_value(self):
|
||||
return self._q_value
|
||||
|
||||
@total_mass.setter
|
||||
def total_mass(self, total_mass):
|
||||
name = 'N-body phase space total mass'
|
||||
cv.check_type(name, total_mass, Real)
|
||||
cv.check_greater_than(name, total_mass, 0.)
|
||||
self._total_mass = total_mass
|
||||
|
||||
@n_particles.setter
|
||||
def n_particles(self, n_particles):
|
||||
name = 'N-body phase space number of particles'
|
||||
cv.check_type(name, n_particles, Integral)
|
||||
cv.check_greater_than(name, n_particles, 0)
|
||||
self._n_particles = n_particles
|
||||
|
||||
@atomic_weight_ratio.setter
|
||||
def atomic_weight_ratio(self, atomic_weight_ratio):
|
||||
name = 'N-body phase space atomic weight ratio'
|
||||
cv.check_type(name, atomic_weight_ratio, Real)
|
||||
cv.check_greater_than(name, atomic_weight_ratio, 0.0)
|
||||
self._atomic_weight_ratio = atomic_weight_ratio
|
||||
|
||||
@q_value.setter
|
||||
def q_value(self, q_value):
|
||||
name = 'N-body phase space Q value'
|
||||
cv.check_type(name, q_value, Real)
|
||||
self._q_value = q_value
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['type'] = np.string_('nbody')
|
||||
group.attrs['total_mass'] = self.total_mass
|
||||
group.attrs['n_particles'] = self.n_particles
|
||||
group.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio
|
||||
group.attrs['q_value'] = self.q_value
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate N-body phase space distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.NBodyPhaseSpace
|
||||
N-body phase space distribution
|
||||
|
||||
"""
|
||||
total_mass = group.attrs['total_mass']
|
||||
n_particles = group.attrs['n_particles']
|
||||
awr = group.attrs['atomic_weight_ratio']
|
||||
q_value = group.attrs['q_value']
|
||||
return cls(total_mass, n_particles, awr, q_value)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, idx, q_value):
|
||||
"""Generate N-body phase space distribution from ACE data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
idx : int
|
||||
Index in XSS array of the start of the energy distribution data
|
||||
(LDIS + LOCC - 1)
|
||||
q_value : float
|
||||
Q-value for reaction in MeV
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.NBodyPhaseSpace
|
||||
N-body phase space distribution
|
||||
|
||||
"""
|
||||
n_particles = int(ace.xss[idx])
|
||||
total_mass = ace.xss[idx + 1]
|
||||
return cls(total_mass, n_particles, ace.atomic_weight_ratio, q_value)
|
||||
598
openmc/data/neutron.py
Normal file
598
openmc/data/neutron.py
Normal file
|
|
@ -0,0 +1,598 @@
|
|||
from __future__ import division, unicode_literals
|
||||
import sys
|
||||
from collections import OrderedDict, Iterable, Mapping, MutableMapping
|
||||
from itertools import chain
|
||||
from numbers import Integral, Real
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
import h5py
|
||||
|
||||
from .data import ATOMIC_SYMBOL, SUM_RULES, K_BOLTZMANN
|
||||
from .ace import Table, get_table
|
||||
from .fission_energy import FissionEnergyRelease
|
||||
from .function import Tabulated1D, Sum
|
||||
from .product import Product
|
||||
from .reaction import Reaction, _get_photon_products
|
||||
from .urr import ProbabilityTables
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.mixin import EqualityMixin
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
|
||||
def _get_metadata(zaid, metastable_scheme='nndc'):
|
||||
"""Return basic identifying data for a nuclide with a given ZAID.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
zaid : int
|
||||
ZAID (1000*Z + A) obtained from a library
|
||||
metastable_scheme : {'nndc', 'mcnp'}
|
||||
Determine how ZAID identifiers are to be interpreted in the case of
|
||||
a metastable nuclide. Because the normal ZAID (=1000*Z + A) does not
|
||||
encode metastable information, different conventions are used among
|
||||
different libraries. In MCNP libraries, the convention is to add 400
|
||||
for a metastable nuclide except for Am242m, for which 95242 is
|
||||
metastable and 95642 (or 1095242 in newer libraries) is the ground
|
||||
state. For NNDC libraries, ZAID is given as 1000*Z + A + 100*m.
|
||||
|
||||
Returns
|
||||
-------
|
||||
name : str
|
||||
Name of the table
|
||||
element : str
|
||||
The atomic symbol of the isotope in the table; e.g., Zr.
|
||||
Z : int
|
||||
Number of protons in the nucleus
|
||||
mass_number : int
|
||||
Number of nucleons in the nucleus
|
||||
metastable : int
|
||||
Metastable state of the nucleus. A value of zero indicates ground state.
|
||||
|
||||
"""
|
||||
|
||||
cv.check_type('zaid', zaid, int)
|
||||
cv.check_value('metastable_scheme', metastable_scheme, ['nndc', 'mcnp'])
|
||||
|
||||
Z = zaid // 1000
|
||||
mass_number = zaid % 1000
|
||||
|
||||
if metastable_scheme == 'mcnp':
|
||||
if zaid > 1000000:
|
||||
# New SZA format
|
||||
Z = Z % 1000
|
||||
if zaid == 1095242:
|
||||
metastable = 0
|
||||
else:
|
||||
metastable = zaid // 1000000
|
||||
else:
|
||||
if zaid == 95242:
|
||||
metastable = 1
|
||||
elif zaid == 95642:
|
||||
metastable = 0
|
||||
else:
|
||||
metastable = 1 if mass_number > 300 else 0
|
||||
elif metastable_scheme == 'nndc':
|
||||
metastable = 1 if mass_number > 300 else 0
|
||||
|
||||
while mass_number > 3 * Z:
|
||||
mass_number -= 100
|
||||
|
||||
# Determine name
|
||||
element = ATOMIC_SYMBOL[Z]
|
||||
name = '{}{}'.format(element, mass_number)
|
||||
if metastable > 0:
|
||||
name += '_m{}'.format(metastable)
|
||||
|
||||
return (name, element, Z, mass_number, metastable)
|
||||
|
||||
|
||||
class IncidentNeutron(EqualityMixin):
|
||||
"""Continuous-energy neutron interaction data.
|
||||
|
||||
Instances of this class are not normally instantiated by the user but rather
|
||||
created using the factory methods :meth:`IncidentNeutron.from_hdf5` and
|
||||
:meth:`IncidentNeutron.from_ace`.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
Name of the nuclide using the GND naming convention
|
||||
atomic_number : int
|
||||
Number of protons in the nucleus
|
||||
mass_number : int
|
||||
Number of nucleons in the nucleus
|
||||
metastable : int
|
||||
Metastable state of the nucleus. A value of zero indicates ground state.
|
||||
atomic_weight_ratio : float
|
||||
Atomic mass ratio of the target nuclide.
|
||||
kTs : Iterable of float
|
||||
List of temperatures of the target nuclide in the data set.
|
||||
The temperatures have units of MeV.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
atomic_number : int
|
||||
Number of protons in the nucleus
|
||||
atomic_symbol : str
|
||||
Atomic symbol of the nuclide, e.g., 'Zr'
|
||||
atomic_weight_ratio : float
|
||||
Atomic weight ratio of the target nuclide.
|
||||
energy : dict of numpy.ndarray
|
||||
The energy values (MeV) at which reaction cross-sections are tabulated.
|
||||
They keys of the dict are the temperature string ('294K') for each
|
||||
set of energies
|
||||
fission_energy : None or openmc.data.FissionEnergyRelease
|
||||
The energy released by fission, tabulated by component (e.g. prompt
|
||||
neutrons or beta particles) and dependent on incident neutron energy
|
||||
mass_number : int
|
||||
Number of nucleons in the nucleus
|
||||
metastable : int
|
||||
Metastable state of the nucleus. A value of zero indicates ground state.
|
||||
name : str
|
||||
Name of the nuclide using the GND naming convention
|
||||
reactions : collections.OrderedDict
|
||||
Contains the cross sections, secondary angle and energy distributions,
|
||||
and other associated data for each reaction. The keys are the MT values
|
||||
and the values are Reaction objects.
|
||||
summed_reactions : collections.OrderedDict
|
||||
Contains summed cross sections, e.g., the total cross section. The keys
|
||||
are the MT values and the values are Reaction objects.
|
||||
temperatures : list of str
|
||||
List of string representations the temperatures of the target nuclide
|
||||
in the data set. The temperatures are strings of the temperature,
|
||||
rounded to the nearest integer; e.g., '294K'
|
||||
kTs : Iterable of float
|
||||
List of temperatures of the target nuclide in the data set.
|
||||
The temperatures have units of MeV.
|
||||
urr : dict
|
||||
Dictionary whose keys are temperatures (e.g., '294K') and values are
|
||||
unresolved resonance region probability tables.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, name, atomic_number, mass_number, metastable,
|
||||
atomic_weight_ratio, kTs):
|
||||
self.name = name
|
||||
self.atomic_number = atomic_number
|
||||
self.mass_number = mass_number
|
||||
self.metastable = metastable
|
||||
self.atomic_weight_ratio = atomic_weight_ratio
|
||||
self.kTs = kTs
|
||||
self.energy = {}
|
||||
self._fission_energy = None
|
||||
self.reactions = OrderedDict()
|
||||
self.summed_reactions = OrderedDict()
|
||||
self._urr = {}
|
||||
|
||||
def __contains__(self, mt):
|
||||
return mt in self.reactions or mt in self.summed_reactions
|
||||
|
||||
def __getitem__(self, mt):
|
||||
if mt in self.reactions:
|
||||
return self.reactions[mt]
|
||||
elif mt in self.summed_reactions:
|
||||
return self.summed_reactions[mt]
|
||||
else:
|
||||
raise KeyError('No reaction with MT={}.'.format(mt))
|
||||
|
||||
def __repr__(self):
|
||||
return "<IncidentNeutron: {}>".format(self.name)
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.reactions.values())
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def atomic_number(self):
|
||||
return self._atomic_number
|
||||
|
||||
@property
|
||||
def mass_number(self):
|
||||
return self._mass_number
|
||||
|
||||
@property
|
||||
def metastable(self):
|
||||
return self._metastable
|
||||
|
||||
@property
|
||||
def atomic_weight_ratio(self):
|
||||
return self._atomic_weight_ratio
|
||||
|
||||
@property
|
||||
def fission_energy(self):
|
||||
return self._fission_energy
|
||||
|
||||
@property
|
||||
def reactions(self):
|
||||
return self._reactions
|
||||
|
||||
@property
|
||||
def summed_reactions(self):
|
||||
return self._summed_reactions
|
||||
|
||||
@property
|
||||
def urr(self):
|
||||
return self._urr
|
||||
|
||||
@property
|
||||
def temperatures(self):
|
||||
return ["{}K".format(int(round(kT / K_BOLTZMANN))) for kT in self.kTs]
|
||||
|
||||
@name.setter
|
||||
def name(self, name):
|
||||
cv.check_type('name', name, basestring)
|
||||
self._name = name
|
||||
|
||||
@property
|
||||
def atomic_symbol(self):
|
||||
return ATOMIC_SYMBOL[self.atomic_number]
|
||||
|
||||
@atomic_number.setter
|
||||
def atomic_number(self, atomic_number):
|
||||
cv.check_type('atomic number', atomic_number, Integral)
|
||||
cv.check_greater_than('atomic number', atomic_number, 0)
|
||||
self._atomic_number = atomic_number
|
||||
|
||||
@mass_number.setter
|
||||
def mass_number(self, mass_number):
|
||||
cv.check_type('mass number', mass_number, Integral)
|
||||
cv.check_greater_than('mass number', mass_number, 0, True)
|
||||
self._mass_number = mass_number
|
||||
|
||||
@metastable.setter
|
||||
def metastable(self, metastable):
|
||||
cv.check_type('metastable', metastable, Integral)
|
||||
cv.check_greater_than('metastable', metastable, 0, True)
|
||||
self._metastable = metastable
|
||||
|
||||
@atomic_weight_ratio.setter
|
||||
def atomic_weight_ratio(self, atomic_weight_ratio):
|
||||
cv.check_type('atomic weight ratio', atomic_weight_ratio, Real)
|
||||
cv.check_greater_than('atomic weight ratio', atomic_weight_ratio, 0.0)
|
||||
self._atomic_weight_ratio = atomic_weight_ratio
|
||||
|
||||
@fission_energy.setter
|
||||
def fission_energy(self, fission_energy):
|
||||
cv.check_type('fission energy release', fission_energy,
|
||||
FissionEnergyRelease)
|
||||
self._fission_energy = fission_energy
|
||||
|
||||
@reactions.setter
|
||||
def reactions(self, reactions):
|
||||
cv.check_type('reactions', reactions, Mapping)
|
||||
self._reactions = reactions
|
||||
|
||||
@summed_reactions.setter
|
||||
def summed_reactions(self, summed_reactions):
|
||||
cv.check_type('summed reactions', summed_reactions, Mapping)
|
||||
self._summed_reactions = summed_reactions
|
||||
|
||||
@urr.setter
|
||||
def urr(self, urr):
|
||||
cv.check_type('probability table dictionary', urr, MutableMapping)
|
||||
for key, value in urr:
|
||||
cv.check_type('probability table temperature', key, basestring)
|
||||
cv.check_type('probability tables', value, ProbabilityTables)
|
||||
self._urr = urr
|
||||
|
||||
def add_temperature_from_ace(self, ace_or_filename, metastable_scheme='nndc'):
|
||||
"""Append data from an ACE file at a different temperature.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace_or_filename : openmc.data.ace.Table or str
|
||||
ACE table to read from. If given as a string, it is assumed to be
|
||||
the filename for the ACE file.
|
||||
metastable_scheme : {'nndc', 'mcnp'}
|
||||
Determine how ZAID identifiers are to be interpreted in the case of
|
||||
a metastable nuclide. Because the normal ZAID (=1000*Z + A) does not
|
||||
encode metastable information, different conventions are used among
|
||||
different libraries. In MCNP libraries, the convention is to add 400
|
||||
for a metastable nuclide except for Am242m, for which 95242 is
|
||||
metastable and 95642 (or 1095242 in newer libraries) is the ground
|
||||
state. For NNDC libraries, ZAID is given as 1000*Z + A + 100*m.
|
||||
|
||||
"""
|
||||
|
||||
data = IncidentNeutron.from_ace(ace_or_filename, metastable_scheme)
|
||||
|
||||
# Check if temprature already exists
|
||||
strT = data.temperatures[0]
|
||||
if strT in self.temperatures:
|
||||
warn('Cross sections at T={} already exist.'.format(strT))
|
||||
return
|
||||
|
||||
# Check that name matches
|
||||
if data.name != self.name:
|
||||
raise ValueError('Data provided for an incorrect nuclide.')
|
||||
|
||||
# Add temperature
|
||||
self.kTs += data.kTs
|
||||
|
||||
# Add energy grid
|
||||
self.energy[strT] = data.energy[strT]
|
||||
|
||||
# Add normal and summed reactions
|
||||
for mt in chain(data.reactions, data.summed_reactions):
|
||||
if mt in self:
|
||||
self[mt].xs[strT] = data[mt].xs[strT]
|
||||
else:
|
||||
warn("Tried to add cross sections for MT={} at T={} but this "
|
||||
"reaction doesn't exist.".format(mt, strT))
|
||||
|
||||
# Add probability tables
|
||||
if strT in data.urr:
|
||||
self.urr[strT] = data.urr[strT]
|
||||
|
||||
def get_reaction_components(self, mt):
|
||||
"""Determine what reactions make up summed reaction.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
mt : int
|
||||
ENDF MT number of the reaction to find components of.
|
||||
|
||||
Returns
|
||||
-------
|
||||
mts : list of int
|
||||
ENDF MT numbers of reactions that make up the summed reaction and
|
||||
have cross sections provided.
|
||||
|
||||
"""
|
||||
if mt in self.reactions:
|
||||
return [mt]
|
||||
elif mt in SUM_RULES:
|
||||
mts = SUM_RULES[mt]
|
||||
complete = False
|
||||
while not complete:
|
||||
new_mts = []
|
||||
complete = True
|
||||
for i, mt_i in enumerate(mts):
|
||||
if mt_i in self.reactions:
|
||||
new_mts.append(mt_i)
|
||||
elif mt_i in SUM_RULES:
|
||||
new_mts += SUM_RULES[mt_i]
|
||||
complete = False
|
||||
mts = new_mts
|
||||
return mts
|
||||
|
||||
def export_to_hdf5(self, path, mode='a'):
|
||||
"""Export table to an HDF5 file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
path : str
|
||||
Path to write HDF5 file to
|
||||
mode : {'r', r+', 'w', 'x', 'a'}
|
||||
Mode that is used to open the HDF5 file. This is the second argument
|
||||
to the :class:`h5py.File` constructor.
|
||||
|
||||
"""
|
||||
|
||||
f = h5py.File(path, mode, libver='latest')
|
||||
|
||||
# Write basic data
|
||||
g = f.create_group(self.name)
|
||||
g.attrs['Z'] = self.atomic_number
|
||||
g.attrs['A'] = self.mass_number
|
||||
g.attrs['metastable'] = self.metastable
|
||||
g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio
|
||||
ktg = g.create_group('kTs')
|
||||
for i, temperature in enumerate(self.temperatures):
|
||||
ktg.create_dataset(temperature, data=self.kTs[i])
|
||||
|
||||
# Write energy grid
|
||||
eg = g.create_group('energy')
|
||||
for temperature in self.temperatures:
|
||||
eg.create_dataset(temperature, data=self.energy[temperature])
|
||||
|
||||
# Write reaction data
|
||||
rxs_group = g.create_group('reactions')
|
||||
for rx in self.reactions.values():
|
||||
rx_group = rxs_group.create_group('reaction_{:03}'.format(rx.mt))
|
||||
rx.to_hdf5(rx_group)
|
||||
|
||||
# Write total nu data if available
|
||||
if len(rx.derived_products) > 0 and 'total_nu' not in g:
|
||||
tgroup = g.create_group('total_nu')
|
||||
rx.derived_products[0].to_hdf5(tgroup)
|
||||
|
||||
# Write unresolved resonance probability tables
|
||||
if self.urr:
|
||||
urr_group = g.create_group('urr')
|
||||
for temperature, urr in self.urr.items():
|
||||
tgroup = urr_group.create_group(temperature)
|
||||
urr.to_hdf5(tgroup)
|
||||
|
||||
# Write fission energy release data
|
||||
if self.fission_energy is not None:
|
||||
fer_group = g.create_group('fission_energy_release')
|
||||
self.fission_energy.to_hdf5(fer_group)
|
||||
|
||||
f.close()
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group_or_filename):
|
||||
"""Generate continuous-energy neutron interaction data from HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group_or_filename : h5py.Group or str
|
||||
HDF5 group containing interaction data. If given as a string, it is
|
||||
assumed to be the filename for the HDF5 file, and the first group is
|
||||
used to read from.
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.IncidentNeutron
|
||||
Continuous-energy neutron interaction data
|
||||
|
||||
"""
|
||||
if isinstance(group_or_filename, h5py.Group):
|
||||
group = group_or_filename
|
||||
else:
|
||||
h5file = h5py.File(group_or_filename, 'r')
|
||||
group = list(h5file.values())[0]
|
||||
|
||||
name = group.name[1:]
|
||||
atomic_number = group.attrs['Z']
|
||||
mass_number = group.attrs['A']
|
||||
metastable = group.attrs['metastable']
|
||||
atomic_weight_ratio = group.attrs['atomic_weight_ratio']
|
||||
kTg = group['kTs']
|
||||
kTs = []
|
||||
for temp in kTg:
|
||||
kTs.append(kTg[temp].value)
|
||||
|
||||
data = cls(name, atomic_number, mass_number, metastable,
|
||||
atomic_weight_ratio, kTs)
|
||||
|
||||
# Read energy grid
|
||||
e_group = group['energy']
|
||||
for temperature, dset in e_group.items():
|
||||
data.energy[temperature] = dset.value
|
||||
|
||||
# Read reaction data
|
||||
rxs_group = group['reactions']
|
||||
for name, obj in sorted(rxs_group.items()):
|
||||
if name.startswith('reaction_'):
|
||||
rx = Reaction.from_hdf5(obj, data.energy)
|
||||
data.reactions[rx.mt] = rx
|
||||
|
||||
# Read total nu data if available
|
||||
if rx.mt in (18, 19, 20, 21, 38) and 'total_nu' in group:
|
||||
tgroup = group['total_nu']
|
||||
rx.derived_products.append(Product.from_hdf5(tgroup))
|
||||
|
||||
# Build summed reactions. Start from the highest MT number because
|
||||
# high MTs never depend on lower MTs.
|
||||
for mt_sum in sorted(SUM_RULES, reverse=True):
|
||||
if mt_sum not in data:
|
||||
rxs = [data[mt] for mt in SUM_RULES[mt_sum] if mt in data]
|
||||
if len(rxs) > 0:
|
||||
data.summed_reactions[mt_sum] = rx = Reaction(mt_sum)
|
||||
for T in data.temperatures:
|
||||
rx.xs[T] = Sum([rx_i.xs[T] for rx_i in rxs])
|
||||
|
||||
# Read unresolved resonance probability tables
|
||||
if 'urr' in group:
|
||||
urr_group = group['urr']
|
||||
for temperature, tgroup in urr_group.items():
|
||||
data.urr[temperature] = ProbabilityTables.from_hdf5(tgroup)
|
||||
|
||||
# Read fission energy release data
|
||||
if 'fission_energy_release' in group:
|
||||
fer_group = group['fission_energy_release']
|
||||
data.fission_energy = FissionEnergyRelease.from_hdf5(fer_group)
|
||||
|
||||
return data
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace_or_filename, metastable_scheme='nndc'):
|
||||
"""Generate incident neutron continuous-energy data from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace_or_filename : openmc.data.ace.Table or str
|
||||
ACE table to read from. If the value is a string, it is assumed to
|
||||
be the filename for the ACE file.
|
||||
metastable_scheme : {'nndc', 'mcnp'}
|
||||
Determine how ZAID identifiers are to be interpreted in the case of
|
||||
a metastable nuclide. Because the normal ZAID (=1000*Z + A) does not
|
||||
encode metastable information, different conventions are used among
|
||||
different libraries. In MCNP libraries, the convention is to add 400
|
||||
for a metastable nuclide except for Am242m, for which 95242 is
|
||||
metastable and 95642 (or 1095242 in newer libraries) is the ground
|
||||
state. For NNDC libraries, ZAID is given as 1000*Z + A + 100*m.
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.IncidentNeutron
|
||||
Incident neutron continuous-energy data
|
||||
|
||||
"""
|
||||
|
||||
# First obtain the data for the first provided ACE table/file
|
||||
if isinstance(ace_or_filename, Table):
|
||||
ace = ace_or_filename
|
||||
else:
|
||||
ace = get_table(ace_or_filename)
|
||||
|
||||
# If mass number hasn't been specified, make an educated guess
|
||||
zaid, xs = ace.name.split('.')
|
||||
name, element, Z, mass_number, metastable = \
|
||||
_get_metadata(int(zaid), metastable_scheme)
|
||||
|
||||
# Assign temperature to the running list
|
||||
kTs = [ace.temperature]
|
||||
|
||||
data = cls(name, Z, mass_number, metastable,
|
||||
ace.atomic_weight_ratio, kTs)
|
||||
|
||||
# Get string of temperature to use as a dictionary key
|
||||
strT = data.temperatures[0]
|
||||
|
||||
# Read energy grid
|
||||
n_energy = ace.nxs[3]
|
||||
energy = ace.xss[ace.jxs[1]:ace.jxs[1] + n_energy]
|
||||
data.energy[strT] = energy
|
||||
total_xs = ace.xss[ace.jxs[1] + n_energy:ace.jxs[1] + 2 * n_energy]
|
||||
absorption_xs = ace.xss[ace.jxs[1] + 2 * n_energy:ace.jxs[1] +
|
||||
3 * n_energy]
|
||||
|
||||
# Create summed reactions (total and absorption)
|
||||
total = Reaction(1)
|
||||
total.xs[strT] = Tabulated1D(energy, total_xs)
|
||||
data.summed_reactions[1] = total
|
||||
|
||||
if np.count_nonzero(absorption_xs) > 0:
|
||||
absorption = Reaction(27)
|
||||
absorption.xs[strT] = Tabulated1D(energy, absorption_xs)
|
||||
data.summed_reactions[27] = absorption
|
||||
|
||||
# Read each reaction
|
||||
n_reaction = ace.nxs[4] + 1
|
||||
for i in range(n_reaction):
|
||||
rx = Reaction.from_ace(ace, i)
|
||||
data.reactions[rx.mt] = rx
|
||||
|
||||
# Some photon production reactions may be assigned to MTs that don't
|
||||
# exist, usually MT=4. In this case, we create a new reaction and add
|
||||
# them
|
||||
n_photon_reactions = ace.nxs[6]
|
||||
photon_mts = ace.xss[ace.jxs[13]:ace.jxs[13] +
|
||||
n_photon_reactions].astype(int)
|
||||
|
||||
for mt in np.unique(photon_mts // 1000):
|
||||
if mt not in data:
|
||||
if mt not in SUM_RULES:
|
||||
warn('Photon production is present for MT={} but no '
|
||||
'cross section is given.'.format(mt))
|
||||
continue
|
||||
|
||||
# Create summed reaction with appropriate cross section
|
||||
rx = Reaction(mt)
|
||||
mts = data.get_reaction_components(mt)
|
||||
if len(mts) == 0:
|
||||
warn('Photon production is present for MT={} but no '
|
||||
'reaction components exist.'.format(mt))
|
||||
continue
|
||||
rx.xs[strT] = Sum([data.reactions[mt_i].xs[strT]
|
||||
for mt_i in mts])
|
||||
|
||||
# Determine summed cross section
|
||||
rx.products += _get_photon_products(ace, rx)
|
||||
data.summed_reactions[mt] = rx
|
||||
|
||||
# Read unresolved resonance probability tables
|
||||
urr = ProbabilityTables.from_ace(ace)
|
||||
if urr is not None:
|
||||
data.urr[strT] = urr
|
||||
|
||||
return data
|
||||
189
openmc/data/product.py
Normal file
189
openmc/data/product.py
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
from collections import Iterable
|
||||
from numbers import Real
|
||||
import sys
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.mixin import EqualityMixin
|
||||
from .function import Tabulated1D, Polynomial, Function1D
|
||||
from .angle_energy import AngleEnergy
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
|
||||
class Product(EqualityMixin):
|
||||
"""Secondary particle emitted in a nuclear reaction
|
||||
|
||||
Parameters
|
||||
----------
|
||||
particle : str, optional
|
||||
What particle the reaction product is. Defaults to 'neutron'.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
applicability : Iterable of openmc.data.Tabulated1D
|
||||
Probability of sampling a given distribution for this product.
|
||||
decay_rate : float
|
||||
Decay rate in inverse seconds
|
||||
distribution : Iterable of openmc.data.AngleEnergy
|
||||
Distributions of energy and angle of product.
|
||||
emission_mode : {'prompt', 'delayed', 'total'}
|
||||
Indicate whether the particle is emitted immediately or whether it
|
||||
results from the decay of reaction product (e.g., neutron emitted from a
|
||||
delayed neutron precursor). A special value of 'total' is used when the
|
||||
yield represents particles from prompt and delayed sources.
|
||||
particle : str
|
||||
What particle the reaction product is.
|
||||
yield_ : openmc.data.Function1D
|
||||
Yield of secondary particle in the reaction.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, particle='neutron'):
|
||||
self.particle = particle
|
||||
self.decay_rate = 0.0
|
||||
self.emission_mode = 'prompt'
|
||||
self.distribution = []
|
||||
self.applicability = []
|
||||
self.yield_ = Polynomial((1,)) # 0-order polynomial i.e. a constant
|
||||
|
||||
def __repr__(self):
|
||||
if isinstance(self.yield_, Real):
|
||||
return "<Product: {}, emission={}, yield={}>".format(
|
||||
self.particle, self.emission_mode, self.yield_)
|
||||
elif isinstance(self.yield_, Tabulated1D):
|
||||
if np.all(self.yield_.y == self.yield_.y[0]):
|
||||
return "<Product: {}, emission={}, yield={}>".format(
|
||||
self.particle, self.emission_mode, self.yield_.y[0])
|
||||
else:
|
||||
return "<Product: {}, emission={}, yield=tabulated>".format(
|
||||
self.particle, self.emission_mode)
|
||||
else:
|
||||
return "<Product: {}, emission={}, yield=polynomial>".format(
|
||||
self.particle, self.emission_mode)
|
||||
|
||||
@property
|
||||
def applicability(self):
|
||||
return self._applicability
|
||||
|
||||
@property
|
||||
def decay_rate(self):
|
||||
return self._decay_rate
|
||||
|
||||
@property
|
||||
def distribution(self):
|
||||
return self._distribution
|
||||
|
||||
@property
|
||||
def emission_mode(self):
|
||||
return self._emission_mode
|
||||
|
||||
@property
|
||||
def particle(self):
|
||||
return self._particle
|
||||
|
||||
@property
|
||||
def yield_(self):
|
||||
return self._yield
|
||||
|
||||
@applicability.setter
|
||||
def applicability(self, applicability):
|
||||
cv.check_type('product distribution applicability', applicability,
|
||||
Iterable, Tabulated1D)
|
||||
self._applicability = applicability
|
||||
|
||||
@decay_rate.setter
|
||||
def decay_rate(self, decay_rate):
|
||||
cv.check_type('product decay rate', decay_rate, Real)
|
||||
cv.check_greater_than('product decay rate', decay_rate, 0.0, True)
|
||||
self._decay_rate = decay_rate
|
||||
|
||||
@distribution.setter
|
||||
def distribution(self, distribution):
|
||||
cv.check_type('product angle-energy distribution', distribution,
|
||||
Iterable, AngleEnergy)
|
||||
self._distribution = distribution
|
||||
|
||||
@emission_mode.setter
|
||||
def emission_mode(self, emission_mode):
|
||||
cv.check_value('product emission mode', emission_mode,
|
||||
('prompt', 'delayed', 'total'))
|
||||
self._emission_mode = emission_mode
|
||||
|
||||
@particle.setter
|
||||
def particle(self, particle):
|
||||
cv.check_type('product particle type', particle, basestring)
|
||||
self._particle = particle
|
||||
|
||||
@yield_.setter
|
||||
def yield_(self, yield_):
|
||||
cv.check_type('product yield', yield_, Function1D)
|
||||
self._yield = yield_
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write product to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['particle'] = np.string_(self.particle)
|
||||
group.attrs['emission_mode'] = np.string_(self.emission_mode)
|
||||
if self.decay_rate > 0.0:
|
||||
group.attrs['decay_rate'] = self.decay_rate
|
||||
|
||||
# Write yield
|
||||
self.yield_.to_hdf5(group, 'yield')
|
||||
|
||||
# Write applicability/distribution
|
||||
group.attrs['n_distribution'] = len(self.distribution)
|
||||
for i, d in enumerate(self.distribution):
|
||||
dgroup = group.create_group('distribution_{}'.format(i))
|
||||
if self.applicability:
|
||||
self.applicability[i].to_hdf5(dgroup, 'applicability')
|
||||
d.to_hdf5(dgroup)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate reaction product from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.Product
|
||||
Reaction product
|
||||
|
||||
"""
|
||||
particle = group.attrs['particle'].decode()
|
||||
p = cls(particle)
|
||||
|
||||
p.emission_mode = group.attrs['emission_mode'].decode()
|
||||
if 'decay_rate' in group.attrs:
|
||||
p.decay_rate = group.attrs['decay_rate']
|
||||
|
||||
# Read yield
|
||||
p.yield_ = Function1D.from_hdf5(group['yield'])
|
||||
|
||||
# Read applicability/distribution
|
||||
n_distribution = group.attrs['n_distribution']
|
||||
distribution = []
|
||||
applicability = []
|
||||
for i in range(n_distribution):
|
||||
dgroup = group['distribution_{}'.format(i)]
|
||||
if 'applicability' in dgroup:
|
||||
applicability.append(Tabulated1D.from_hdf5(
|
||||
dgroup['applicability']))
|
||||
distribution.append(AngleEnergy.from_hdf5(dgroup))
|
||||
|
||||
p.distribution = distribution
|
||||
p.applicability = applicability
|
||||
|
||||
return p
|
||||
573
openmc/data/reaction.py
Normal file
573
openmc/data/reaction.py
Normal file
|
|
@ -0,0 +1,573 @@
|
|||
from __future__ import division, unicode_literals
|
||||
from collections import Iterable, Callable, MutableMapping
|
||||
from copy import deepcopy
|
||||
from numbers import Real, Integral
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.mixin import EqualityMixin
|
||||
from openmc.stats import Uniform
|
||||
from .angle_distribution import AngleDistribution
|
||||
from .angle_energy import AngleEnergy
|
||||
from .function import Tabulated1D, Polynomial, Function1D
|
||||
from .data import REACTION_NAME, K_BOLTZMANN
|
||||
from .product import Product
|
||||
from .uncorrelated import UncorrelatedAngleEnergy
|
||||
|
||||
|
||||
def _get_fission_products(ace):
|
||||
"""Generate fission products from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
products : list of openmc.data.Product
|
||||
Prompt and delayed fission neutrons
|
||||
derived_products : list of openmc.data.Product
|
||||
"Total" fission neutron
|
||||
|
||||
"""
|
||||
# No NU block
|
||||
if ace.jxs[2] == 0:
|
||||
return None, None
|
||||
|
||||
products = []
|
||||
derived_products = []
|
||||
|
||||
# Either prompt nu or total nu is given
|
||||
if ace.xss[ace.jxs[2]] > 0:
|
||||
whichnu = 'prompt' if ace.jxs[24] > 0 else 'total'
|
||||
|
||||
neutron = Product('neutron')
|
||||
neutron.emission_mode = whichnu
|
||||
|
||||
idx = ace.jxs[2]
|
||||
LNU = int(ace.xss[idx])
|
||||
if LNU == 1:
|
||||
# Polynomial function form of nu
|
||||
NC = int(ace.xss[idx+1])
|
||||
coefficients = ace.xss[idx+2 : idx+2+NC]
|
||||
neutron.yield_ = Polynomial(coefficients)
|
||||
elif LNU == 2:
|
||||
# Tabular data form of nu
|
||||
neutron.yield_ = Tabulated1D.from_ace(ace, idx + 1)
|
||||
|
||||
products.append(neutron)
|
||||
|
||||
# Both prompt nu and total nu
|
||||
elif ace.xss[ace.jxs[2]] < 0:
|
||||
# Read prompt neutron yield
|
||||
prompt_neutron = Product('neutron')
|
||||
prompt_neutron.emission_mode = 'prompt'
|
||||
|
||||
idx = ace.jxs[2] + 1
|
||||
LNU = int(ace.xss[idx])
|
||||
if LNU == 1:
|
||||
# Polynomial function form of nu
|
||||
NC = int(ace.xss[idx+1])
|
||||
coefficients = ace.xss[idx+2 : idx+2+NC]
|
||||
prompt_neutron.yield_ = Polynomial(coefficients)
|
||||
elif LNU == 2:
|
||||
# Tabular data form of nu
|
||||
prompt_neutron.yield_ = Tabulated1D.from_ace(ace, idx + 1)
|
||||
|
||||
# Read total neutron yield
|
||||
total_neutron = Product('neutron')
|
||||
total_neutron.emission_mode = 'total'
|
||||
|
||||
idx = ace.jxs[2] + int(abs(ace.xss[ace.jxs[2]])) + 1
|
||||
LNU = int(ace.xss[idx])
|
||||
|
||||
if LNU == 1:
|
||||
# Polynomial function form of nu
|
||||
NC = int(ace.xss[idx+1])
|
||||
coefficients = ace.xss[idx+2 : idx+2+NC]
|
||||
total_neutron.yield_ = Polynomial(coefficients)
|
||||
elif LNU == 2:
|
||||
# Tabular data form of nu
|
||||
total_neutron.yield_ = Tabulated1D.from_ace(ace, idx + 1)
|
||||
|
||||
products.append(prompt_neutron)
|
||||
derived_products.append(total_neutron)
|
||||
|
||||
# Check for delayed nu data
|
||||
if ace.jxs[24] > 0:
|
||||
yield_delayed = Tabulated1D.from_ace(ace, ace.jxs[24] + 1)
|
||||
|
||||
# Delayed neutron precursor distribution
|
||||
idx = ace.jxs[25]
|
||||
n_group = ace.nxs[8]
|
||||
total_group_probability = 0.
|
||||
for group in range(n_group):
|
||||
delayed_neutron = Product('neutron')
|
||||
delayed_neutron.emission_mode = 'delayed'
|
||||
|
||||
# Convert units of inverse shakes to inverse seconds
|
||||
delayed_neutron.decay_rate = ace.xss[idx] * 1.e8
|
||||
|
||||
group_probability = Tabulated1D.from_ace(ace, idx + 1)
|
||||
if np.all(group_probability.y == group_probability.y[0]):
|
||||
delayed_neutron.yield_ = deepcopy(yield_delayed)
|
||||
delayed_neutron.yield_.y *= group_probability.y[0]
|
||||
total_group_probability += group_probability.y[0]
|
||||
else:
|
||||
# Get union energy grid and ensure energies are within
|
||||
# interpolable range of both functions
|
||||
max_energy = min(yield_delayed.x[-1], group_probability.x[-1])
|
||||
energy = np.union1d(yield_delayed.x, group_probability.x)
|
||||
energy = energy[energy <= max_energy]
|
||||
|
||||
# Calculate group yield
|
||||
group_yield = yield_delayed(energy) * group_probability(energy)
|
||||
delayed_neutron.yield_ = Tabulated1D(energy, group_yield)
|
||||
|
||||
# Advance position
|
||||
nr = int(ace.xss[idx + 1])
|
||||
ne = int(ace.xss[idx + 2 + 2*nr])
|
||||
idx += 3 + 2*nr + 2*ne
|
||||
|
||||
# Energy distribution for delayed fission neutrons
|
||||
location_start = int(ace.xss[ace.jxs[26] + group])
|
||||
delayed_neutron.distribution.append(
|
||||
AngleEnergy.from_ace(ace, ace.jxs[27], location_start))
|
||||
|
||||
products.append(delayed_neutron)
|
||||
|
||||
# Renormalize delayed neutron yields to reflect fact that in ACE
|
||||
# file, the sum of the group probabilities is not exactly one
|
||||
for product in products[1:]:
|
||||
if total_group_probability > 0.:
|
||||
product.yield_.y /= total_group_probability
|
||||
|
||||
return products, derived_products
|
||||
|
||||
|
||||
def _get_photon_products(ace, rx):
|
||||
"""Generate photon products from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
rx : openmc.data.Reaction
|
||||
Reaction that generates photons
|
||||
|
||||
Returns
|
||||
-------
|
||||
photons : list of openmc.Products
|
||||
Photons produced from reaction with given MT
|
||||
|
||||
"""
|
||||
n_photon_reactions = ace.nxs[6]
|
||||
photon_mts = ace.xss[ace.jxs[13]:ace.jxs[13] +
|
||||
n_photon_reactions].astype(int)
|
||||
|
||||
photons = []
|
||||
for i in range(n_photon_reactions):
|
||||
# Determine corresponding reaction
|
||||
neutron_mt = photon_mts[i] // 1000
|
||||
|
||||
# Restrict to photons that match the requested MT. Note that if the
|
||||
# photon is assigned to MT=18 but the file splits fission into
|
||||
# MT=19,20,21,38, we assign the photon product to each of the individual
|
||||
# reactions
|
||||
if neutron_mt == 18:
|
||||
if rx.mt not in (18, 19, 20, 21, 38):
|
||||
continue
|
||||
elif neutron_mt != rx.mt:
|
||||
continue
|
||||
|
||||
# Create photon product and assign to reactions
|
||||
photon = Product('photon')
|
||||
|
||||
# ==================================================================
|
||||
# Photon yield / production cross section
|
||||
|
||||
loca = int(ace.xss[ace.jxs[14] + i])
|
||||
idx = ace.jxs[15] + loca - 1
|
||||
mftype = int(ace.xss[idx])
|
||||
idx += 1
|
||||
|
||||
if mftype in (12, 16):
|
||||
# Yield data taken from ENDF File 12 or 6
|
||||
mtmult = int(ace.xss[idx])
|
||||
assert mtmult == neutron_mt
|
||||
|
||||
# Read photon yield as function of energy
|
||||
photon.yield_ = Tabulated1D.from_ace(ace, idx + 1)
|
||||
|
||||
elif mftype == 13:
|
||||
# Cross section data from ENDF File 13
|
||||
|
||||
# Energy grid index at which data starts
|
||||
threshold_idx = int(ace.xss[idx]) - 1
|
||||
n_energy = int(ace.xss[idx + 1])
|
||||
energy = ace.xss[ace.jxs[1] + threshold_idx:
|
||||
ace.jxs[1] + threshold_idx + n_energy]
|
||||
|
||||
# Get photon production cross section
|
||||
photon_prod_xs = ace.xss[idx + 2:idx + 2 + n_energy]
|
||||
neutron_xs = list(rx.xs.values())[0](energy)
|
||||
idx = np.where(neutron_xs > 0.)
|
||||
|
||||
# Calculate photon yield
|
||||
yield_ = np.zeros_like(photon_prod_xs)
|
||||
yield_[idx] = photon_prod_xs[idx] / neutron_xs[idx]
|
||||
photon.yield_ = Tabulated1D(energy, yield_)
|
||||
|
||||
else:
|
||||
raise ValueError("MFTYPE must be 12, 13, 16. Got {0}".format(
|
||||
mftype))
|
||||
|
||||
# ==================================================================
|
||||
# Photon energy distribution
|
||||
|
||||
location_start = int(ace.xss[ace.jxs[18] + i])
|
||||
distribution = AngleEnergy.from_ace(ace, ace.jxs[19], location_start)
|
||||
assert isinstance(distribution, UncorrelatedAngleEnergy)
|
||||
|
||||
# ==================================================================
|
||||
# Photon angular distribution
|
||||
loc = int(ace.xss[ace.jxs[16] + i])
|
||||
|
||||
if loc == 0:
|
||||
# No angular distribution data are given for this reaction,
|
||||
# isotropic scattering is asssumed in LAB
|
||||
energy = np.array([photon.yield_.x[0], photon.yield_.x[-1]])
|
||||
mu_isotropic = Uniform(-1., 1.)
|
||||
distribution.angle = AngleDistribution(
|
||||
energy, [mu_isotropic, mu_isotropic])
|
||||
else:
|
||||
distribution.angle = AngleDistribution.from_ace(ace, ace.jxs[17], loc)
|
||||
|
||||
# Add to list of distributions
|
||||
photon.distribution.append(distribution)
|
||||
photons.append(photon)
|
||||
|
||||
return photons
|
||||
|
||||
|
||||
class Reaction(EqualityMixin):
|
||||
"""A nuclear reaction
|
||||
|
||||
A Reaction object represents a single reaction channel for a nuclide with
|
||||
an associated cross section and, if present, a secondary angle and energy
|
||||
distribution.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
mt : int
|
||||
The ENDF MT number for this reaction.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
center_of_mass : bool
|
||||
Indicates whether scattering kinematics should be performed in the
|
||||
center-of-mass or laboratory reference frame.
|
||||
grid above the threshold value in barns.
|
||||
mt : int
|
||||
The ENDF MT number for this reaction.
|
||||
q_value : float
|
||||
The Q-value of this reaction in MeV.
|
||||
threshold : float
|
||||
Threshold of the reaction in MeV
|
||||
xs : dict of str to openmc.data.Function1D
|
||||
Microscopic cross section for this reaction as a function of incident
|
||||
energy; these cross sections are provided in a dictionary where the key
|
||||
is the temperature of the cross section set.
|
||||
products : Iterable of openmc.data.Product
|
||||
Reaction products
|
||||
derived_products : Iterable of openmc.data.Product
|
||||
Derived reaction products. Used for 'total' fission neutron data when
|
||||
prompt/delayed data also exists.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, mt):
|
||||
self._center_of_mass = True
|
||||
self._q_value = 0.
|
||||
self._xs = {}
|
||||
self._products = []
|
||||
self._derived_products = []
|
||||
|
||||
self.mt = mt
|
||||
|
||||
def __repr__(self):
|
||||
if self.mt in REACTION_NAME:
|
||||
return "<Reaction: MT={} {}>".format(self.mt, REACTION_NAME[self.mt])
|
||||
else:
|
||||
return "<Reaction: MT={}>".format(self.mt)
|
||||
|
||||
@property
|
||||
def center_of_mass(self):
|
||||
return self._center_of_mass
|
||||
|
||||
@property
|
||||
def q_value(self):
|
||||
return self._q_value
|
||||
|
||||
@property
|
||||
def products(self):
|
||||
return self._products
|
||||
|
||||
@property
|
||||
def derived_products(self):
|
||||
return self._derived_products
|
||||
|
||||
@property
|
||||
def xs(self):
|
||||
return self._xs
|
||||
|
||||
@center_of_mass.setter
|
||||
def center_of_mass(self, center_of_mass):
|
||||
cv.check_type('center of mass', center_of_mass, (bool, np.bool_))
|
||||
self._center_of_mass = center_of_mass
|
||||
|
||||
@q_value.setter
|
||||
def q_value(self, q_value):
|
||||
cv.check_type('Q value', q_value, Real)
|
||||
self._q_value = q_value
|
||||
|
||||
@products.setter
|
||||
def products(self, products):
|
||||
cv.check_type('reaction products', products, Iterable, Product)
|
||||
self._products = products
|
||||
|
||||
@derived_products.setter
|
||||
def derived_products(self, derived_products):
|
||||
cv.check_type('reaction derived products', derived_products,
|
||||
Iterable, Product)
|
||||
self._derived_products = derived_products
|
||||
|
||||
@xs.setter
|
||||
def xs(self, xs):
|
||||
cv.check_type('reaction cross section dictionary', xs, MutableMapping)
|
||||
for key, value in xs.items():
|
||||
cv.check_type('reaction cross section temperature', key, basestring)
|
||||
cv.check_type('reaction cross section', value, Function1D)
|
||||
self._xs = xs
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write reaction to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
|
||||
group.attrs['mt'] = self.mt
|
||||
if self.mt in REACTION_NAME:
|
||||
group.attrs['label'] = np.string_(REACTION_NAME[self.mt])
|
||||
else:
|
||||
group.attrs['label'] = np.string_(self.mt)
|
||||
group.attrs['Q_value'] = self.q_value
|
||||
group.attrs['center_of_mass'] = 1 if self.center_of_mass else 0
|
||||
for T in self.xs:
|
||||
Tgroup = group.create_group(T)
|
||||
if self.xs[T] is not None:
|
||||
dset = Tgroup.create_dataset('xs', data=self.xs[T].y)
|
||||
if hasattr(self.xs[T], '_threshold_idx'):
|
||||
threshold_idx = self.xs[T]._threshold_idx + 1
|
||||
else:
|
||||
threshold_idx = 1
|
||||
dset.attrs['threshold_idx'] = threshold_idx
|
||||
for i, p in enumerate(self.products):
|
||||
pgroup = group.create_group('product_{}'.format(i))
|
||||
p.to_hdf5(pgroup)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group, energy):
|
||||
"""Generate reaction from an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
energy : dict
|
||||
Dictionary whose keys are temperatures (e.g., '300K') and values are
|
||||
arrays of energies at which cross sections are tabulated at.
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ace.Reaction
|
||||
Reaction data
|
||||
|
||||
"""
|
||||
|
||||
mt = group.attrs['mt']
|
||||
rx = cls(mt)
|
||||
rx.q_value = group.attrs['Q_value']
|
||||
rx.center_of_mass = bool(group.attrs['center_of_mass'])
|
||||
|
||||
# Read cross section at each temperature
|
||||
for T, Tgroup in group.items():
|
||||
if T.endswith('K'):
|
||||
if 'xs' in Tgroup:
|
||||
# Make sure temperature has associated energy grid
|
||||
if T not in energy:
|
||||
raise ValueError(
|
||||
'Could not create reaction cross section for MT={} '
|
||||
'at T={} because no corresponding energy grid '
|
||||
'exists.'.format(mt, T))
|
||||
xs = Tgroup['xs'].value
|
||||
threshold_idx = Tgroup['xs'].attrs['threshold_idx'] - 1
|
||||
tabulated_xs = Tabulated1D(energy[T][threshold_idx:], xs)
|
||||
tabulated_xs._threshold_idx = threshold_idx
|
||||
rx.xs[T] = tabulated_xs
|
||||
|
||||
# Determine number of products
|
||||
n_product = 0
|
||||
for name in group:
|
||||
if name.startswith('product_'):
|
||||
n_product += 1
|
||||
|
||||
# Read reaction products
|
||||
for i in range(n_product):
|
||||
pgroup = group['product_{}'.format(i)]
|
||||
rx.products.append(Product.from_hdf5(pgroup))
|
||||
|
||||
return rx
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace, i_reaction):
|
||||
# Get nuclide energy grid
|
||||
n_grid = ace.nxs[3]
|
||||
grid = ace.xss[ace.jxs[1]:ace.jxs[1] + n_grid]
|
||||
|
||||
# Convert data temperature to a "300.0K" number for indexing
|
||||
# temperature data
|
||||
strT = str(int(round(ace.temperature / K_BOLTZMANN))) + "K"
|
||||
|
||||
if i_reaction > 0:
|
||||
mt = int(ace.xss[ace.jxs[3] + i_reaction - 1])
|
||||
rx = cls(mt)
|
||||
|
||||
# Get Q-value of reaction
|
||||
rx.q_value = ace.xss[ace.jxs[4] + i_reaction - 1]
|
||||
|
||||
# ==================================================================
|
||||
# CROSS SECTION
|
||||
|
||||
# Get locator for cross-section data
|
||||
loc = int(ace.xss[ace.jxs[6] + i_reaction - 1])
|
||||
|
||||
# Determine starting index on energy grid
|
||||
threshold_idx = int(ace.xss[ace.jxs[7] + loc - 1]) - 1
|
||||
|
||||
# Determine number of energies in reaction
|
||||
n_energy = int(ace.xss[ace.jxs[7] + loc])
|
||||
energy = grid[threshold_idx:threshold_idx + n_energy]
|
||||
|
||||
# Read reaction cross section
|
||||
xs = ace.xss[ace.jxs[7] + loc + 1:ace.jxs[7] + loc + 1 + n_energy]
|
||||
|
||||
# Fix negatives -- known issue for Y89 in JEFF 3.2
|
||||
if np.any(xs < 0.0):
|
||||
warn("Negative cross sections found for MT={} in {}. Setting "
|
||||
"to zero.".format(rx.mt, ace.name))
|
||||
xs[xs < 0.0] = 0.0
|
||||
|
||||
tabulated_xs = Tabulated1D(energy, xs)
|
||||
tabulated_xs._threshold_idx = threshold_idx
|
||||
rx.xs[strT] = tabulated_xs
|
||||
|
||||
# ==================================================================
|
||||
# YIELD AND ANGLE-ENERGY DISTRIBUTION
|
||||
|
||||
# Determine multiplicity
|
||||
ty = int(ace.xss[ace.jxs[5] + i_reaction - 1])
|
||||
rx.center_of_mass = (ty < 0)
|
||||
if i_reaction < ace.nxs[5] + 1:
|
||||
if ty != 19:
|
||||
if abs(ty) > 100:
|
||||
# Energy-dependent neutron yield
|
||||
idx = ace.jxs[11] + abs(ty) - 101
|
||||
yield_ = Tabulated1D.from_ace(ace, idx)
|
||||
else:
|
||||
# 0-order polynomial i.e. a constant
|
||||
yield_ = Polynomial((abs(ty),))
|
||||
|
||||
neutron = Product('neutron')
|
||||
neutron.yield_ = yield_
|
||||
rx.products.append(neutron)
|
||||
else:
|
||||
assert mt in (18, 19, 20, 21, 38)
|
||||
rx.products, rx.derived_products = _get_fission_products(ace)
|
||||
|
||||
for p in rx.products:
|
||||
if p.emission_mode in ('prompt', 'total'):
|
||||
neutron = p
|
||||
break
|
||||
else:
|
||||
raise Exception("Couldn't find prompt/total fission neutron")
|
||||
|
||||
# Determine locator for ith energy distribution
|
||||
lnw = int(ace.xss[ace.jxs[10] + i_reaction - 1])
|
||||
while lnw > 0:
|
||||
# Applicability of this distribution
|
||||
neutron.applicability.append(Tabulated1D.from_ace(
|
||||
ace, ace.jxs[11] + lnw + 2))
|
||||
|
||||
# Read energy distribution data
|
||||
neutron.distribution.append(AngleEnergy.from_ace(
|
||||
ace, ace.jxs[11], lnw, rx))
|
||||
|
||||
lnw = int(ace.xss[ace.jxs[11] + lnw - 1])
|
||||
|
||||
else:
|
||||
# Elastic scattering
|
||||
mt = 2
|
||||
rx = cls(mt)
|
||||
|
||||
# Get elastic cross section values
|
||||
elastic_xs = ace.xss[ace.jxs[1] + 3*n_grid:ace.jxs[1] + 4*n_grid]
|
||||
|
||||
# Fix negatives -- known issue for Ti46,49,50 in JEFF 3.2
|
||||
if np.any(elastic_xs < 0.0):
|
||||
warn("Negative elastic scattering cross section found for {}. "
|
||||
"Setting to zero.".format(ace.name))
|
||||
elastic_xs[elastic_xs < 0.0] = 0.0
|
||||
|
||||
tabulated_xs = Tabulated1D(grid, elastic_xs)
|
||||
tabulated_xs._threshold_idx = 0
|
||||
rx.xs[strT] = tabulated_xs
|
||||
|
||||
# No energy distribution for elastic scattering
|
||||
neutron = Product('neutron')
|
||||
neutron.distribution.append(UncorrelatedAngleEnergy())
|
||||
rx.products.append(neutron)
|
||||
|
||||
# ======================================================================
|
||||
# ANGLE DISTRIBUTION (FOR UNCORRELATED)
|
||||
|
||||
if i_reaction < ace.nxs[5] + 1:
|
||||
# Check if angular distribution data exist
|
||||
loc = int(ace.xss[ace.jxs[8] + i_reaction])
|
||||
if loc <= 0:
|
||||
# Angular distribution is either given as part of a product
|
||||
# angle-energy distribution or is not given at all (in which
|
||||
# case isotropic scattering is assumed)
|
||||
angle_dist = None
|
||||
else:
|
||||
angle_dist = AngleDistribution.from_ace(ace, ace.jxs[9], loc)
|
||||
|
||||
# Apply angular distribution to each uncorrelated angle-energy
|
||||
# distribution
|
||||
if angle_dist is not None:
|
||||
for d in neutron.distribution:
|
||||
d.angle = angle_dist
|
||||
|
||||
# ======================================================================
|
||||
# PHOTON PRODUCTION
|
||||
|
||||
rx.products += _get_photon_products(ace, rx)
|
||||
|
||||
return rx
|
||||
533
openmc/data/thermal.py
Normal file
533
openmc/data/thermal.py
Normal file
|
|
@ -0,0 +1,533 @@
|
|||
from collections import Iterable
|
||||
from difflib import get_close_matches
|
||||
from numbers import Real
|
||||
from warnings import warn
|
||||
|
||||
import numpy as np
|
||||
import h5py
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.mixin import EqualityMixin
|
||||
from .data import K_BOLTZMANN, ATOMIC_SYMBOL
|
||||
from .ace import Table, get_table
|
||||
from .angle_energy import AngleEnergy
|
||||
from .function import Tabulated1D
|
||||
from .correlated import CorrelatedAngleEnergy
|
||||
from openmc.stats import Discrete, Tabular
|
||||
|
||||
|
||||
_THERMAL_NAMES = {'al': 'c_Al27', 'al27': 'c_Al27',
|
||||
'be': 'c_Be',
|
||||
'beo': 'c_BeO',
|
||||
'bebeo': 'c_Be_in_BeO', 'be-o': 'c_Be_in_BeO', 'be/o': 'c_Be_in_BeO',
|
||||
'benz': 'c_Benzine',
|
||||
'cah': 'c_Ca_in_CaH2',
|
||||
'dd2o': 'c_D_in_D2O', 'hwtr': 'c_D_in_D2O', 'hw': 'c_D_in_D2O',
|
||||
'fe': 'c_Fe56', 'fe56': 'c_Fe56',
|
||||
'graph': 'c_Graphite', 'grph': 'c_Graphite', 'gr': 'c_Graphite',
|
||||
'hca': 'c_H_in_CaH2',
|
||||
'hch2': 'c_H_in_CH2', 'poly': 'c_H_in_CH2', 'pol': 'c_H_in_CH2',
|
||||
'hh2o': 'c_H_in_H2O', 'lwtr': 'c_H_in_H2O', 'lw': 'c_H_in_H2O',
|
||||
'hzrh': 'c_H_in_ZrH', 'h-zr': 'c_H_in_ZrH', 'h/zr': 'c_H_in_ZrH', 'hzr': 'c_H_in_ZrH',
|
||||
'lch4': 'c_liquid_CH4', 'lmeth': 'c_liquid_CH4',
|
||||
'mg': 'c_Mg24',
|
||||
'obeo': 'c_O_in_BeO', 'o-be': 'c_O_in_BeO', 'o/be': 'c_O_in_BeO',
|
||||
'orthod': 'c_ortho_D', 'dortho': 'c_ortho_D',
|
||||
'orthoh': 'c_ortho_H', 'hortho': 'c_ortho_H',
|
||||
'ouo2': 'c_O_in_UO2', 'o2-u': 'c_O_in_UO2', 'o2/u': 'c_O_in_UO2',
|
||||
'sio2': 'c_SiO2',
|
||||
'parad': 'c_para_D', 'dpara': 'c_para_D',
|
||||
'parah': 'c_para_H', 'hpara': 'c_para_H',
|
||||
'sch4': 'c_solid_CH4', 'smeth': 'c_solid_CH4',
|
||||
'uuo2': 'c_U_in_UO2', 'u-o2': 'c_U_in_UO2', 'u/o2': 'c_U_in_UO2',
|
||||
'zrzrh': 'c_Zr_in_ZrH', 'zr-h': 'c_Zr_in_ZrH', 'zr/h': 'c_Zr_in_ZrH'}
|
||||
|
||||
|
||||
def get_thermal_name(name):
|
||||
"""Get proper S(a,b) table name, e.g. 'HH2O' -> 'c_H_in_H2O'"""
|
||||
|
||||
if name in _THERMAL_NAMES.values():
|
||||
return name
|
||||
elif name.lower() in _THERMAL_NAMES:
|
||||
return _THERMAL_NAMES[name.lower()]
|
||||
else:
|
||||
# Make an educated guess?? This actually works well for
|
||||
# JEFF-3.2 which stupidly uses names like lw00.32t,
|
||||
# lw01.32t, etc. for different temperatures
|
||||
matches = get_close_matches(
|
||||
name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5)
|
||||
if len(matches) > 0:
|
||||
return _THERMAL_NAMES[matches[0]]
|
||||
else:
|
||||
# OK, we give up. Just use the ACE name.
|
||||
return 'c_' + name
|
||||
|
||||
|
||||
class CoherentElastic(EqualityMixin):
|
||||
r"""Coherent elastic scattering data from a crystalline material
|
||||
|
||||
Parameters
|
||||
----------
|
||||
bragg_edges : Iterable of float
|
||||
Bragg edge energies in MeV
|
||||
factors : Iterable of float
|
||||
Partial sum of structure factors, :math:`\sum\limits_{i=1}^{E_i<E} S_i`
|
||||
|
||||
Attributes
|
||||
----------
|
||||
bragg_edges : Iterable of float
|
||||
Bragg edge energies in MeV
|
||||
factors : Iterable of float
|
||||
Partial sum of structure factors, :math:`\sum\limits_{i=1}^{E_i<E} S_i`
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, bragg_edges, factors):
|
||||
self.bragg_edges = bragg_edges
|
||||
self.factors = factors
|
||||
|
||||
def __call__(self, E):
|
||||
if isinstance(E, Iterable):
|
||||
E = np.asarray(E)
|
||||
idx = np.searchsorted(self.bragg_edges, E)
|
||||
return self.factors[idx] / E
|
||||
|
||||
def __len__(self):
|
||||
return len(self.bragg_edges)
|
||||
|
||||
@property
|
||||
def bragg_edges(self):
|
||||
return self._bragg_edges
|
||||
|
||||
@property
|
||||
def factors(self):
|
||||
return self._factors
|
||||
|
||||
@bragg_edges.setter
|
||||
def bragg_edges(self, bragg_edges):
|
||||
cv.check_type('Bragg edges', bragg_edges, Iterable, Real)
|
||||
self._bragg_edges = np.asarray(bragg_edges)
|
||||
|
||||
@factors.setter
|
||||
def factors(self, factors):
|
||||
cv.check_type('structure factor cumulative sums', factors,
|
||||
Iterable, Real)
|
||||
self._factors = np.asarray(factors)
|
||||
|
||||
def to_hdf5(self, group, name):
|
||||
"""Write coherent elastic scattering to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
name : str
|
||||
Name of the dataset to create
|
||||
|
||||
"""
|
||||
dataset = group.create_dataset(name, data=np.vstack(
|
||||
[self.bragg_edges, self.factors]))
|
||||
dataset.attrs['type'] = np.string_('bragg')
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, dataset):
|
||||
"""Read coherent elastic scattering from an HDF5 dataset
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Dataset
|
||||
HDF5 group to write to
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.CoherentElastic
|
||||
Coherent elastic scattering cross section
|
||||
|
||||
"""
|
||||
bragg_edges = dataset.value[0, :]
|
||||
factors = dataset.value[1, :]
|
||||
return cls(bragg_edges, factors)
|
||||
|
||||
|
||||
class ThermalScattering(EqualityMixin):
|
||||
"""A ThermalScattering object contains thermal scattering data as represented by
|
||||
an S(alpha, beta) table.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
name : str
|
||||
Name of the material using GND convention, e.g. c_H_in_H2O
|
||||
atomic_weight_ratio : float
|
||||
Atomic mass ratio of the target nuclide.
|
||||
kTs : Iterable of float
|
||||
List of temperatures of the target nuclide in the data set.
|
||||
The temperatures have units of MeV.
|
||||
|
||||
Attributes
|
||||
----------
|
||||
atomic_weight_ratio : float
|
||||
Atomic mass ratio of the target nuclide.
|
||||
elastic_xs : openmc.data.Tabulated1D or openmc.data.CoherentElastic
|
||||
Elastic scattering cross section derived in the coherent or incoherent
|
||||
approximation
|
||||
inelastic_xs : openmc.data.Tabulated1D
|
||||
Inelastic scattering cross section derived in the incoherent
|
||||
approximation
|
||||
name : str
|
||||
Name of the material using GND convention, e.g. c_H_in_H2O
|
||||
temperatures : Iterable of str
|
||||
List of string representations the temperatures of the target nuclide
|
||||
in the data set. The temperatures are strings of the temperature,
|
||||
rounded to the nearest integer; e.g., '294K'
|
||||
kTs : Iterable of float
|
||||
List of temperatures of the target nuclide in the data set.
|
||||
The temperatures have units of MeV.
|
||||
nuclides : Iterable of str
|
||||
Nuclide names that the thermal scattering data applies to
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, name, atomic_weight_ratio, kTs):
|
||||
self.name = name
|
||||
self.atomic_weight_ratio = atomic_weight_ratio
|
||||
self.kTs = kTs
|
||||
self.elastic_xs = {}
|
||||
self.elastic_mu_out = {}
|
||||
self.inelastic_xs = {}
|
||||
self.inelastic_e_out = {}
|
||||
self.inelastic_mu_out = {}
|
||||
self.inelastic_dist = {}
|
||||
self.secondary_mode = None
|
||||
self.nuclides = []
|
||||
|
||||
def __repr__(self):
|
||||
if hasattr(self, 'name'):
|
||||
return "<Thermal Scattering Data: {0}>".format(self.name)
|
||||
else:
|
||||
return "<Thermal Scattering Data>"
|
||||
|
||||
@property
|
||||
def temperatures(self):
|
||||
return ["{}K".format(int(round(kT / K_BOLTZMANN))) for kT in self.kTs]
|
||||
|
||||
def export_to_hdf5(self, path, mode='a'):
|
||||
"""Export table to an HDF5 file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
path : str
|
||||
Path to write HDF5 file to
|
||||
mode : {'r', r+', 'w', 'x', 'a'}
|
||||
Mode that is used to open the HDF5 file. This is the second argument
|
||||
to the :class:`h5py.File` constructor.
|
||||
|
||||
"""
|
||||
|
||||
f = h5py.File(path, mode, libver='latest')
|
||||
|
||||
# Write basic data
|
||||
g = f.create_group(self.name)
|
||||
g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio
|
||||
g.attrs['nuclides'] = np.array(self.nuclides, dtype='S')
|
||||
g.attrs['secondary_mode'] = np.string_(self.secondary_mode)
|
||||
ktg = g.create_group('kTs')
|
||||
for i, temperature in enumerate(self.temperatures):
|
||||
ktg.create_dataset(temperature, data=self.kTs[i])
|
||||
|
||||
for T in self.temperatures:
|
||||
Tg = g.create_group(T)
|
||||
# Write thermal elastic scattering
|
||||
if self.elastic_xs:
|
||||
elastic_group = Tg.create_group('elastic')
|
||||
|
||||
self.elastic_xs[T].to_hdf5(elastic_group, 'xs')
|
||||
if self.elastic_mu_out:
|
||||
elastic_group.create_dataset('mu_out',
|
||||
data=self.elastic_mu_out[T])
|
||||
|
||||
# Write thermal inelastic scattering
|
||||
if self.inelastic_xs:
|
||||
inelastic_group = Tg.create_group('inelastic')
|
||||
self.inelastic_xs[T].to_hdf5(inelastic_group, 'xs')
|
||||
if self.secondary_mode in ('equal', 'skewed'):
|
||||
inelastic_group.create_dataset('energy_out',
|
||||
data=self.inelastic_e_out[T])
|
||||
inelastic_group.create_dataset('mu_out',
|
||||
data=self.inelastic_mu_out[T])
|
||||
elif self.secondary_mode == 'continuous':
|
||||
self.inelastic_dist[T].to_hdf5(inelastic_group)
|
||||
|
||||
f.close()
|
||||
|
||||
def add_temperature_from_ace(self, ace_or_filename, name=None):
|
||||
"""Add data to the ThermalScattering object from an ACE file at a
|
||||
different temperature.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace_or_filename : openmc.data.ace.Table or str
|
||||
ACE table to read from. If given as a string, it is assumed to be
|
||||
the filename for the ACE file.
|
||||
name : str
|
||||
GND-conforming name of the material, e.g. c_H_in_H2O. If none is
|
||||
passed, the appropriate name is guessed based on the name of the ACE
|
||||
table.
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ThermalScattering
|
||||
Thermal scattering data
|
||||
|
||||
"""
|
||||
data = ThermalScattering.from_ace(ace_or_filename, name)
|
||||
|
||||
# Check if temprature already exists
|
||||
strT = data.temperatures[0]
|
||||
if strT in self.temperatures:
|
||||
warn('S(a,b) data at T={} already exists.'.format(strT))
|
||||
return
|
||||
|
||||
# Check that name matches
|
||||
if data.name != self.name:
|
||||
raise ValueError('Data provided for an incorrect material.')
|
||||
|
||||
# Add temperature
|
||||
self.kTs += data.kTs
|
||||
|
||||
# Add inelastic cross section and distributions
|
||||
if strT in data.inelastic_xs:
|
||||
self.inelastic_xs[strT] = data.inelastic_xs[strT]
|
||||
if strT in data.inelastic_e_out:
|
||||
self.inelastic_e_out[strT] = data.inelastic_e_out[strT]
|
||||
if strT in data.inelastic_mu_out:
|
||||
self.inelastic_mu_out[strT] = data.inelastic_mu_out[strT]
|
||||
if strT in data.inelastic_dist:
|
||||
self.inelastic_dist[strT] = data.inelastic_dist[strT]
|
||||
|
||||
# Add elastic cross sectoin and angular distribution
|
||||
if strT in data.elastic_xs:
|
||||
self.elastic_xs[strT] = data.elastic_xs[strT]
|
||||
if strT in data.elastic_mu_out:
|
||||
self.elastic_mu_out[strT] = data.elastic_mu_out[strT]
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group_or_filename):
|
||||
"""Generate thermal scattering data from HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group_or_filename : h5py.Group or str
|
||||
HDF5 group containing interaction data. If given as a string, it is
|
||||
assumed to be the filename for the HDF5 file, and the first group
|
||||
is used to read from.
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ThermalScattering
|
||||
Neutron thermal scattering data
|
||||
|
||||
"""
|
||||
if isinstance(group_or_filename, h5py.Group):
|
||||
group = group_or_filename
|
||||
else:
|
||||
h5file = h5py.File(group_or_filename, 'r')
|
||||
group = list(h5file.values())[0]
|
||||
|
||||
name = group.name[1:]
|
||||
atomic_weight_ratio = group.attrs['atomic_weight_ratio']
|
||||
kTg = group['kTs']
|
||||
kTs = []
|
||||
for temp in kTg:
|
||||
kTs.append(kTg[temp].value)
|
||||
temperatures = [str(int(round(kT / K_BOLTZMANN))) + "K" for kT in kTs]
|
||||
|
||||
table = cls(name, atomic_weight_ratio, kTs)
|
||||
table.nuclides = [nuc.decode() for nuc in group.attrs['nuclides']]
|
||||
table.secondary_mode = group.attrs['secondary_mode'].decode()
|
||||
|
||||
# Read thermal elastic scattering
|
||||
for T in temperatures:
|
||||
Tgroup = group[T]
|
||||
if 'elastic' in Tgroup:
|
||||
elastic_group = Tgroup['elastic']
|
||||
|
||||
# Cross section
|
||||
elastic_xs_type = elastic_group['xs'].attrs['type'].decode()
|
||||
if elastic_xs_type == 'Tabulated1D':
|
||||
table.elastic_xs[T] = \
|
||||
Tabulated1D.from_hdf5(elastic_group['xs'])
|
||||
elif elastic_xs_type == 'bragg':
|
||||
table.elastic_xs[T] = \
|
||||
CoherentElastic.from_hdf5(elastic_group['xs'])
|
||||
|
||||
# Angular distribution
|
||||
if 'mu_out' in elastic_group:
|
||||
table.elastic_mu_out[T] = \
|
||||
elastic_group['mu_out'].value
|
||||
|
||||
# Read thermal inelastic scattering
|
||||
if 'inelastic' in Tgroup:
|
||||
inelastic_group = Tgroup['inelastic']
|
||||
table.inelastic_xs[T] = \
|
||||
Tabulated1D.from_hdf5(inelastic_group['xs'])
|
||||
if table.secondary_mode in ('equal', 'skewed'):
|
||||
table.inelastic_e_out[T] = \
|
||||
inelastic_group['energy_out']
|
||||
table.inelastic_mu_out[T] = \
|
||||
inelastic_group['mu_out']
|
||||
elif table.secondary_mode == 'continuous':
|
||||
table.inelastic_dist[T] = \
|
||||
AngleEnergy.from_hdf5(inelastic_group)
|
||||
|
||||
return table
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace_or_filename, name=None):
|
||||
"""Generate thermal scattering data from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace_or_filename : openmc.data.ace.Table or str
|
||||
ACE table to read from. If given as a string, it is assumed to be
|
||||
the filename for the ACE file.
|
||||
name : str
|
||||
GND-conforming name of the material, e.g. c_H_in_H2O. If none is
|
||||
passed, the appropriate name is guessed based on the name of the ACE
|
||||
table.
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ThermalScattering
|
||||
Thermal scattering data
|
||||
|
||||
"""
|
||||
if isinstance(ace_or_filename, Table):
|
||||
ace = ace_or_filename
|
||||
else:
|
||||
ace = get_table(ace_or_filename)
|
||||
|
||||
# Get new name that is GND-consistent
|
||||
ace_name, xs = ace.name.split('.')
|
||||
if name is None:
|
||||
if ace_name.lower() in _THERMAL_NAMES:
|
||||
name = _THERMAL_NAMES[ace_name.lower()]
|
||||
else:
|
||||
# Make an educated guess?? This actually works well for JEFF-3.2
|
||||
# which stupidly uses names like lw00.32t, lw01.32t, etc. for
|
||||
# different temperatures
|
||||
matches = get_close_matches(
|
||||
ace_name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5)
|
||||
if len(matches) > 0:
|
||||
name = _THERMAL_NAMES[matches[0]]
|
||||
else:
|
||||
# OK, we give up. Just use the ACE name.
|
||||
name = 'c_' + ace.name
|
||||
warn('Thermal scattering material "{}" is not recognized. '
|
||||
'Assigning a name of {}.'.format(ace.name, name))
|
||||
|
||||
# Assign temperature to the running list
|
||||
kTs = [ace.temperature]
|
||||
temperatures = [str(int(round(ace.temperature / K_BOLTZMANN))) + "K"]
|
||||
|
||||
table = cls(name, ace.atomic_weight_ratio, kTs)
|
||||
|
||||
# Incoherent inelastic scattering cross section
|
||||
idx = ace.jxs[1]
|
||||
n_energy = int(ace.xss[idx])
|
||||
energy = ace.xss[idx+1 : idx+1+n_energy]
|
||||
xs = ace.xss[idx+1+n_energy : idx+1+2*n_energy]
|
||||
table.inelastic_xs[temperatures[0]] = Tabulated1D(energy, xs)
|
||||
|
||||
if ace.nxs[7] == 0:
|
||||
table.secondary_mode = 'equal'
|
||||
elif ace.nxs[7] == 1:
|
||||
table.secondary_mode = 'skewed'
|
||||
elif ace.nxs[7] == 2:
|
||||
table.secondary_mode = 'continuous'
|
||||
|
||||
n_energy_out = ace.nxs[4]
|
||||
if table.secondary_mode in ('equal', 'skewed'):
|
||||
n_mu = ace.nxs[3]
|
||||
idx = ace.jxs[3]
|
||||
table.inelastic_e_out[temperatures[0]] = \
|
||||
ace.xss[idx:idx + n_energy * n_energy_out * (n_mu + 2):
|
||||
n_mu + 2]
|
||||
table.inelastic_e_out[temperatures[0]].shape = \
|
||||
(n_energy, n_energy_out)
|
||||
|
||||
table.inelastic_mu_out[temperatures[0]] = \
|
||||
ace.xss[idx:idx + n_energy * n_energy_out * (n_mu + 2)]
|
||||
table.inelastic_mu_out[temperatures[0]].shape = \
|
||||
(n_energy, n_energy_out, n_mu+2)
|
||||
table.inelastic_mu_out[temperatures[0]] = \
|
||||
table.inelastic_mu_out[temperatures[0]][:, :, 1:]
|
||||
else:
|
||||
n_mu = ace.nxs[3] - 1
|
||||
idx = ace.jxs[3]
|
||||
locc = ace.xss[idx:idx + n_energy].astype(int)
|
||||
n_energy_out = \
|
||||
ace.xss[idx + n_energy:idx + 2 * n_energy].astype(int)
|
||||
energy_out = []
|
||||
mu_out = []
|
||||
for i in range(n_energy):
|
||||
idx = locc[i]
|
||||
|
||||
# Outgoing energy distribution for incoming energy i
|
||||
e = ace.xss[idx + 1:idx + 1 + n_energy_out[i]*(n_mu + 3):
|
||||
n_mu + 3]
|
||||
p = ace.xss[idx + 2:idx + 2 + n_energy_out[i]*(n_mu + 3):
|
||||
n_mu + 3]
|
||||
c = ace.xss[idx + 3:idx + 3 + n_energy_out[i]*(n_mu + 3):
|
||||
n_mu + 3]
|
||||
eout_i = Tabular(e, p, 'linear-linear', ignore_negative=True)
|
||||
eout_i.c = c
|
||||
|
||||
# Outgoing angle distribution for each
|
||||
# (incoming, outgoing) energy pair
|
||||
mu_i = []
|
||||
for j in range(n_energy_out[i]):
|
||||
mu = ace.xss[idx + 4:idx + 4 + n_mu]
|
||||
p_mu = 1. / n_mu * np.ones(n_mu)
|
||||
mu_ij = Discrete(mu, p_mu)
|
||||
mu_ij.c = np.cumsum(p_mu)
|
||||
mu_i.append(mu_ij)
|
||||
idx += 3 + n_mu
|
||||
|
||||
energy_out.append(eout_i)
|
||||
mu_out.append(mu_i)
|
||||
|
||||
# Create correlated angle-energy distribution
|
||||
breakpoints = [n_energy]
|
||||
interpolation = [2]
|
||||
energy = table.inelastic_xs[temperatures[0]].x
|
||||
table.inelastic_dist[temperatures[0]] = CorrelatedAngleEnergy(
|
||||
breakpoints, interpolation, energy, energy_out, mu_out)
|
||||
|
||||
# Incoherent/coherent elastic scattering cross section
|
||||
idx = ace.jxs[4]
|
||||
if idx != 0:
|
||||
n_energy = int(ace.xss[idx])
|
||||
energy = ace.xss[idx + 1: idx + 1 + n_energy]
|
||||
P = ace.xss[idx + 1 + n_energy: idx + 1 + 2 * n_energy]
|
||||
|
||||
if ace.nxs[5] == 4:
|
||||
table.elastic_xs[temperatures[0]] = CoherentElastic(energy, P)
|
||||
else:
|
||||
table.elastic_xs[temperatures[0]] = Tabulated1D(energy, P)
|
||||
|
||||
# Angular distribution
|
||||
n_mu = ace.nxs[6]
|
||||
if n_mu != -1:
|
||||
idx = ace.jxs[6]
|
||||
table.elastic_mu_out[temperatures[0]] = \
|
||||
ace.xss[idx:idx + n_energy * n_mu]
|
||||
table.elastic_mu_out[temperatures[0]].shape = \
|
||||
(n_energy, n_mu)
|
||||
|
||||
# Get relevant nuclides
|
||||
for zaid, awr in ace.pairs:
|
||||
if zaid > 0:
|
||||
Z, A = divmod(zaid, 1000)
|
||||
table.nuclides.append(ATOMIC_SYMBOL[Z] + str(A))
|
||||
|
||||
return table
|
||||
95
openmc/data/uncorrelated.py
Normal file
95
openmc/data/uncorrelated.py
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from .angle_energy import AngleEnergy
|
||||
from .energy_distribution import EnergyDistribution
|
||||
from .angle_distribution import AngleDistribution
|
||||
|
||||
|
||||
class UncorrelatedAngleEnergy(AngleEnergy):
|
||||
"""Uncorrelated angle-energy distribution
|
||||
|
||||
Parameters
|
||||
----------
|
||||
angle : openmc.data.AngleDistribution
|
||||
Distribution of outgoing angles represented as scattering cosines
|
||||
energy : openmc.data.EnergyDistribution
|
||||
Distribution of outgoing energies
|
||||
|
||||
Attributes
|
||||
----------
|
||||
angle : openmc.data.AngleDistribution
|
||||
Distribution of outgoing angles represented as scattering cosines
|
||||
energy : openmc.data.EnergyDistribution
|
||||
Distribution of outgoing energies
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, angle=None, energy=None):
|
||||
self._angle = None
|
||||
self._energy = None
|
||||
|
||||
if angle is not None:
|
||||
self.angle = angle
|
||||
if energy is not None:
|
||||
self.energy = energy
|
||||
|
||||
@property
|
||||
def angle(self):
|
||||
return self._angle
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@angle.setter
|
||||
def angle(self, angle):
|
||||
cv.check_type('uncorrelated angle distribution', angle,
|
||||
AngleDistribution)
|
||||
self._angle = angle
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('uncorrelated energy distribution', energy,
|
||||
EnergyDistribution)
|
||||
self._energy = energy
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write distribution to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['type'] = np.string_('uncorrelated')
|
||||
if self.angle is not None:
|
||||
angle_group = group.create_group('angle')
|
||||
self.angle.to_hdf5(angle_group)
|
||||
|
||||
if self.energy is not None:
|
||||
energy_group = group.create_group('energy')
|
||||
self.energy.to_hdf5(energy_group)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate uncorrelated angle-energy distribution from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.UncorrelatedAngleEnergy
|
||||
Uncorrelated angle-energy distribution
|
||||
|
||||
"""
|
||||
dist = cls()
|
||||
if 'angle' in group:
|
||||
dist.angle = AngleDistribution.from_hdf5(group['angle'])
|
||||
if 'energy' in group:
|
||||
dist.energy = EnergyDistribution.from_hdf5(group['energy'])
|
||||
return dist
|
||||
211
openmc/data/urr.py
Normal file
211
openmc/data/urr.py
Normal file
|
|
@ -0,0 +1,211 @@
|
|||
from collections import Iterable
|
||||
from numbers import Integral, Real
|
||||
|
||||
import numpy as np
|
||||
|
||||
import openmc.checkvalue as cv
|
||||
from openmc.mixin import EqualityMixin
|
||||
|
||||
|
||||
class ProbabilityTables(EqualityMixin):
|
||||
r"""Unresolved resonance region probability tables.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
energy : Iterable of float
|
||||
Energies in MeV at which probability tables exist
|
||||
table : numpy.ndarray
|
||||
Probability tables for each energy. This array is of shape (N, 6, M)
|
||||
where N is the number of energies and M is the number of bands. The
|
||||
second dimension indicates whether the value is for the cumulative
|
||||
probability (0), total (1), elastic (2), fission (3), :math:`(n,\gamma)`
|
||||
(4), or heating number (5).
|
||||
interpolation : {2, 5}
|
||||
Interpolation scheme between tables
|
||||
inelastic_flag : int
|
||||
A value less than zero indicates that the inelastic cross section is
|
||||
zero within the unresolved energy range. A value greater than zero
|
||||
indicates the MT number for a reaction whose cross section is to be used
|
||||
in the unresolved range.
|
||||
absorption_flag : int
|
||||
A value less than zero indicates that the "other absorption" cross
|
||||
section is zero within the unresolved energy range. A value greater than
|
||||
zero indicates the MT number for a reaction whose cross section is to be
|
||||
used in the unresolved range.
|
||||
multiply_smooth : bool
|
||||
Indicate whether probability table values are cross sections (False) or
|
||||
whether they must be multiply by the corresponding "smooth" cross
|
||||
sections (True).
|
||||
|
||||
Attributes
|
||||
----------
|
||||
energy : Iterable of float
|
||||
Energies in MeV at which probability tables exist
|
||||
table : numpy.ndarray
|
||||
Probability tables for each energy. This array is of shape (N, 6, M)
|
||||
where N is the number of energies and M is the number of bands. The
|
||||
second dimension indicates whether the value is for the cumulative
|
||||
probability (0), total (1), elastic (2), fission (3), :math:`(n,\gamma)`
|
||||
(4), or heating number (5).
|
||||
interpolation : {2, 5}
|
||||
Interpolation scheme between tables
|
||||
inelastic_flag : int
|
||||
A value less than zero indicates that the inelastic cross section is
|
||||
zero within the unresolved energy range. A value greater than zero
|
||||
indicates the MT number for a reaction whose cross section is to be used
|
||||
in the unresolved range.
|
||||
absorption_flag : int
|
||||
A value less than zero indicates that the "other absorption" cross
|
||||
section is zero within the unresolved energy range. A value greater than
|
||||
zero indicates the MT number for a reaction whose cross section is to be
|
||||
used in the unresolved range.
|
||||
multiply_smooth : bool
|
||||
Indicate whether probability table values are cross sections (False) or
|
||||
whether they must be multiply by the corresponding "smooth" cross
|
||||
sections (True).
|
||||
"""
|
||||
|
||||
def __init__(self, energy, table, interpolation, inelastic_flag=-1,
|
||||
absorption_flag=-1, multiply_smooth=False):
|
||||
self.energy = energy
|
||||
self.table = table
|
||||
self.interpolation = interpolation
|
||||
self.inelastic_flag = inelastic_flag
|
||||
self.absorption_flag = absorption_flag
|
||||
self.multiply_smooth = multiply_smooth
|
||||
|
||||
@property
|
||||
def absorption_flag(self):
|
||||
return self._absorption_flag
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self._energy
|
||||
|
||||
@property
|
||||
def inelastic_flag(self):
|
||||
return self._inelastic_flag
|
||||
|
||||
@property
|
||||
def interpolation(self):
|
||||
return self._interpolation
|
||||
|
||||
@property
|
||||
def multiply_smooth(self):
|
||||
return self._multiply_smooth
|
||||
|
||||
@property
|
||||
def table(self):
|
||||
return self._table
|
||||
|
||||
@absorption_flag.setter
|
||||
def absorption_flag(self, absorption_flag):
|
||||
cv.check_type('absorption flag', absorption_flag, Integral)
|
||||
self._absorption_flag = absorption_flag
|
||||
|
||||
@energy.setter
|
||||
def energy(self, energy):
|
||||
cv.check_type('probability table energies', energy, Iterable, Real)
|
||||
self._energy = energy
|
||||
|
||||
@inelastic_flag.setter
|
||||
def inelastic_flag(self, inelastic_flag):
|
||||
cv.check_type('inelastic flag', inelastic_flag, Integral)
|
||||
self._inelastic_flag = inelastic_flag
|
||||
|
||||
@interpolation.setter
|
||||
def interpolation(self, interpolation):
|
||||
cv.check_value('interpolation', interpolation, [2, 5])
|
||||
self._interpolation = interpolation
|
||||
|
||||
@multiply_smooth.setter
|
||||
def multiply_smooth(self, multiply_smooth):
|
||||
cv.check_type('multiply by smooth', multiply_smooth, bool)
|
||||
self._multiply_smooth = multiply_smooth
|
||||
|
||||
@table.setter
|
||||
def table(self, table):
|
||||
cv.check_type('probability tables', table, np.ndarray)
|
||||
self._table = table
|
||||
|
||||
def to_hdf5(self, group):
|
||||
"""Write probability tables to an HDF5 group
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to write to
|
||||
|
||||
"""
|
||||
group.attrs['interpolation'] = self.interpolation
|
||||
group.attrs['inelastic'] = self.inelastic_flag
|
||||
group.attrs['absorption'] = self.absorption_flag
|
||||
group.attrs['multiply_smooth'] = int(self.multiply_smooth)
|
||||
|
||||
group.create_dataset('energy', data=self.energy)
|
||||
group.create_dataset('table', data=self.table)
|
||||
|
||||
@classmethod
|
||||
def from_hdf5(cls, group):
|
||||
"""Generate probability tables from HDF5 data
|
||||
|
||||
Parameters
|
||||
----------
|
||||
group : h5py.Group
|
||||
HDF5 group to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ProbabilityTables
|
||||
Probability tables
|
||||
|
||||
"""
|
||||
interpolation = group.attrs['interpolation']
|
||||
inelastic_flag = group.attrs['inelastic']
|
||||
absorption_flag = group.attrs['absorption']
|
||||
multiply_smooth = bool(group.attrs['multiply_smooth'])
|
||||
|
||||
energy = group['energy'].value
|
||||
table = group['table'].value
|
||||
|
||||
return cls(energy, table, interpolation, inelastic_flag,
|
||||
absorption_flag, multiply_smooth)
|
||||
|
||||
@classmethod
|
||||
def from_ace(cls, ace):
|
||||
"""Generate probability tables from an ACE table
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ace : openmc.data.ace.Table
|
||||
ACE table to read from
|
||||
|
||||
Returns
|
||||
-------
|
||||
openmc.data.ProbabilityTables
|
||||
Unresolved resonance region probability tables
|
||||
|
||||
"""
|
||||
# Check if URR probability tables are present
|
||||
idx = ace.jxs[23]
|
||||
if idx == 0:
|
||||
return None
|
||||
|
||||
N = int(ace.xss[idx]) # Number of incident energies
|
||||
M = int(ace.xss[idx+1]) # Length of probability table
|
||||
interpolation = int(ace.xss[idx+2])
|
||||
inelastic_flag = int(ace.xss[idx+3])
|
||||
absorption_flag = int(ace.xss[idx+4])
|
||||
multiply_smooth = (int(ace.xss[idx+5]) == 1)
|
||||
idx += 6
|
||||
|
||||
# Get energies at which tables exist
|
||||
energy = ace.xss[idx : idx+N]
|
||||
idx += N
|
||||
|
||||
# Get probability tables
|
||||
table = ace.xss[idx : idx+N*6*M]
|
||||
table.shape = (N, 6, M)
|
||||
|
||||
return cls(energy, table, interpolation, inelastic_flag,
|
||||
absorption_flag, multiply_smooth)
|
||||
|
|
@ -1,13 +1,15 @@
|
|||
import re
|
||||
import sys
|
||||
|
||||
import openmc
|
||||
from openmc.checkvalue import check_type, check_length
|
||||
from openmc.data import natural_abundance
|
||||
from openmc.data import NATURAL_ABUNDANCE
|
||||
|
||||
if sys.version_info[0] >= 3:
|
||||
basestring = str
|
||||
|
||||
|
||||
|
||||
class Element(object):
|
||||
"""A natural element used in a material via <element>. Internally, OpenMC will
|
||||
expand the natural element into isotopes based on the known natural
|
||||
|
|
@ -17,37 +19,27 @@ class Element(object):
|
|||
----------
|
||||
name : str
|
||||
Chemical symbol of the element, e.g. Pu
|
||||
xs : str
|
||||
Cross section identifier, e.g. 71c
|
||||
|
||||
Attributes
|
||||
----------
|
||||
name : str
|
||||
Chemical symbol of the element, e.g. Pu
|
||||
xs : str
|
||||
Cross section identifier, e.g. 71c
|
||||
scattering : {'data', 'iso-in-lab', None}
|
||||
The type of angular scattering distribution to use
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, name='', xs=None):
|
||||
def __init__(self, name=''):
|
||||
# Initialize class attributes
|
||||
self._name = ''
|
||||
self._xs = None
|
||||
self._scattering = None
|
||||
|
||||
# Set class attributes
|
||||
self.name = name
|
||||
|
||||
if xs is not None:
|
||||
self.xs = xs
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, Element):
|
||||
if self._name != other._name:
|
||||
return False
|
||||
elif self._xs != other._xs:
|
||||
if self.name != other.name:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
|
@ -68,22 +60,14 @@ class Element(object):
|
|||
def __hash__(self):
|
||||
return hash(repr(self))
|
||||
|
||||
def __hash__(self):
|
||||
return hash(repr(self))
|
||||
|
||||
def __repr__(self):
|
||||
string = 'Element - {0}\n'.format(self._name)
|
||||
string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs)
|
||||
if self.scattering is not None:
|
||||
string += '{0: <16}{1}{2}\n'.format('\tscattering', '=\t',
|
||||
self.scattering)
|
||||
|
||||
return string
|
||||
|
||||
@property
|
||||
def xs(self):
|
||||
return self._xs
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self._name
|
||||
|
|
@ -92,11 +76,6 @@ class Element(object):
|
|||
def scattering(self):
|
||||
return self._scattering
|
||||
|
||||
@xs.setter
|
||||
def xs(self, xs):
|
||||
check_type('cross section identifier', xs, basestring)
|
||||
self._xs = xs
|
||||
|
||||
@name.setter
|
||||
def name(self, name):
|
||||
check_type('element name', name, basestring)
|
||||
|
|
@ -126,8 +105,8 @@ class Element(object):
|
|||
"""
|
||||
|
||||
isotopes = []
|
||||
for isotope, abundance in natural_abundance.items():
|
||||
if isotope.startswith(self.name):
|
||||
nuc = openmc.Nuclide(isotope, self.xs)
|
||||
for isotope, abundance in sorted(NATURAL_ABUNDANCE.items()):
|
||||
if re.match(r'{}\d+'.format(self.name), isotope):
|
||||
nuc = openmc.Nuclide(isotope)
|
||||
isotopes.append((nuc, abundance))
|
||||
return isotopes
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import sys
|
|||
import numpy as np
|
||||
|
||||
from openmc import Mesh
|
||||
from openmc.summary import Summary
|
||||
import openmc.checkvalue as cv
|
||||
|
||||
|
||||
|
|
@ -18,6 +17,13 @@ _FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface',
|
|||
'mesh', 'energy', 'energyout', 'mu', 'polar', 'azimuthal',
|
||||
'distribcell', 'delayedgroup']
|
||||
|
||||
_CURRENT_NAMES = {1: 'x-min out', 2: 'x-min in',
|
||||
3: 'x-max out', 4: 'x-max in',
|
||||
5: 'y-min out', 6: 'y-min in',
|
||||
7: 'y-max out', 8: 'y-max in',
|
||||
9: 'z-min out', 10: 'z-min in',
|
||||
11: 'z-max out', 12: 'z-max in'}
|
||||
|
||||
class Filter(object):
|
||||
"""A filter used to constrain a tally to a specific criterion, e.g. only
|
||||
tally events when the particle is in a certain cell and energy range.
|
||||
|
|
@ -104,27 +110,6 @@ class Filter(object):
|
|||
def __hash__(self):
|
||||
return hash(repr(self))
|
||||
|
||||
def __deepcopy__(self, memo):
|
||||
existing = memo.get(id(self))
|
||||
|
||||
# If this is the first time we have tried to copy this object, create a copy
|
||||
if existing is None:
|
||||
clone = type(self).__new__(type(self))
|
||||
clone._type = self.type
|
||||
clone._bins = copy.deepcopy(self.bins, memo)
|
||||
clone._num_bins = self.num_bins
|
||||
clone._mesh = copy.deepcopy(self.mesh, memo)
|
||||
clone._stride = self.stride
|
||||
clone._distribcell_paths = copy.deepcopy(self.distribcell_paths)
|
||||
|
||||
memo[id(self)] = clone
|
||||
|
||||
return clone
|
||||
|
||||
# If this object has been copied before, return the first copy made
|
||||
else:
|
||||
return existing
|
||||
|
||||
def __repr__(self):
|
||||
string = 'Filter\n'
|
||||
string += '{0: <16}{1}{2}\n'.format('\tType', '=\t', self.type)
|
||||
|
|
@ -184,6 +169,11 @@ class Filter(object):
|
|||
if not isinstance(bins, Iterable):
|
||||
bins = [bins]
|
||||
|
||||
# If the bin is 0D numpy array, promote to 1D
|
||||
elif isinstance(bins, np.ndarray):
|
||||
if bins.shape == ():
|
||||
bins.shape = (1,)
|
||||
|
||||
# If the bins are in a collection, convert it to a list
|
||||
else:
|
||||
bins = list(bins)
|
||||
|
|
@ -196,7 +186,7 @@ class Filter(object):
|
|||
|
||||
elif self.type in ['energy', 'energyout']:
|
||||
for edge in bins:
|
||||
if not cv._isinstance(edge, Real):
|
||||
if not isinstance(edge, Real):
|
||||
msg = 'Unable to add bin edge "{0}" to a "{1}" Filter ' \
|
||||
'since it is a non-integer or floating point ' \
|
||||
'value'.format(edge, self.type)
|
||||
|
|
@ -220,7 +210,7 @@ class Filter(object):
|
|||
msg = 'Unable to add bins "{0}" to a mesh Filter since ' \
|
||||
'only a single mesh can be used per tally'.format(bins)
|
||||
raise ValueError(msg)
|
||||
elif not cv._isinstance(bins[0], Integral):
|
||||
elif not isinstance(bins[0], Integral):
|
||||
msg = 'Unable to add bin "{0}" to mesh Filter since it ' \
|
||||
'is a non-integer'.format(bins[0])
|
||||
raise ValueError(msg)
|
||||
|
|
@ -393,7 +383,7 @@ class Filter(object):
|
|||
cell instance ID for 'distribcell' Filters. The bin is a 2-tuple of
|
||||
floats for 'energy' and 'energyout' filters corresponding to the
|
||||
energy boundaries of the bin of interest. The bin is an (x,y,z)
|
||||
3-tuple for 'mesh' filters corresponding to the mesh cell
|
||||
3-tuple for 'mesh' filters corresponding to the mesh cell of
|
||||
interest.
|
||||
|
||||
Returns
|
||||
|
|
@ -412,7 +402,7 @@ class Filter(object):
|
|||
if self.type == 'mesh':
|
||||
# Convert (x,y,z) to a single bin -- this is similar to
|
||||
# subroutine mesh_indices_to_bin in openmc/src/mesh.F90.
|
||||
if (len(self.mesh.dimension) == 3):
|
||||
if len(self.mesh.dimension) == 3:
|
||||
nx, ny, nz = self.mesh.dimension
|
||||
val = (filter_bin[0] - 1) * ny * nz + \
|
||||
(filter_bin[1] - 1) * nz + \
|
||||
|
|
@ -585,11 +575,11 @@ class Filter(object):
|
|||
# Initialize dictionary to build Pandas Multi-index column
|
||||
filter_dict = {}
|
||||
|
||||
# Append Mesh ID as outermost index of mult-index
|
||||
# Append Mesh ID as outermost index of multi-index
|
||||
mesh_key = 'mesh {0}'.format(self.mesh.id)
|
||||
|
||||
# Find mesh dimensions - use 3D indices for simplicity
|
||||
if (len(self.mesh.dimension) == 3):
|
||||
if len(self.mesh.dimension) == 3:
|
||||
nx, ny, nz = self.mesh.dimension
|
||||
else:
|
||||
nx, ny = self.mesh.dimension
|
||||
|
|
@ -794,6 +784,13 @@ class Filter(object):
|
|||
df.loc[:, self.type + ' low'] = lo_bins
|
||||
df.loc[:, self.type + ' high'] = hi_bins
|
||||
|
||||
elif self.type == 'surface':
|
||||
filter_bins = np.repeat(self.bins, self.stride)
|
||||
tile_factor = data_size / len(filter_bins)
|
||||
filter_bins = np.tile(filter_bins, tile_factor)
|
||||
filter_bins = [_CURRENT_NAMES[x] for x in filter_bins]
|
||||
df = pd.concat([df, pd.DataFrame({self.type : filter_bins})])
|
||||
|
||||
# universe, material, surface, cell, and cellborn filters
|
||||
else:
|
||||
filter_bins = np.repeat(self.bins, self.stride)
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue