diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index eebe6bfc14..19a0d620d5 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -182,6 +182,29 @@ performed. It has the following attributes/sub-elements: *Default*: None +.. _natural_elements: + +```` Element +------------------------------ + +The ```` element indicates to OpenMC what nuclides are +available in the cross section library when expanding an ```` into +separate isotopes (see :ref:`material`). The accepted values are: + + - ENDF/B-VII.0 + - ENDF/B-VII.1 + - JEFF-3.1.1 + - JEFF-3.1.2 + - JEFF-3.2 + - JENDL-3.2 + - JENDL-3.3 + - JENDL-4.0 + +Note that the value is case-insensitive, so "ENDF/B-VII.1" is equivalent to +"endf/b-vii.1". + + *Default*: ENDF/B-VII.1 + ```` Element ----------------------- @@ -741,6 +764,8 @@ sub-elements: Materials Specification -- materials.xml ---------------------------------------- +.. _material: + ```` Element ---------------------- @@ -780,12 +805,13 @@ Each ``material`` element can have the following attributes or sub-elements: :element: Specifies that a natural element is present in the material. The natural - element is split up into individual isotopes based on IUPAC Isotopic - Compositions of the Elements 1997. This element has attributes/sub-elements - called ``name``, ``xs``, and ``ao``. The ``name`` attribute is the atomic - symbol of the element while the ``xs`` attribute is the cross-section - identifier. Finally, the ``ao`` attribute specifies the atom percent of the - element within the material, respectively. One example would be as follows: + element is split up into individual isotopes based on `IUPAC Isotopic + Compositions of the Elements 2009`_. This element has + attributes/sub-elements called ``name``, ``xs``, and ``ao``. The ``name`` + attribute is the atomic symbol of the element while the ``xs`` attribute is + the cross-section identifier. Finally, the ``ao`` attribute specifies the + atom percent of the element within the material, respectively. One example + would be as follows: .. code-block:: xml @@ -794,6 +820,10 @@ Each ``material`` element can have the following attributes or sub-elements: + In some cross section libraries, certain naturally occurring isotopes do not + have cross sections. The :ref:`natural_elements` option determines how a + natural element is split into isotopes in these cases. + *Default*: None @@ -805,6 +835,9 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: None +.. _IUPAC Isotopic Compositions of the Elements 2009: + http://pac.iupac.org/publications/pac/pdf/2011/pdf/8302x0397.pdf + ```` Element ------------------------ diff --git a/src/constants.F90 b/src/constants.F90 index ef0d7c8ef3..db22f74cda 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -244,6 +244,17 @@ module constants ! Maximum number of partial fission reactions integer, parameter :: PARTIAL_FISSION_MAX = 4 + ! Major cross section libraries + integer, parameter :: & + ENDF_BVII0 = 1, & + ENDF_BVII1 = 2, & + JEFF_311 = 3, & + JEFF_312 = 4, & + JEFF_32 = 5, & + JENDL_32 = 6, & + JENDL_33 = 7, & + JENDL_40 = 8 + ! ============================================================================ ! TALLY-RELATED CONSTANTS diff --git a/src/global.F90 b/src/global.F90 index 515b774bf9..57e849b955 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -88,6 +88,9 @@ module global ! Default xs identifier (e.g. 70c) character(3):: default_xs + ! What to assume for expanding natural elements + integer :: default_expand = ENDF_BVII1 + ! ============================================================================ ! TALLY-RELATED VARIABLES diff --git a/src/input_xml.F90 b/src/input_xml.F90 index b6ac4ae6c3..efee036149 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -778,6 +778,33 @@ contains end if end if + ! Natural element expansion option + if (check_for_node(doc, "natural_elements")) then + call get_node_value(doc, "natural_elements", temp_str) + call lower_case(temp_str) + select case (temp_str) + case ('endf/b-vii.0') + default_expand = ENDF_BVII0 + case ('endf/b-vii.1') + default_expand = ENDF_BVII1 + case ('jeff-3.1.1') + default_expand = JEFF_311 + case ('jeff-3.1.2') + default_expand = JEFF_312 + case ('jeff-3.2') + default_expand = JEFF_32 + case ('jendl-3.2') + default_expand = JENDL_32 + case ('jendl-3.3') + default_expand = JENDL_33 + case ('jendl-4.0') + default_expand = JENDL_40 + case default + message = "Unknown natural element expansion option: " // trim(temp_str) + call fatal_error() + end select + end if + ! Close settings XML file call close_xmldoc(doc) @@ -3116,8 +3143,7 @@ contains call list_density % append(density * 0.801_8) case ('c') - ! The evaluation of Carbon in ENDF/B-VII.1 and JEFF 3.1.2 is a natural - ! element, i.e. it's not possible to split into C-12 and C-13. + ! No evaluations split up Carbon into isotopes yet call list_names % append('6000.' // xs) call list_density % append(density) @@ -3128,12 +3154,22 @@ contains call list_density % append(density * 0.00364_8) case ('o') - ! O-18 does not exist in ENDF/B-VII.1 or JEFF 3.1.2 so its 0.205% has been - ! added to O-16. The isotopic abundance for O-16 is ordinarily 99.757%. - call list_names % append('8016.' // xs) - call list_density % append(density * 0.99962_8) - call list_names % append('8017.' // xs) - call list_density % append(density * 0.00038_8) + if (default_expand == JEFF_32) then + call list_names % append('8016.' // xs) + call list_density % append(density * 0.99757_8) + call list_names % append('8017.' // xs) + call list_density % append(density * 0.00038_8) + call list_names % append('8018.' // xs) + call list_density % append(density * 0.00205_8) + elseif (default_expand >= JENDL_32 .and. default_expand <= JENDL_40) then + call list_names % append('8016.' // xs) + call list_density % append(density) + else + call list_names % append('8016.' // xs) + call list_density % append(density * 0.99962_8) + call list_names % append('8017.' // xs) + call list_density % append(density * 0.00038_8) + end if case ('f') call list_names % append('9019.' // xs) @@ -3238,13 +3274,17 @@ contains call list_density % append(density * 0.0518_8) case ('v') - ! The evaluation of Vanadium in ENDF/B-VII.1 and JEFF 3.1.2 is a natural - ! element. The IUPAC isotopic composition specifies the following - ! breakdown which is not used: - ! V-50 = 0.250% - ! V-51 = 99.750% - call list_names % append('23000.' // xs) - call list_density % append(density) + if (default_expand == ENDF_BVII0 .or. default_expand == JEFF_311 & + .or. default_expand == JEFF_32 .or. & + (default_expand >= JENDL_32 .and. default_expand <= JENDL_33)) then + call list_names % append('23000.' // xs) + call list_density % append(density) + else + call list_names % append('23050.' // xs) + call list_density % append(density * 0.0025_8) + call list_names % append('23051.' // xs) + call list_density % append(density * 0.9975_8) + end if case ('cr') call list_names % append('24050.' // xs) @@ -3293,24 +3333,33 @@ contains call list_density % append(density * 0.3085_8) case ('zn') - ! The evaluation of Zinc in ENDF/B-VII.1 is a natural element. The IUPAC - ! isotopic composition specifies the following breakdown which is not used - ! here: - ! Zn-64 = 48.63% - ! Zn-66 = 27.90% - ! Zn-67 = 4.10% - ! Zn-68 = 18.75% - ! Zn-70 = 0.62% - call list_names % append('30000.' // xs) - call list_density % append(density) + if (default_expand == ENDF_BVII0 .or. default_expand == & + JEFF_311 .or. default_expand == JEFF_312) then + call list_names % append('30000.' // xs) + call list_density % append(density) + else + call list_names % append('30064.' // xs) + call list_density % append(density * 0.4917_8) + call list_names % append('30066.' // xs) + call list_density % append(density * 0.2773_8) + call list_names % append('30067.' // xs) + call list_density % append(density * 0.0404_8) + call list_names % append('30068.' // xs) + call list_density % append(density * 0.1845_8) + call list_names % append('30070.' // xs) + call list_density % append(density * 0.0061_8) + end if case ('ga') - ! JEFF 3.1.2 does not have evaluations for Ga-69 and Ga-71, only for - ! natural Gallium, so this may cause problems. - call list_names % append('31069.' // xs) - call list_density % append(density * 0.60108_8) - call list_names % append('31071.' // xs) - call list_density % append(density * 0.39892_8) + if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then + call list_names % append('31000.' // xs) + call list_density % append(density) + else + call list_names % append('31069.' // xs) + call list_density % append(density * 0.60108_8) + call list_names % append('31071.' // xs) + call list_density % append(density * 0.39892_8) + end if case ('ge') call list_names % append('32070.' // xs) @@ -3721,24 +3770,43 @@ contains call list_density % append(density * 0.3508_8) case ('ta') - call list_names % append('73180.' // xs) - call list_density % append(density * 0.0001201_8) - call list_names % append('73181.' // xs) - call list_density % append(density * 0.9998799_8) + if (default_expand == ENDF_BVII0 .or. & + (default_expand >= JEFF_311 .and. default_expand <= JEFF_312) .or. & + (default_expand >= JENDL_32 .and. default_expand <= JENDL_40)) then + call list_names % append('73181.' // xs) + call list_density % append(density) + else + call list_names % append('73180.' // xs) + call list_density % append(density * 0.0001201_8) + call list_names % append('73181.' // xs) + call list_density % append(density * 0.9998799_8) + end if case ('w') - ! ENDF/B-VII.0 does not have W-180 so this may cause problems. However, it - ! has been added as of ENDF/B-VII.1 - call list_names % append('74180.' // xs) - call list_density % append(density * 0.0012_8) - call list_names % append('74182.' // xs) - call list_density % append(density * 0.2650_8) - call list_names % append('74183.' // xs) - call list_density % append(density * 0.1431_8) - call list_names % append('74184.' // xs) - call list_density % append(density * 0.3064_8) - call list_names % append('74186.' // xs) - call list_density % append(density * 0.2843_8) + if (default_expand == ENDF_BVII0 .or. default_expand == JEFF_311 & + .or. default_expand == JEFF_312 .or. & + (default_expand >= JENDL_32 .and. default_expand <= JENDL_33)) then + ! Combine W-180 with W-182 + call list_names % append('74182.' // xs) + call list_density % append(density * 0.2662_8) + call list_names % append('74183.' // xs) + call list_density % append(density * 0.1431_8) + call list_names % append('74184.' // xs) + call list_density % append(density * 0.3064_8) + call list_names % append('74186.' // xs) + call list_density % append(density * 0.2843_8) + else + call list_names % append('74180.' // xs) + call list_density % append(density * 0.0012_8) + call list_names % append('74182.' // xs) + call list_density % append(density * 0.2650_8) + call list_names % append('74183.' // xs) + call list_density % append(density * 0.1431_8) + call list_names % append('74184.' // xs) + call list_density % append(density * 0.3064_8) + call list_names % append('74186.' // xs) + call list_density % append(density * 0.2843_8) + end if case ('re') call list_names % append('75185.' // xs) @@ -3747,20 +3815,25 @@ contains call list_density % append(density * 0.6260_8) case ('os') - call list_names % append('76184.' // xs) - call list_density % append(density * 0.0002_8) - call list_names % append('76186.' // xs) - call list_density % append(density * 0.0159_8) - call list_names % append('76187.' // xs) - call list_density % append(density * 0.0196_8) - call list_names % append('76188.' // xs) - call list_density % append(density * 0.1324_8) - call list_names % append('76189.' // xs) - call list_density % append(density * 0.1615_8) - call list_names % append('76190.' // xs) - call list_density % append(density * 0.2626_8) - call list_names % append('76192.' // xs) - call list_density % append(density * 0.4078_8) + if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then + call list_names % append('76000.' // xs) + call list_density % append(density) + else + call list_names % append('76184.' // xs) + call list_density % append(density * 0.0002_8) + call list_names % append('76186.' // xs) + call list_density % append(density * 0.0159_8) + call list_names % append('76187.' // xs) + call list_density % append(density * 0.0196_8) + call list_names % append('76188.' // xs) + call list_density % append(density * 0.1324_8) + call list_names % append('76189.' // xs) + call list_density % append(density * 0.1615_8) + call list_names % append('76190.' // xs) + call list_density % append(density * 0.2626_8) + call list_names % append('76192.' // xs) + call list_density % append(density * 0.4078_8) + end if case ('ir') call list_names % append('77191.' // xs) @@ -3769,18 +3842,23 @@ contains call list_density % append(density * 0.627_8) case ('pt') - call list_names % append('78190.' // xs) - call list_density % append(density * 0.00012_8) - call list_names % append('78192.' // xs) - call list_density % append(density * 0.00782_8) - call list_names % append('78194.' // xs) - call list_density % append(density * 0.3286_8) - call list_names % append('78195.' // xs) - call list_density % append(density * 0.3378_8) - call list_names % append('78196.' // xs) - call list_density % append(density * 0.2521_8) - call list_names % append('78198.' // xs) - call list_density % append(density * 0.07356_8) + if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then + call list_names % append('78000.' // xs) + call list_density % append(density) + else + call list_names % append('78190.' // xs) + call list_density % append(density * 0.00012_8) + call list_names % append('78192.' // xs) + call list_density % append(density * 0.00782_8) + call list_names % append('78194.' // xs) + call list_density % append(density * 0.3286_8) + call list_names % append('78195.' // xs) + call list_density % append(density * 0.3378_8) + call list_names % append('78196.' // xs) + call list_density % append(density * 0.2521_8) + call list_names % append('78198.' // xs) + call list_density % append(density * 0.07356_8) + end if case ('au') call list_names % append('79197.' // xs) @@ -3803,10 +3881,15 @@ contains call list_density % append(density * 0.0687_8) case ('tl') - call list_names % append('81203.' // xs) - call list_density % append(density * 0.2952_8) - call list_names % append('81205.' // xs) - call list_density % append(density * 0.7048_8) + if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then + call list_names % append('81000.' // xs) + call list_density % append(density) + else + call list_names % append('81203.' // xs) + call list_density % append(density * 0.2952_8) + call list_names % append('81205.' // xs) + call list_density % append(density * 0.7048_8) + end if case ('pb') call list_names % append('82204.' // xs) diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index 58699a2a26..ea3ecabf54 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -38,6 +38,8 @@ element settings { attribute upper_right { list { xsd:double+ } }) }? & + element natural_elements { xsd:string { maxLength = "20" } }? & + element no_reduce { xsd:boolean }? & element output { diff --git a/tests/test_natural_element/settings.xml b/tests/test_natural_element/settings.xml index 4df1f124a6..f903c92e72 100644 --- a/tests/test_natural_element/settings.xml +++ b/tests/test_natural_element/settings.xml @@ -9,6 +9,8 @@ 400 + endf/b-vii.1 + box